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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

lcd1602溫濕度檢測一直為0

[復(fù)制鏈接]
ID:1119185 發(fā)表于 2024-5-3 18:59 | 顯示全部樓層 |閱讀模式
975727962256121.jpg
  1. #include "reg52.h"
  2. #include <intrins.h>
  3. #include <string.h>

  4. #define dataBuf P0

  5. sfr AUXR = 0x8e;

  6. sbit RS = P1^0;
  7. sbit RW = P1^1;
  8. sbit EN = P1^2;
  9. sbit dht11 = P1^3;

  10. char dht11Data[5];
  11. char temperature[9];
  12. char humidity[9];

  13. void Delay40us()                //@11.0592MHz
  14. {
  15.         unsigned char i;

  16.         _nop_();
  17.         i = 15;
  18.         while (--i);
  19. }

  20. void Delay5ms()                //@11.0592MHz
  21. {
  22.         unsigned char i, j;

  23.         i = 9;
  24.         j = 244;
  25.         do
  26.         {
  27.                 while (--j);
  28.         } while (--i);
  29. }

  30. void Delay15ms()                //@11.0592MHz
  31. {
  32.         unsigned char i, j;

  33.         i = 27;
  34.         j = 226;
  35.         do
  36.         {
  37.                 while (--j);
  38.         } while (--i);
  39. }

  40. void Delay30ms()                //@11.0592MHz
  41. {
  42.         unsigned char i, j;

  43.         i = 54;
  44.         j = 199;
  45.         do
  46.         {
  47.                 while (--j);
  48.         } while (--i);
  49. }

  50. void Delay1000ms()                //@11.0592MHz
  51. {
  52.         unsigned char i, j, k;

  53.         _nop_();
  54.         i = 8;
  55.         j = 1;
  56.         k = 243;
  57.         do
  58.         {
  59.                 do
  60.                 {
  61.                         while (--k);
  62.                 } while (--j);
  63.         } while (--i);
  64. }

  65. //配置DHT11輸出數(shù)據(jù)
  66. void dht11Start()
  67. {
  68.         dht11 =  1;
  69.         dht11 = 0;
  70.         Delay30ms();
  71.         dht11 = 1;
  72.         while(dht11);  //等待自己拉到低電平
  73.         while(!dht11);  //等待自己拉到高電平
  74.         while(dht11);  //等待自己拉到低電平
  75. }

  76. //獲取DHT11的數(shù)據(jù)
  77. void obtainDht11Data()
  78. {
  79.         int i,j;
  80.         char tmp;
  81.         char flag;
  82.         dht11Start();  //開始輸出數(shù)據(jù)
  83.         for (i = 0; i < 5; i++){  //總共獲取5個字符(40bit)的數(shù)據(jù)
  84.                 for (j = 0; j < 8; j++){  
  85.                         //一次獲取一個bit數(shù)據(jù)
  86.                         while(!dht11);  //等待自己拉到高電平
  87.                         Delay40us();  //高電平時間為27微秒左右表示0,高電平時間為70微秒左右表示1
  88.                        
  89.                         if(dht11 == 1){  //40微秒后為高電平即輸出1
  90.                                 while(dht11);
  91.                                 flag = 1;
  92.                         }else{  //40微秒后為低電平即輸出0
  93.                                 flag = 0;
  94.                         }
  95.                         tmp = tmp << 1;  //由于dht11的數(shù)據(jù)是高位先出,所以用左移的方式
  96.                         tmp = tmp | flag;  //(|1成1,|0不變),即對于前面7個bit,flag都為0,不改變tmp的值
  97.                 }
  98.                 dht11Data[i] = tmp;
  99.         }
  100.        

  101. }

  102. //發(fā)送數(shù)據(jù)到字符數(shù)組,用于LCD1602顯示
  103. void sendStrData()
  104. {
  105.         humidity[0] = 'H';
  106.         humidity[1] = ':';
  107.         humidity[2] = dht11Data[0]/10 + 0x30;
  108.         humidity[3] = dht11Data[0]%10 + 0x30;
  109.         humidity[4] = '.';
  110.         humidity[5] = dht11Data[1]/10 + 0x30;
  111.         humidity[6] = dht11Data[1]%10 + 0x30;
  112.         humidity[7] = '%';
  113.         humidity[8] = '\0';
  114.         temperature[0] = 'T';
  115.         temperature[1] = ':';
  116.         temperature[2] = dht11Data[2]/10 + 0x30;
  117.         temperature[3] = dht11Data[2]%10 + 0x30;
  118.         temperature[4] = '.';
  119.         temperature[5] = dht11Data[3]/10 + 0x30;
  120.         temperature[6] = dht11Data[3]%10 + 0x30;
  121.         temperature[7] = 'C';
  122.         temperature[8] = '\0';
  123. }

  124. //檢測忙信號,讀數(shù)據(jù)線的D7位
  125. void checkBusySignal()
  126. {
  127.         char tmp = 0x80;
  128.         dataBuf = 0x80;
  129.         while(tmp & 0x80){  //當(dāng)忙標(biāo)志位(數(shù)據(jù)位D7)為高電平時,此時模塊不能接收命令或者數(shù)據(jù)
  130.                 RS = 0;
  131.                 RW = 1;
  132.                 EN = 0;
  133.                 _nop_();
  134.                 EN = 1;
  135.                 _nop_();
  136.                 _nop_();
  137.                 tmp = dataBuf;  //讀八位數(shù)據(jù)線的數(shù)據(jù),當(dāng)不忙時,硬件會自動將該位置0,當(dāng)檢測到D7為低電平時將退出死循環(huán)
  138.                 EN = 0;
  139.                 _nop_();
  140.         }
  141. }

  142. //寫指令
  143. void writeCmd(char cmd)
  144. {
  145.         checkBusySignal();
  146.         RS = 0;  //選擇寫指令寄存器
  147.         RW = 0;
  148.         EN = 0;
  149.         _nop_();  //該函數(shù)為延時函數(shù),延時一微秒
  150.         dataBuf = cmd;  //將指令存入八位數(shù)據(jù)線中
  151.         EN = 1;
  152.         _nop_();
  153.         _nop_();
  154.         EN = 0;
  155.         _nop_();
  156. }

  157. //寫數(shù)據(jù)
  158. void writeData(char myData)
  159. {
  160.         checkBusySignal();
  161.         RS = 1;  //選擇寫數(shù)據(jù)寄存器
  162.         RW = 0;
  163.         EN = 0;
  164.         _nop_();  //該函數(shù)為延時函數(shù),延時一微秒
  165.         dataBuf = myData;  //將數(shù)據(jù)存入八位數(shù)據(jù)線中
  166.         EN = 1;
  167.         _nop_();
  168.         _nop_();
  169.         EN = 0;
  170.         _nop_();
  171. }

  172. //LCD1602初始化
  173. void lcd1602Init()
  174. {
  175.         Delay15ms();  //延時 15ms
  176.         writeCmd(0x38);  //寫指令 38H(不檢測忙信號)
  177.         Delay5ms();  //延時 5ms
  178.         checkBusySignal();//以后每次寫指令,讀/寫數(shù)據(jù)操作均需要檢測忙信號
  179.         writeCmd(0x38);  //寫指令 38H:顯示模式設(shè)置
  180.         writeCmd(0x08);  //寫指令 08H:顯示關(guān)閉
  181.         writeCmd(0x01);  //寫指令 01H:顯示清屏
  182.         writeCmd(0x06);  //寫指令 06H:顯示光標(biāo)移動設(shè)置
  183.         writeCmd(0x0C);  //寫指令 0CH:顯示開及光標(biāo)設(shè)置
  184. }

  185. //LCD1602顯示一行字符
  186. void lcd1602ShowData(char rows,char columns,char *str)
  187. {
  188.         switch (rows){  //選擇行
  189.         case 1:
  190.                 writeCmd(0x80 + columns);  //選擇列
  191.                 while(*str != '\0'){
  192.                         writeData(*str);  //顯示字符
  193.                         str++;
  194.                 }
  195.                 break;

  196.         case 2:
  197.                 writeCmd(0x80 + 0x40 +columns);  //選擇列
  198.                 while(*str != '\0'){
  199.                         writeData(*str);  //顯示字符
  200.                         str++;
  201.                 }
  202.                 break;

  203.         default:
  204.                 break;
  205.         }
  206. }

  207. void main()
  208. {
  209.         lcd1602Init();
  210.         //dht11上電后,需要延時1-2s度過不穩(wěn)定狀態(tài)
  211.         Delay1000ms();
  212.         Delay1000ms();
  213.        
  214.         //每1s獲取空氣中的溫濕度
  215.         while(1){
  216.                 obtainDht11Data();  
  217.                 sendStrData();
  218.                 lcd1602ShowData(2,0,humidity);
  219.                 lcd1602ShowData(1,0,temperature);
  220.                 Delay1000ms();
  221.         }
  222. }
復(fù)制代碼

回復(fù)

使用道具 舉報(bào)

ID:155507 發(fā)表于 2024-5-4 11:12 | 顯示全部樓層
延時時間不對
序不對


給一個你參考。
  1. void DHT11_Start()
  2. {
  3.         DATA=1;                        //空閑狀態(tài)為高電平
  4.         delay_us(2);
  5.         DATA=0;                        //主機(jī)發(fā)出開始信號,將總線拉低至少18ms
  6.         delay_ms(20);
  7.         DATA=1;                        //拉高總線并延時等待20--40us
  8.         delay_us(30);
  9. }

  10. uchar Receive_Byte()        //讀取一個字節(jié)數(shù)據(jù)
  11. {
  12.         uchar i,dat;
  13.         for(i=0;i<8;i++)
  14.         {
  15.                 while(DATA==0);        //等待數(shù)據(jù)低電平部分過去
  16.                 delay_us(8);        //延時50us,若DATA還為高電平則為數(shù)據(jù)1,否則為數(shù)據(jù)0
  17.                 dat<<=1;
  18.                 if(DATA==1)
  19.                 {
  20.                         dat|=0x01;
  21.                 }
  22.                 while(DATA==1);        //等待此幀數(shù)據(jù)高電平完全過去
  23.         }
  24.         return dat;
  25. }

  26. void DHT11_ReadData()
  27. {
  28.         uchar H1,H2,T1,T2,check,Humanity_H,Humanity_L,Temperature_H,Temperature_L;
  29.         DHT11_Start();                //主機(jī)發(fā)出開始信號
  30.         if(DATA==0)                        //DHT11響應(yīng)信號
  31.         {
  32.                 while(DATA==0);        //DHT11響應(yīng)信號,80us
  33.                 delay_us(40);        //DHT11響應(yīng)信號,拉高延時80us,準(zhǔn)備輸出
  34.                 H1=Receive_Byte();
  35.                 H2=Receive_Byte();
  36.                 T1=Receive_Byte();
  37.                 T2=Receive_Byte();
  38.                 check=Receive_Byte();
  39.                 delay_us(25);        //當(dāng)一次數(shù)據(jù)傳輸完成后,DHT11拉低總線50us,隨后總線由上拉電阻拉高進(jìn)入空閑狀態(tài)。
  40.                 if((H1+H2+T1+T2)==check)        //數(shù)據(jù)檢驗(yàn)
  41.                 {
  42.                         Humanity_H=H1;
  43.                         Humanity_L=H2;
  44.                         Temperature_H=T1;
  45.                         Temperature_L=T2;
  46.                 }
  47.                 DHT11_Data[0]=Humanity_H/10;
  48.                 DHT11_Data[1]=Humanity_H%10;
  49.                 DHT11_Data[2]=Humanity_L/10;
  50.                 DHT11_Data[3]=Humanity_L%10;
  51.                 DHT11_Data[4]=Temperature_H/10;
  52.                 DHT11_Data[5]=Temperature_H%10;
  53.                 DHT11_Data[6]=Temperature_L/10;
  54.                 DHT11_Data[7]=Temperature_L%10;
  55.         }
  56. }

復(fù)制代碼













回復(fù)

使用道具 舉報(bào)

ID:1119185 發(fā)表于 2024-5-4 13:58 | 顯示全部樓層
angmall 發(fā)表于 2024-5-4 11:12
延時時間不對
時序不對

謝謝,我看一下
回復(fù)

使用道具 舉報(bào)

ID:619259 發(fā)表于 2024-5-4 15:28 | 顯示全部樓層
糾正一下:lcd1602不能檢測溫濕度,這個功能是由溫濕度傳感器DHT11完成的。
回復(fù)

使用道具 舉報(bào)

ID:1119185 發(fā)表于 2024-5-6 15:26 | 顯示全部樓層

你好,您能否具體一些,我試過了,目前還未解決,如果可以,,交流一下
回復(fù)

使用道具 舉報(bào)

ID:226055 發(fā)表于 2024-5-6 20:11 | 顯示全部樓層
    DHT11溫濕度傳感器信號線上需要加上拉電阻的,不知道你硬件上有沒有加呢。
回復(fù)

使用道具 舉報(bào)

ID:1119185 發(fā)表于 2024-5-7 16:24 | 顯示全部樓層
cocolala 發(fā)表于 2024-5-6 20:11
DHT11溫濕度傳感器信號線上需要加上拉電阻的,不知道你硬件上有沒有加呢。

我連接的是P2口,內(nèi)部有上拉電阻
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产一区二区在线免费观看 | 中文字幕在线一区二区三区 | 欧美日韩三级 | 亚洲国产二区 | 国产精品一区二区三区在线 | 日韩在线资源 | 日韩久久久一区二区 | 色中文在线 | 91视频网址| 国产一区二区三区在线 | 日韩在线视频免费观看 | 日本韩国欧美在线观看 | 亚洲91| 男女免费视频网站 | 中文字幕亚洲视频 | www.婷婷亚洲基地 | 日韩高清一区 | 有码一区 | 精品国产一区二区三区久久久久久 | 亚av在线 | 男女性毛片| 午夜在线视频 | 欧美一级毛片在线播放 | 亚洲日韩视频 | 久久男女视频 | 欧洲一级毛片 | www成年人视频 | 狠狠综合久久av一区二区老牛 | 91看片在线观看 | 免费在线观看毛片 | 免费午夜视频在线观看 | 精品久久国产老人久久综合 | 热久久免费视频 | 91久久国产综合久久 | 99草免费视频 | 欧美婷婷 | 日操操 | 欧美三级在线 | 中文字幕av一区二区三区 | 亚洲国产成人av好男人在线观看 | 亚洲精品久久嫩草网站秘色 |