找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

DHT11溫濕度傳感器程序

[復(fù)制鏈接]
ID:843201 發(fā)表于 2020-11-13 18:09 | 顯示全部樓層 |閱讀模式
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. sbit IO=P3^2;
  6. sbit lcden=P3^4;
  7. sbit lcdrs=P3^5;
  8. sbit lcdrw=P3^6;
  9. uchar data_byte;
  10. uchar RH,RL,TH,TL;

  11. void delay(uchar ms) // 延時模塊
  12. {
  13.         uint i,j;
  14.         for(i=ms;i>0;i--)
  15.                 for(j=110;j>0;j--);
  16. }
  17. void delayms()        //一個for循環(huán)大概需要8個多機器周期一個機器周期為1us  
  18. {                    //本函數(shù)延時8us多
  19.    uchar i;                        
  20.    for(i=0;i<1;i++);
  21. }
  22. void writecom(uchar com)
  23. {
  24.         lcdrs=0;
  25.         P0=com;
  26.         delay(5);
  27.         lcden=1;
  28.         delay(5);
  29.         lcden=0;
  30. }
  31. void writedata(uchar date)
  32. {
  33.         lcdrs=1;
  34.         P0=date;
  35.         delay(5);
  36.         lcden=1;
  37.         delay(5);
  38.         lcden=0;
  39. }
  40. void lcd_init()
  41. {
  42.         lcden=0;
  43.         lcdrw=0;
  44.         writecom(0x38);
  45.         writecom(0x0c);
  46.         writecom(0x06);
  47.         writecom(0x01);
  48. }
  49. void display(uchar addr,uchar q)
  50. {
  51.         delay(10);
  52.         writecom(addr|0x80);
  53.         writedata(q);
  54.         delay(1);
  55. }
  56.                 //DHT11測試
  57. void start()// 開始信號
  58. {
  59.         IO=1;
  60.         delayms();
  61.         IO=0;
  62.         delay(25);        // 主機把總線拉低必須大于 18ms 保證 DHT11 能檢測到起始信號
  63.         IO=1;                         //發(fā)送開始信號結(jié)束后 拉高電平延時 20-40us
  64.         delayms();        // 以下三個延時函數(shù)差不多為 24us 符合要求
  65.         delayms();
  66.         delayms();
  67. }
  68. uchar receive_byte()//接收一個字節(jié)
  69. {
  70.     uchar i,temp;
  71.     for(i=0;i<8;i++)        // 接收 8bit 的數(shù)據(jù)
  72.         {
  73.         while(!IO);        // 等待 50us的低電平開始信號結(jié)束
  74.         delayms();        //開始信號結(jié)束之后 延時 26us-28us 以下三個延時函數(shù)
  75.         delayms();        
  76.         delayms();
  77.         temp=0;                        //時間為 26us-28us 表示接收的為數(shù)據(jù) '0'
  78.         if(IO==1)
  79.         temp=1;                 //如果 26us-28us之后 還為高電平 則表示接收的數(shù)據(jù)為 '1'
  80.         while(IO);        // 等待數(shù)據(jù)信號高電平 '0'為 26us-28us '1'為 70us
  81.         data_byte<<=1;        // 接收的數(shù)據(jù)為高位在前 右移
  82.         data_byte|=temp;
  83.         }                                           
  84.                 return data_byte;
  85. }
  86. void receive()// 接收數(shù)據(jù)
  87. {
  88.     uchar T_H,T_L,R_H,R_L,check,num_check,i;
  89.     start();// 開始信號
  90.     IO=1;         //主機設(shè)為輸入 判斷從機 DHT11 響應(yīng)信號
  91.     if(!IO)        // 判斷從機是否有低電平響應(yīng)信號
  92.         {
  93.                 while(!IO);                        // 判斷從機發(fā)出 80us 的低電平響應(yīng)信號是否結(jié)束
  94.         while(IO);        // 判斷從機發(fā)出 80us 的高電平是否結(jié)束 如結(jié)束則主機進入數(shù)據(jù)接收狀態(tài)
  95.         R_H=receive_byte();// 濕度高位
  96.         R_L=receive_byte();// 濕度低位
  97.         T_H=receive_byte();// 溫度高位
  98.         T_L=receive_byte();// 溫度低位
  99.         check=receive_byte();// 校驗位
  100.         IO=0;                                         // 當(dāng)最后一 bit 數(shù)據(jù)接完畢后 從機拉低電平 50us
  101.             for(i=0;i<7;i++)// 差不多 50us 的延時
  102.                 delayms();
  103.         IO=1;                // 總線由上拉電阻拉高 進入空閑狀態(tài)
  104.         num_check=R_H+R_L+T_H+T_L;
  105.         if(num_check==check)                // 判斷讀到的四個數(shù)據(jù)之和是否與校驗位相同
  106.                 {
  107.                 RH=R_H;
  108.                 RL=R_L;
  109.                 TH=T_H;
  110.                 TL=T_L;
  111.                 check=num_check;
  112.                 }}}

  113. void main()
  114. {
  115.         lcd_init();// 初始化LCD
  116.         while(1)
  117.         {
  118.                 receive();// 接收數(shù)據(jù)       
  119.                 display(0x00,'R');//LCD 的第一行顯示
  120.                 display(0x01,':');
  121.                 display(0x02,RH/10+0x30);         //0x30 表示 帶字庫的 LCD1602 中 0x30 的位置放有數(shù)字 0 RH/10+0x30 即表示濕度的十位數(shù)字在字庫 RH/10+0x30 的位置處放著
  122.                 display(0x03,RH%10+0x30);
  123.                 display(0x04,'.');
  124.                 display(0x05,RL+0x30);        
  125.                 display(0X06,'%');

  126.                 display(0x40,'T');
  127.                 display(0x41,':');
  128.                 display(0x42,TH/10+0x30);
  129.                 display(0x43,TH%10+0x30);                 
  130.                 display(0x44,'.');
  131.                 display(0x45,TL+0x30);           //溫度的小數(shù)部分就一位數(shù),范圍0-9
  132.                 display(0x46,0xdf);                        //溫度單位
  133.                 display(0x47,0x43);
  134.         } }
復(fù)制代碼

DHT11.zip

3.52 KB, 下載次數(shù): 45, 下載積分: 黑幣 -5

回復(fù)

使用道具 舉報

ID:372579 發(fā)表于 2021-7-2 17:28 來自手機 | 顯示全部樓層
有原理圖配上
回復(fù)

使用道具 舉報

ID:918298 發(fā)表于 2021-8-11 11:11 | 顯示全部樓層
為什么我顯示的一直是0,我用這個程序和我原來的程序都是顯示0,求解?謝謝
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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