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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1746|回復: 6
收起左側

lcd1602溫濕度檢測一直為0

[復制鏈接]
ID:1119185 發表于 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輸出數據
  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的數據
  77. void obtainDht11Data()
  78. {
  79.         int i,j;
  80.         char tmp;
  81.         char flag;
  82.         dht11Start();  //開始輸出數據
  83.         for (i = 0; i < 5; i++){  //總共獲取5個字符(40bit)的數據
  84.                 for (j = 0; j < 8; j++){  
  85.                         //一次獲取一個bit數據
  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的數據是高位先出,所以用左移的方式
  96.                         tmp = tmp | flag;  //(|1成1,|0不變),即對于前面7個bit,flag都為0,不改變tmp的值
  97.                 }
  98.                 dht11Data[i] = tmp;
  99.         }
  100.        

  101. }

  102. //發送數據到字符數組,用于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. //檢測忙信號,讀數據線的D7位
  125. void checkBusySignal()
  126. {
  127.         char tmp = 0x80;
  128.         dataBuf = 0x80;
  129.         while(tmp & 0x80){  //當忙標志位(數據位D7)為高電平時,此時模塊不能接收命令或者數據
  130.                 RS = 0;
  131.                 RW = 1;
  132.                 EN = 0;
  133.                 _nop_();
  134.                 EN = 1;
  135.                 _nop_();
  136.                 _nop_();
  137.                 tmp = dataBuf;  //讀八位數據線的數據,當不忙時,硬件會自動將該位置0,當檢測到D7為低電平時將退出死循環
  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_();  //該函數為延時函數,延時一微秒
  150.         dataBuf = cmd;  //將指令存入八位數據線中
  151.         EN = 1;
  152.         _nop_();
  153.         _nop_();
  154.         EN = 0;
  155.         _nop_();
  156. }

  157. //寫數據
  158. void writeData(char myData)
  159. {
  160.         checkBusySignal();
  161.         RS = 1;  //選擇寫數據寄存器
  162.         RW = 0;
  163.         EN = 0;
  164.         _nop_();  //該函數為延時函數,延時一微秒
  165.         dataBuf = myData;  //將數據存入八位數據線中
  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();//以后每次寫指令,讀/寫數據操作均需要檢測忙信號
  179.         writeCmd(0x38);  //寫指令 38H:顯示模式設置
  180.         writeCmd(0x08);  //寫指令 08H:顯示關閉
  181.         writeCmd(0x01);  //寫指令 01H:顯示清屏
  182.         writeCmd(0x06);  //寫指令 06H:顯示光標移動設置
  183.         writeCmd(0x0C);  //寫指令 0CH:顯示開及光標設置
  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度過不穩定狀態
  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. }
復制代碼

回復

使用道具 舉報

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


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

  10. uchar Receive_Byte()        //讀取一個字節數據
  11. {
  12.         uchar i,dat;
  13.         for(i=0;i<8;i++)
  14.         {
  15.                 while(DATA==0);        //等待數據低電平部分過去
  16.                 delay_us(8);        //延時50us,若DATA還為高電平則為數據1,否則為數據0
  17.                 dat<<=1;
  18.                 if(DATA==1)
  19.                 {
  20.                         dat|=0x01;
  21.                 }
  22.                 while(DATA==1);        //等待此幀數據高電平完全過去
  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();                //主機發出開始信號
  30.         if(DATA==0)                        //DHT11響應信號
  31.         {
  32.                 while(DATA==0);        //DHT11響應信號,80us
  33.                 delay_us(40);        //DHT11響應信號,拉高延時80us,準備輸出
  34.                 H1=Receive_Byte();
  35.                 H2=Receive_Byte();
  36.                 T1=Receive_Byte();
  37.                 T2=Receive_Byte();
  38.                 check=Receive_Byte();
  39.                 delay_us(25);        //當一次數據傳輸完成后,DHT11拉低總線50us,隨后總線由上拉電阻拉高進入空閑狀態。
  40.                 if((H1+H2+T1+T2)==check)        //數據檢驗
  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. }

復制代碼













回復

使用道具 舉報

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

謝謝,我看一下
回復

使用道具 舉報

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

使用道具 舉報

ID:1119185 發表于 2024-5-6 15:26 | 顯示全部樓層
li_z 發表于 2024-5-4 13:58
謝謝,我看一下

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

使用道具 舉報

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

使用道具 舉報

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

我連接的是P2口,內部有上拉電阻
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品永久久久久 | 中日韩av | 国产精品成人一区二区三区 | 亚洲免费精品 | 日本精品视频 | 五月婷婷亚洲 | 在线免费观看a级片 | 日韩欧美黄色 | 99精品国产一区二区青青牛奶 | 中文字幕国产视频 | 亚洲午夜网| 天堂av在线影院 | 久久亚洲精品国产精品紫薇 | 成人精品国产免费网站 | www.欧美.com | 一区福利视频 | 日韩在线视频一区 | 日韩欧美不卡 | 99亚洲精品| 精品久久99| 欧美精品一区二区免费 | 国产精品中文字幕在线观看 | 国产在线一 | 天天艹| 中文字幕91av | 亚洲欧美国产毛片在线 | 日韩一区二区三区av | 亚洲伦理自拍 | 欧美精品91 | 国产精品久久国产精品 | 久久爱综合 | 欧美一区二区成人 | 欧美男人天堂 | 国产精品欧美精品日韩精品 | 久久久久久久一区二区 | 99精品一区二区三区 | 99精品视频在线 | 污免费网站 | 拍真实国产伦偷精品 | 亚洲国产欧美一区 | 欧美国产日韩在线观看成人 |