久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3347|回復: 1
打印 上一主題 下一主題
收起左側

各種測壓差的傳感器通用代碼_實現的土壤濕度傳感器

[復制鏈接]
跳轉到指定樓層
樓主
我所說的土壤濕度傳感器主流的是yl-69型號的,但是我用的是fc-28型號;
型號看不懂的就別管了只管接線就行

傳感器接線:AO口接AIN0~3(自己選,自己設置通道0~3),DO口不接,(AO,DO二選一);
                    GND接GND   VCC接VCC                 ----------四線制

主要在單片機上使用I2C和AD轉換模塊
main函數代碼:
void main()
{
    unsigned char val;
    unsigned char str[10];

    EA = 1;            //開總中斷
    ConfigTimer0(10);  //配置T0定時10ms
    InitLcd1602();     //初始化液晶   
        LcdShowStr(0, 0, "Humidity:");  //顯示通道指示
        LcdShowStr(13,0,"%");

    while (1)
    {
        if (flag300ms)
        {
            flag300ms = 0;
            //顯示通道0的電壓
         /*   val = GetADCValue(0);     //獲取ADC通道0的轉換值
            ValueToString(str, val);  //轉為字符串格式的電壓值
            LcdShowStr(0, 1, str);    //顯示到液晶上 */
            //顯示通道1的電壓
            val = GetADCValue(1);
            ValueToString(str, val);
                                          disp_persent(str);
            LcdShowStr(6, 1, str);
            //顯示通道3的電壓
         /*   val = GetADCValue(3);
            ValueToString(str, val);
            LcdShowStr(12, 1, str);  */
        }
    }
}


1602顯示部分代碼:
void disp_persent(unsigned char *str){              //百分比顯示
              if(str[0]== 0x35)                   // 00%   5v
{
        LcdShowStr(11,0,"00")        ;
}
             else if(str[0] == 0x34)                   // 25%   4v
{
        LcdShowStr(11,0,"25")        ;
}
              else if(str[0] == 0x33)                   // 50%   3v
{
        LcdShowStr(11,0,"50")        ;
}
              else if(str[0] == 0x32)                   // 75%   2v
{
        LcdShowStr(11,0,"75")        ;
}
              else if(str[0] == 0x31)                   // 99%   1v
{
        LcdShowStr(11,0,"99")        ;
}
    /*else{
                        LcdShowStr(11,0,"xx")        ;
                }*/
}---------------------------------------------------------------------------------------------------------------------------------------------------
想了下
第一篇文章免費全部代碼貼上:
模塊是51單片機書的模塊代碼


3個.c文件
另外兩個自己書上復制粘貼進去
我貼main.c的代碼
/**各種電壓差傳感器都可以使用  單片機上使用的I2C傳輸數據;
    若傳上位機可以調用uart.c里面的configUart(9600);  //配置波特率9600
                        value =GetADCValue(1);
                ValueToString(str,value);
                send_string(str);
                delay();
                串口發送到上位機
*/
#include <reg52.h>


bit flag300ms = 1;       //300ms定時標志
unsigned char T0RH = 0;  //T0重載值的高字節
unsigned char T0RL = 0;  //T0重載值的低字節


void ConfigTimer0(unsigned int ms);
unsigned char GetADCValue(unsigned char chn);
void ValueToString(unsigned char *str, unsigned char val);
extern void I2CStart();
extern void I2CStop();
extern unsigned char I2CReadACK();
extern unsigned char I2CReadNAK();
extern bit I2CWrite(unsigned char dat);
extern void InitLcd1602();
extern void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);
void disp_persent(unsigned char *str);
         
void main()
{
    unsigned char val;
    unsigned char str[10];
   
    EA = 1;            //開總中斷
    ConfigTimer0(10);  //配置T0定時10ms
    InitLcd1602();     //初始化液晶   
        LcdShowStr(0, 0, "Humidity:");  //顯示通道指示
        LcdShowStr(13,0,"%");
   
    while (1)
    {
        if (flag300ms)
        {
            flag300ms = 0;
            //顯示通道0的電壓
         /*   val = GetADCValue(0);     //獲取ADC通道0的轉換值
            ValueToString(str, val);  //轉為字符串格式的電壓值
            LcdShowStr(0, 1, str);    //顯示到液晶上 */
            //顯示通道1的電壓
            val = GetADCValue(1);
            ValueToString(str, val);
                                          disp_persent(str);
            LcdShowStr(6, 1, str);
            //顯示通道3的電壓
         /*   val = GetADCValue(3);
            ValueToString(str, val);
            LcdShowStr(12, 1, str);  */
        }
    }
}


/* 讀取當前的ADC轉換值,chn-ADC通道號0~3 */
unsigned char GetADCValue(unsigned char chn)
{
    unsigned char val;
   
    I2CStart();
    if (!I2CWrite(0x48<<1))  //尋址PCF8591,如未應答,則停止操作并返回0
    {
        I2CStop();
        return 0;
    }
    I2CWrite(0x40|chn);        //寫入控制字節,選擇轉換通道
    I2CStart();
    I2CWrite((0x48<<1)|0x01);  //尋址PCF8591,指定后續為讀操作   
    I2CReadACK();              //先空讀一個字節,提供采樣轉換時間
    val = I2CReadNAK();        //讀取剛剛轉換完的值
    I2CStop();
   
    return val;
}
/* ADC轉換值轉為實際電壓值的字符串形式,str-字符串指針,val-AD轉換值 */
void ValueToString(unsigned char *str, unsigned char val)
{
    //電壓值=轉換結果*2.5V/255,式中的25隱含了一位十進制小數
    val = (val*50)/255;   //故意先乘10方便后面計算取余數   *10     //小數是不能存在unsigned char數據中的。                                                                 
    str[0] = (val/10) + '0';  //整數位字符                         //unsigned char是用來存字符的,本質是ascii碼值,也就是整數。
    str[1] = '.';             //小數點
    str[2] = (val%10) + '0';  //小數位字符
    str[3] = 'V';             //電壓單位
    str[4] = '\0';            //結束符
}
/* 配置并啟動T0,ms-T0定時時間 */
void ConfigTimer0(unsigned int ms)
{
    unsigned long tmp;  //臨時變量
   
    tmp = 11059200 / 12;      //定時器計數頻率
    tmp = (tmp * ms) / 1000;  //計算所需的計數值
    tmp = 65536 - tmp;        //計算定時器重載值
    tmp = tmp + 12;           //補償中斷響應延時造成的誤差
    T0RH = (unsigned char)(tmp>>8);  //定時器重載值拆分為高低字節
    T0RL = (unsigned char)tmp;
    TMOD &= 0xF0;   //清零T0的控制位
    TMOD |= 0x01;   //配置T0為模式1
    TH0 = T0RH;     //加載T0重載值
    TL0 = T0RL;
    ET0 = 1;        //使能T0中斷
    TR0 = 1;        //啟動T0
}
/* T0中斷服務函數,執行300ms定時 */
void InterruptTimer0() interrupt 1
{
    static unsigned char tmr300ms = 0;
   
    TH0 = T0RH;  //重新加載重載值
    TL0 = T0RL;
    tmr300ms++;
    if (tmr300ms >= 30)  //定時300ms
    {
        tmr300ms = 0;
        flag300ms = 1;
    }
}


void disp_persent(unsigned char *str){
              if(str[0]== 0x35)                   // 00%   5v
{
        LcdShowStr(11,0,"00")        ;
}
             else if(str[0] == 0x34)                   // 25%   4v
{
        LcdShowStr(11,0,"25")        ;
}
              else if(str[0] == 0x33)                   // 50%   3v
{
        LcdShowStr(11,0,"50")        ;
}
              else if(str[0] == 0x32)                   // 75%   2v
{
        LcdShowStr(11,0,"75")        ;
}
              else if(str[0] == 0x31)                   // 99%   1v
{
        LcdShowStr(11,0,"99")        ;
}
    /*else{
                        LcdShowStr(11,0,"xx")        ;
                }*/
}        
        -----------------------------------------
本人很懶有黑幣的可以下載下面的包,貢獻點積分啥的      感謝

模數轉換_適用壓差傳感器.zip (52.94 KB, 下載次數: 50)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:582452 發表于 2020-1-30 21:49 | 只看該作者
你這個板子是普中科技開發板?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人国产精品一级毛片视频毛片 | 免费av观看 | 精品国产伦一区二区三区观看方式 | 国产精品久久国产精品久久 | 伊人久操| 免费视频久久久久 | 亚洲一区 | 国产精品永久免费观看 | 视频一区二区在线观看 | 国产在线观看一区二区 | 国产精品精品视频一区二区三区 | 亚洲精品一区二三区不卡 | 久久免费视频1 | 国产精品久久久久一区二区三区 | 午夜无码国产理论在线 | 亚洲福利在线观看 | 看片天堂| 欧美一区二区三区高清视频 | 在线成人av | 成人字幕网zmw | 超碰97人人人人人蜜桃 | 黄网免费看 | 在线观看中文字幕视频 | 久久久.com | 国产精品99精品久久免费 | 亚洲综合二区 | 黄色精品| 日韩欧美国产一区二区三区 | 成人国产精品久久 | 亚洲精品国产电影 | 美女国内精品自产拍在线播放 | 欧美黄色免费网站 | 欧美在线国产精品 | 久久伊| 欧美二区在线 | www国产亚洲精品 | 日韩区| 日韩欧美视频 | 嫩草视频在线免费观看 | 国产精品久久久久无码av | 日韩在线视频观看 |