找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 6521|回復(fù): 5
收起左側(cè)

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

[復(fù)制鏈接]
ID:412757 發(fā)表于 2018-11-7 16:55 | 顯示全部樓層 |閱讀模式
#include "stc12c5a60s2.h"  //單片機(jī)選型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[] = {" -"}; //當(dāng)使用DHT22時(shí)啟用該句,溫度零下時(shí),顯示負(fù)號(hào)       

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

uchar read_8bit();
uchar read_data();

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


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

        while(1)
        {  
                   //uint i;i++;Delay1ms();if(i==2200){i=0;read_data();}//按廠家要求間隔2秒時(shí)間采集溫濕度傳感器數(shù)據(jù)
                                  
           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)    //當(dāng)使用DHT22時(shí)啟用該句,溫度零下時(shí),顯示負(fù)號(hào)  
                     
          {InitializeDisplay1();displaystring(0x90,T);}//當(dāng)使用DHT22時(shí)啟用該句,溫度零下時(shí),顯示負(fù)號(hào)

                  if((TH_data&0x80)!=0)          //當(dāng)使用DHT22時(shí)啟用該句,溫度零上時(shí),熄滅負(fù)號(hào)

                  {InitializeDisplay2();displaystring(0x91,T);} //當(dāng)使用DHT22時(shí)啟用該句,溫度數(shù)據(jù)第2行第12兩列,4個(gè)半角字符即2個(gè)漢字長(zhǎng)度

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

/*********************延時(shí)函數(shù)******************************/

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()            //讀一個(gè)字節(jié)8bit
{
    uchar i;
    uchar temp=0;
    uchar dat;
        //EA=0;        //程序如有中斷,關(guān)閉中斷,防止在us級(jí)延時(shí)期間發(fā)生中斷,影響數(shù)據(jù)讀取       
    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;      //讀完后打開(kāi)中斷
    return dat;
}

uchar read_data()
{

   // DHT = 1;          //使用DHT11時(shí)啟用該句
   // Delay8us(); //使用DHT11時(shí)啟用該句
    DHT = 0;
    Delay_DHT18ms();  //奧松DHTT1說(shuō)明拉低大于18ms,DHTT22說(shuō)明拉低大于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;           //當(dāng)使用DHT11時(shí)啟用該句
  //T=TH_data;           //當(dāng)使用DHT11時(shí)啟用該句

  //TH_data=TH_data|0x80; //當(dāng)使用DHT22時(shí)啟用該句時(shí),模擬零下溫度,測(cè)試完成后刪除此句

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

}



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


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

void WriteByteLcd12864(uchar temp)//寫(xiě)入一個(gè)字節(jié)
  {
    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)//寫(xiě)入功能

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


void WriteDataLcd12864(uchar temp)//寫(xiě)入變量數(shù)值

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

void WriteStringAddress(uchar add,uchar length,uchar *temp)//寫(xiě)入字符串及其地址
{
    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;                         //請(qǐng)注意當(dāng)使用DHT11時(shí),此位被強(qiáng)制為0 顯示3位帶小數(shù)點(diǎn)的數(shù)字 好看些
WriteCommandLcd12864(add);       //地址
for(i=0;i<3;i++)
{
WriteDataLcd12864(buf[i]+0x30);
if(i==1)WriteDataLcd12864('.');
}
}


/******************顯示內(nèi)容初始化***********************/
/*************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個(gè)半角字符長(zhǎng)度即2個(gè)16*16漢字長(zhǎng)度
  WriteStringAddress(0x83,4,name3);//“幅度”         第1行第45兩列,4個(gè)半角字符長(zhǎng)度
  WriteStringAddress(0x86,4,name2);//"濕度"         第1行第78兩列,4個(gè)半角字符長(zhǎng)度         

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

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

  WriteStringAddress(0x90,2,name7);

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


評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:412757 發(fā)表于 2018-11-7 16:57 | 顯示全部樓層
只調(diào)試了DHT22-11溫濕度傳感器,心率血氧傳感器沒(méi)有接入,也無(wú)此程序,在LCD12864上會(huì)顯示心率血氧 數(shù)據(jù)為0
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

ID:412757 發(fā)表于 2018-11-8 17:39 | 顯示全部樓層
需要的文件下載不下來(lái) 要沒(méi)沒(méi)反應(yīng),要沒(méi)提示等待,點(diǎn)一次扣一次黑幣,好像這樣的。
回復(fù)

使用道具 舉報(bào)

ID:326450 發(fā)表于 2018-11-13 17:08 | 顯示全部樓層
恩恩,值得學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

ID:416896 發(fā)表于 2020-6-18 10:25 | 顯示全部樓層
謝謝分享,值得學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表