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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3229|回復: 1
收起左側

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

[復制鏈接]
ID:438959 發(fā)表于 2019-12-8 19:49 | 顯示全部樓層 |閱讀模式
我所說的土壤濕度傳感器主流的是yl-69型號的,但是我用的是fc-28型號;
型號看不懂的就別管了只管接線就行

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

主要在單片機上使用I2C和AD轉換模塊
main函數(shù)代碼:
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傳輸數(shù)據(jù);
    若傳上位機可以調(diào)用uart.c里面的configUart(9600);  //配置波特率9600
                        value =GetADCValue(1);
                ValueToString(str,value);
                send_string(str);
                delay();
                串口發(fā)送到上位機
*/
#include <reg52.h>


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


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);        //寫入控制字節(jié),選擇轉換通道
    I2CStart();
    I2CWrite((0x48<<1)|0x01);  //尋址PCF8591,指定后續(xù)為讀操作   
    I2CReadACK();              //先空讀一個字節(jié),提供采樣轉換時間
    val = I2CReadNAK();        //讀取剛剛轉換完的值
    I2CStop();
   
    return val;
}
/* ADC轉換值轉為實際電壓值的字符串形式,str-字符串指針,val-AD轉換值 */
void ValueToString(unsigned char *str, unsigned char val)
{
    //電壓值=轉換結果*2.5V/255,式中的25隱含了一位十進制小數(shù)
    val = (val*50)/255;   //故意先乘10方便后面計算取余數(shù)   *10     //小數(shù)是不能存在unsigned char數(shù)據(jù)中的。                                                                 
    str[0] = (val/10) + '0';  //整數(shù)位字符                         //unsigned char是用來存字符的,本質(zhì)是ascii碼值,也就是整數(shù)。
    str[1] = '.';             //小數(shù)點
    str[2] = (val%10) + '0';  //小數(shù)位字符
    str[3] = 'V';             //電壓單位
    str[4] = '\0';            //結束符
}
/* 配置并啟動T0,ms-T0定時時間 */
void ConfigTimer0(unsigned int ms)
{
    unsigned long tmp;  //臨時變量
   
    tmp = 11059200 / 12;      //定時器計數(shù)頻率
    tmp = (tmp * ms) / 1000;  //計算所需的計數(shù)值
    tmp = 65536 - tmp;        //計算定時器重載值
    tmp = tmp + 12;           //補償中斷響應延時造成的誤差
    T0RH = (unsigned char)(tmp>>8);  //定時器重載值拆分為高低字節(jié)
    T0RL = (unsigned char)tmp;
    TMOD &= 0xF0;   //清零T0的控制位
    TMOD |= 0x01;   //配置T0為模式1
    TH0 = T0RH;     //加載T0重載值
    TL0 = T0RL;
    ET0 = 1;        //使能T0中斷
    TR0 = 1;        //啟動T0
}
/* T0中斷服務函數(shù),執(zhí)行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")        ;
                }*/
}        
        -----------------------------------------
本人很懶有黑幣的可以下載下面的包,貢獻點積分啥的      感謝

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


評分

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

查看全部評分

回復

使用道具 舉報

ID:582452 發(fā)表于 2020-1-30 21:49 | 顯示全部樓層
你這個板子是普中科技開發(fā)板?
回復

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲v日韩v综合v精品v | 精品国产乱码久久久久久丨区2区 | 日韩欧美国产成人一区二区 | 在线中文视频 | 日韩三区| 夫妻午夜影院 | 欧美成人精品在线 | 国产精品永久免费观看 | 日韩三级 | 免费三级网站 | 中文字幕不卡在线88 | 成人高清在线视频 | 日本不卡在线视频 | 婷婷中文字幕 | 亚洲视频中文字幕 | 99综合网| 亚洲 欧美 日韩在线 | 久久久久久九九九九 | 一级在线观看 | 男女一区二区三区 | 国产一区二区在线免费观看 | 欧美一区二区三区在线免费观看 | 日韩成人免费视频 | 成人毛片视频免费 | 亚洲精品一区二区在线观看 | 一级黄在线观看 | 色香蕉在线 | 欧美日韩专区 | 欧美精品日韩精品国产精品 | 亚洲视频网| 国产精品久久久久一区二区 | 日韩和的一区二区 | 欧美精品一区二区三区蜜臀 | 伊人免费在线观看高清 | 成人在线免费观看av | 亚洲欧美自拍偷拍视频 | 在线天堂免费中文字幕视频 | 久久久成人精品 | 精品亚洲一区二区三区四区五区高 | 欧美日韩专区 | 嫩草视频网 |