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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6457|回復: 5
收起左側

DHT22(DHT11)-STC12C5A60S2-LCD12864親測程序

[復制鏈接]
ID:412757 發表于 2018-11-7 16:55 | 顯示全部樓層 |閱讀模式
#include "stc12c5a60s2.h"  //單片機選型stc12c5a60s2-DIP40
#include "intrins.h"
#include<stdio.h>

#define nop() _nop_()
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long

#define CMD_IDLE 0
#define CMD_READ 1
#define CMD_PROGRAM 2
#define CMD_ERASE 3
#define ENABLE_IAP 0x83


sbit DHT = P1^0;     //DHT11
sbit LCD_SID = P0^0; //即LCD RW口
sbit LCD_CLK = P0^1; //即LCD E口

uint RH_data,RL_data,TH_data,TL_data,CK_data,R,T;//定義全局變量            
uchar undata,shuju;

code uchar name1[] = {"溫度"};
code uchar name2[] = {"濕度"};
code uchar name3[] = {"擺幅"};
code uchar name4[] = {"呼吸"};
code uchar name5[] = {"心率"};
code uchar name6[] = {"血氧"};
code uchar name7[] = {" -"}; //當使用DHT22時啟用該句,溫度零下時,顯示負號       

/*******************DHT11-22用***********************/

uchar read_8bit();
uchar read_data();

/*******************LCD12864用***********************/
void InitializeLcd12864();//初始化LCD
void InitializeDisplay1(); //初始化顯示內容
void InitializeDisplay2(); //初始化顯示內容
void displaystring(uchar add,uint num);//寫入字符串
void WriteCommandLcd12864(uchar temp);//寫入命令


/*******************主函數**************************/
void main()
{          
       InitializeLcd12864();

        while(1)
        {  
                   //uint i;i++;Delay1ms();if(i==2200){i=0;read_data();}//按廠家要求間隔2秒時間采集溫濕度傳感器數據
                                  
           read_data();                                
/*************12864各行列地址******************/
//列           1        2         3          4           5        6    7          8
//第一行:80H、81H、82H、83H、84H、85H、86H、87H
//第二行:90H、91H、92H、93H、94H、95H、96H、97H
//第三行:88H、89H、8AH、8BH、8CH、8DH、8EH、8FH
//第四行:98H、99H、9AH、9BH、9CH、9DH、9EH、9FH                               
/*************12864各行列地址******************/

                  if((TH_data&0x80)==0)    //當使用DHT22時啟用該句,溫度零下時,顯示負號  
                     
          {InitializeDisplay1();displaystring(0x90,T);}//當使用DHT22時啟用該句,溫度零下時,顯示負號

                  if((TH_data&0x80)!=0)          //當使用DHT22時啟用該句,溫度零上時,熄滅負號

                  {InitializeDisplay2();displaystring(0x91,T);} //當使用DHT22時啟用該句,溫度數據第2行第12兩列,4個半角字符即2個漢字長度

            //displaystring(0x90,T);           //當使用DHT11時啟用該句,溫度數據第2行第12兩列,4個半角字符即2個漢字長度
          displaystring(0x96,R);       //濕度數據第2行第78兩列,4個半角字符即2個漢字長度
               
          displaystring(0x98,shuju);   //未定數據第4行第12兩列,4個半角字符即2個漢字長度
          displaystring(0x9e,shuju);   //未定數據第4行第68兩列,4個半角字符即2個漢字長度           
        }
}  

/*********************延時函數******************************/

void Delay_DHT35us()        //1T mcu STC12c5a60s2@12MHz
{
   uchar i;
        i = 102;
        while (--i);
}

void Delay_DHT30us()        //1T mcu STC12c5a60s2@12MHz
{            
        uchar i;
        i = 87;
        while (--i);
}
void Delay_DHT18ms()        //1T mcu STC12c5a60s2@12MHz
{
    uchar i, j, k;
        i = 1;
        j = 211;
        k = 24;
        do
        {         
          do
                 {
                  while (--k);
                 }
          while (--j);
         }
         while (--i);
}

void Delay_LCD_ms(uint xms)   //1T mcu STC12c5a60s2@12MHz
{
uint y=0;
for(;xms>0;xms--)
for(y=0;y<600;y++);
}

void Delay_LCD10us()                //@12MHz
{
        uchar i;  
        _nop_();
        _nop_();
        i = 27;
        while (--i);
}


/*********************DHT部分*************************/

uchar read_8bit()            //讀一個字節8bit
{
    uchar i;
    uchar temp=0;
    uchar dat;
        //EA=0;        //程序如有中斷,關閉中斷,防止在us級延時期間發生中斷,影響數據讀取       
    for(i = 0;i < 8;i++)
    {
        while(!DHT);                               
        Delay_DHT30us();               
        temp = 0;
        if(DHT == 1) temp = 1;
        while(DHT);                       
        dat<<=1;
        dat = dat|temp;
    }
        //EA=1;      //讀完后打開中斷
    return dat;
}

uchar read_data()
{

   // DHT = 1;          //使用DHT11時啟用該句
   // Delay8us(); //使用DHT11時啟用該句
    DHT = 0;
    Delay_DHT18ms();  //奧松DHTT1說明拉低大于18ms,DHTT22說明拉低大于800us即可。
    DHT = 1;
        EA=0;
    Delay_DHT35us();
        EA=1;
    if(!DHT)
     {
         
        while(!DHT);
        while(DHT);
         
        RH_data = read_8bit();
        RL_data = read_8bit();
        TH_data = read_8bit();
        TL_data = read_8bit();
        CK_data = read_8bit();
        undata = RH_data + RL_data + TH_data + TL_data;
     }
    if(CK_data != undata)  return 0;
    if(CK_data == undata)
               
                   
  //R=RH_data;           //當使用DHT11時啟用該句
  //T=TH_data;           //當使用DHT11時啟用該句

  //TH_data=TH_data|0x80; //當使用DHT22時啟用該句時,模擬零下溫度,測試完成后刪除此句

        if((TH_data&0x80)==0)  //當使用DHT22時啟用該句
        T=TH_data*256+TL_data; //當使用DHT22時啟用該句
        if((TH_data&0x80)!=0) //當使用DHT22時啟用該句,當溫度零下時,溫度數據最高位置1,用0x80去“與”,檢測出這個1
        T=(TH_data&0x7f)*256+TL_data;//當使用DHT22時啟用該句,用0x7f去“與”,消去最高位上的1,得到真實溫度數據
        R=RH_data*256+RL_data; //當使用DHT22時啟用該句                 
        return 1;

}



/********************lcd12864顯示部分*******************/


void InitializeLcd12864()//初始化LCD  
  {
     WriteCommandLcd12864(0x30);//基本功能
     WriteCommandLcd12864(0x0c);//顯示開,光標關
     WriteCommandLcd12864(0x01);//清屏
  }

void WriteByteLcd12864(uchar temp)//寫入一個字節
  {
    uchar i;
    LCD_CLK = 0;
    for(i=0;i<8;i++)
     {
      if(temp&0x80)
      LCD_SID = 1;
    else
     LCD_SID = 0;
     LCD_CLK = 1;
     Delay_LCD10us();
     temp <<= 1;
     LCD_CLK = 0;
     Delay_LCD10us();
    }
}

void WriteCommandLcd12864(uchar temp)//寫入功能

{
WriteByteLcd12864(0xf8);
WriteByteLcd12864(temp&0xf0);
WriteByteLcd12864(temp<<4);   
}


void WriteDataLcd12864(uchar temp)//寫入變量數值

{
    WriteByteLcd12864(0xfa);
    WriteByteLcd12864(temp&0xf0);
    WriteByteLcd12864(temp<<4);
}

void WriteStringAddress(uchar add,uchar length,uchar *temp)//寫入字符串及其地址
{
    WriteCommandLcd12864(add);
    for(;length>0;length--)
    {
    WriteDataLcd12864(*temp);
    temp++;
    }
}

/********************顯示***************************/

void displaystring(uchar add,uint num)
{
unsigned char buf[10],i;
buf[0] = num/100;       
buf[1] = num%100/10;
buf[2] = num%100%10;                         //請注意當使用DHT11時,此位被強制為0 顯示3位帶小數點的數字 好看些
WriteCommandLcd12864(add);       //地址
for(i=0;i<3;i++)
{
WriteDataLcd12864(buf[i]+0x30);
if(i==1)WriteDataLcd12864('.');
}
}


/******************顯示內容初始化***********************/
/*************12864各行列地址******************/
//列           1        2         3          4           5        6    7          8
//第一行:80H、81H、82H、83H、84H、85H、86H、87H
//第二行:90H、91H、92H、93H、94H、95H、96H、97H
//第三行:88H、89H、8AH、8BH、8CH、8DH、8EH、8FH
//第四行:98H、99H、9AH、9BH、9CH、9DH、9EH、9FH
/*************12864各行列地址******************/

void InitializeDisplay1()
{
  WriteStringAddress(0x80,4,name1);//“溫度”  第1行第12兩列,4個半角字符長度即2個16*16漢字長度
  WriteStringAddress(0x83,4,name3);//“幅度”         第1行第45兩列,4個半角字符長度
  WriteStringAddress(0x86,4,name2);//"濕度"         第1行第78兩列,4個半角字符長度         

  WriteStringAddress(0x88,4,name5);//“心率”  第3行第12兩列,4個半角字符長度
  WriteStringAddress(0x8b,4,name4);//“呼吸”  第3行第45兩列,4個半角字符長度
  WriteStringAddress(0x8e,4,name6);//“血氧”         第3行第78兩列,4個半角字符長度
  Delay_LCD_ms(100);
}  

void InitializeDisplay2()  //當使用DHT22時啟用改函數
{
  WriteStringAddress(0x80,4,name1);//“溫度”  第1行第12兩列,4個半角字符長度
  WriteStringAddress(0x83,4,name3);//“幅度”         第1行第45兩列,4個半角字符長度
  WriteStringAddress(0x86,4,name2);//"濕度"         第1行第78兩列,4個半角字符長度         

  WriteStringAddress(0x90,2,name7);

  WriteStringAddress(0x88,4,name5);//“心率”  第3行第12兩列,4個半角字符長度
  WriteStringAddress(0x8b,4,name4);//“呼吸”  第3行第45兩列,4個半角字符長度
  WriteStringAddress(0x8e,4,name6);//“血氧”         第3行第78兩列,4個半角字符長度
  Delay_LCD_ms(100);
}  


評分

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

查看全部評分

回復

使用道具 舉報

ID:412757 發表于 2018-11-7 16:57 | 顯示全部樓層
只調試了DHT22-11溫濕度傳感器,心率血氧傳感器沒有接入,也無此程序,在LCD12864上會顯示心率血氧 數據為0
回復

使用道具 舉報

ID:412757 發表于 2018-11-8 17:16 | 顯示全部樓層
這個程序帶有零下溫度處理,一般的DHT22程序沒有,本程序直接接DHT22和帶字庫的LCD12864就能用了。屏上顯示的內容不要的可以在代碼中刪除。
回復

使用道具 舉報

ID:412757 發表于 2018-11-8 17:39 | 顯示全部樓層
需要的文件下載不下來 要沒沒反應,要沒提示等待,點一次扣一次黑幣,好像這樣的。
回復

使用道具 舉報

ID:326450 發表于 2018-11-13 17:08 | 顯示全部樓層
恩恩,值得學習
回復

使用道具 舉報

ID:416896 發表于 2020-6-18 10:25 | 顯示全部樓層
謝謝分享,值得學習
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 天天爽天天操 | 国产精品久久久久久久久久久久 | 特级毛片爽www免费版 | 欧美激情精品久久久久久 | 天天艹天天干天天 | 91成人在线 | 国产精品久久久久久久久久久久久久 | 国产黄色网址在线观看 | 美女久久久久久久 | 国产一区二区三区色淫影院 | 高清欧美性猛交 | 91精品国产乱码久久久久久 | 五月婷婷色 | 久久久久亚洲精品中文字幕 | www.日韩 | www久久久| 国产视频三区 | 久久久精品网站 | 精品亚洲一区二区三区 | 精品久久久久久久 | 亚洲综合二区 | 国产玖玖 | 久久久久久国产精品免费免费 | 久久久91| 草b视频| 久久久久久毛片免费观看 | 亚洲欧美视频在线观看 | 欧美 日韩 国产 在线 | 日本理论片好看理论片 | 欧洲妇女成人淫片aaa视频 | 精品视频 免费 | www精品美女久久久tv | 欧美乱人伦视频 | 国产精品欧美一区二区三区不卡 | 久久综合久久久 | 精品国产免费人成在线观看 | 日韩精品一区二区三区在线播放 | 伊人免费在线观看 | 日韩欧美视频 | 夜夜撸av | 亚洲精品68久久久一区 |