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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1675|回復: 3
收起左側

單片機DHT11在LCD1602顯示 濕度和溫度都是00

[復制鏈接]
ID:1013894 發表于 2022-12-7 21:54 | 顯示全部樓層 |閱讀模式
剛學C51單片機,想學學DHT11在LCD顯示,遇到了濕度和溫度都是00的問題,請教一下各位大神這是什么問題導致的~ DHT11.PNG

代碼是
  1. #include "reg52.h"
  2. #include "intrins.h"
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. sbit Dat=P2^0;
  6. sbit RS=P2^6;
  7. sbit RW=P2^5;
  8. sbit EN=P2^7;
  9. sbit CE=P3^5;
  10. sbit DSIO=P3^4;
  11. sbit SCL=P3^6;
  12. uchar code talble[]="0123456789";
  13. uchar  read[]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};                //??????????????????????????
  14. uchar  time[]={0x21,0x53,0x15,0x18,0x09,0x05,0x20};                //??????????????????????BCD?
  15. uchar num0=0,num1=0,num2=0;
  16. void delayms(uint z)        //12MHz?,z=1??1ms
  17. {
  18.         uint x,y;
  19.         for(x=z;x>0;x--)
  20.                 for(y=122;y>0;y--);
  21. }
  22. void delayus(uchar z)                //12MHz?,z=1??17us
  23. {
  24.         while(z--);
  25. }
  26. /************************************??*************************************/
  27. //??
  28. /******************************DHT11??????********************************/
  29. uchar Read_Byte()
  30. {
  31.         uchar m,n,sum;
  32.         for(m=0;m<8;m++)
  33.         {
  34.                 while(!Dat);        //??????????50us????,??50us??
  35.                 delayus(3);                //??50us?????
  36.                 sum<<=1;                //????,?????????0??1???,??????
  37.                 n=Dat;                //???
  38.                 if(n==1)
  39.                 {
  40.                         sum=sum|0x01;
  41.                         while(!Dat);        //???????
  42.                 }
  43.                 else
  44.                 {
  45.                         sum=sum|0x00;
  46.                 }
  47.                 delayus(3);
  48.         }
  49.         return (sum);
  50. }
  51. void dht11()
  52. {
  53.         uchar m0,m1,m2,m3,m4;
  54.         Dat=1;
  55.         delayms(2);
  56.         Dat=0;                                //?????
  57.         delayms(30);                //????18ms
  58.         Dat=1;                        //????,????DHT11????
  59.         delayus(30);                //?????????,??20~40u?,??DHT11????
  60.         if(Dat==0)                //??DHT11???????,?DHT11??????,????????80us,?????80us??????
  61.         {
  62.                 while(!Dat);                //???????,????????
  63.                 while(Dat);                        //???????,???????80us,??????,???????
  64.                 m0=Read_Byte();                //????????
  65.                 m1=Read_Byte();                //????????
  66.                 m2=Read_Byte();                //????????
  67.                 m3=Read_Byte();                //????????
  68.                 m4=Read_Byte();                //?????
  69.         }
  70.         if(m4==(m0+m1+m2+m3))                //????,????????,??????????
  71.         {
  72.                 num0=m0;
  73.                 num1=m2;
  74.         }
  75.         else
  76.         {
  77.                 num0=num0;
  78.                 num1=num1;
  79.         }
  80. }
  81. /************************************DS1302*************************************/
  82. void Ds1302_Write_Byte(uchar addr,uchar dat)                        //?????????????
  83. {
  84.         uchar i;
  85.         CE=0;                                        //CE????,??????
  86.         SCL=0;                                //??????
  87.         CE=1;                                        //CE??,??????
  88.         for(i=0;i<8;i++)        //????,??8???
  89.         {
  90.                 DSIO=addr&0x01;        //????????
  91.                 addr>>=1;                                        //?????1?
  92.                 SCL=1;                //????????DS1302
  93.                 _nop_();
  94.                 SCL=0;
  95.                 _nop_();
  96.         }
  97.         for(i=0;i<8;i++)        //?????
  98.         {
  99.                 DSIO=dat&0x01;
  100.                 dat>>=1;
  101.                 SCL=1;
  102.                 _nop_();
  103.                 SCL=0;
  104.                 _nop_();
  105.         }
  106.         CE=0;
  107. }
  108. uchar Ds1302_Read_Byte(uchar addr)                        //?????????
  109. {
  110.         uchar i,dat0,dat1;
  111.         CE=0;                                        //CE????,???
  112.         SCL=0;                                //SCL????,???
  113.         CE=1;                                        //??DS1302??,CE??
  114.         for(i=0;i<8;i++)
  115.         {
  116.                 DSIO=addr&0x01;                //?????,??addr????,?????DSIO
  117.                 addr>>=1;                                //???????,????,???0
  118.                 SCL=1;                                        //??SCL????,????,???????,?????DS1302,??????,?????
  119.                 _nop_();
  120.                 SCL=0;                                        //?SCL??,??????????
  121.                 _nop_();
  122.         }
  123.         for(i=0;i<8;i++)
  124.         {
  125.                 dat0=DSIO;
  126.                 dat1=(dat1>>1)|(dat0<<7);
  127.                 SCL=1;
  128.                 _nop_();
  129.                 SCL=0;
  130.                 _nop_();
  131.         }
  132.         CE=0;
  133.         SCL=1;
  134.         DSIO=0;
  135.         DSIO=1;
  136.         return dat1;
  137. }
  138. void DS1302_Init()
  139. {
  140.         Ds1302_Write_Byte(0x8e,0x00);                //????????
  141.         Ds1302_Write_Byte(0x80,0x21);                //?????
  142.         Ds1302_Write_Byte(0x82,0x53);                //?????
  143.         Ds1302_Write_Byte(0x84,0x15);                //?????
  144.         Ds1302_Write_Byte(0x86,0x18);                //?????
  145.         Ds1302_Write_Byte(0x88,0x09);                //?????
  146.         Ds1302_Write_Byte(0x8a,0x05);                //????
  147.         Ds1302_Write_Byte(0x8c,0x20);                //????
  148.         Ds1302_Write_Byte(0x8e,0x80);                //?????        
  149. }
  150. void Read_time()
  151. {
  152.         uchar i;
  153.         for(i=0;i<7;i++)
  154.         {
  155.                 time[i]=Ds1302_Read_Byte(read[i]);
  156.         }
  157. }
  158. /************************************??*************************************/
  159. //??
  160. /**********************************1602??*************************************/
  161. bit Busy()
  162. {
  163.         bit bsy;
  164.         RS=0;
  165.         RW=1;
  166.         EN=1;
  167.         _nop_();
  168.         _nop_();
  169.         _nop_();
  170.         _nop_();
  171.         bsy=(bit)(P0&0x80);
  172.         EN=0;
  173.         return (bsy);
  174. }
  175. void Wr_com(uchar com)
  176. {
  177.         while(Busy());
  178.         RS=0;
  179.         RW=0;
  180.         P0=com;
  181.         delayus(1);
  182.         EN=1;
  183.         EN=0;
  184. }
  185. void Wr_dat(uchar dat)
  186. {
  187.         while(Busy());
  188.         RS=1;
  189.         RW=0;
  190.         P0=dat;
  191.         delayus(1);
  192.         EN=1;
  193.         EN=0;
  194. }
  195. void LCD_Init()
  196. {
  197.         Wr_com(0x38);
  198.         Wr_com(0x0C);
  199.         Wr_com(0x06);
  200.         Wr_com(0x01);
  201. }
  202. void display()
  203. {
  204.         Wr_com(0x80);
  205.         Wr_dat('2');
  206.         Wr_dat('0');
  207.         Wr_dat('0'+time[6]/16);                                //?
  208.         Wr_dat('0'+(time[6]&0x0f));
  209.         Wr_dat('-');                                                        //-
  210.         Wr_dat('0'+time[4]/16);                                //?
  211.         Wr_dat('0'+(time[4]&0x0f));        
  212.         Wr_dat(0xb0);                                                        //-
  213.         Wr_dat('0'+time[3]/16);                                //?
  214.         Wr_dat('0'+(time[3]&0x0f));

  215.         Wr_com(0x80+0x0b);
  216.         Wr_dat('0'+(time[5]&0x0f));                //??

  217.         Wr_com(0x80+0x0d);                                                        
  218.         Wr_dat(talble[num0/10]);                        //??
  219.         Wr_dat(talble[num0%10]);
  220.         Wr_dat(0x25);                                                        //%

  221.         Wr_com(0xC0);
  222.         Wr_dat('0'+time[2]/16);                                //?
  223.         Wr_dat('0'+(time[2]&0x0f));        
  224.         Wr_dat(0x3a);                                                        //:
  225.         Wr_dat('0'+time[1]/16);                                //?
  226.         Wr_dat('0'+(time[1]&0x0f));
  227.         Wr_dat(0x3a);                                                        //:
  228.         Wr_dat('0'+time[0]/16);                                //?
  229.         Wr_dat('0'+(time[0]&0x0f));

  230.         Wr_com(0xC0+0x0a);
  231.         Wr_dat(talble[num1/10]);                        //??
  232.         Wr_dat(talble[num1%10]);
  233.         Wr_dat(0x2e);                                                        //.
  234.         Wr_dat(talble[0]);
  235.         Wr_dat(0xdf);                                                        //
  236.         Wr_dat(0x43);                                                        //C        
  237. }
  238. void main()
  239. {
  240.         uint a;
  241.         LCD_Init();
  242.         DS1302_Init();
  243.         while(1)
  244.         {
  245.                 a++;
  246.                 if(a==20)
  247.                 {
  248.                       a=0;
  249.                       dht11();
  250.                  }
  251.                 Read_time();
  252.                 display();
  253.         }

  254. }
復制代碼

回復

使用道具 舉報

ID:1013894 發表于 2022-12-7 21:55 | 顯示全部樓層
找了百度說是延遲問題,看了其他人的運用改了也沒啥變化,加了上拉電阻也不行。請教一下大神這是什么問題導致的~
回復

使用道具 舉報

ID:123289 發表于 2022-12-8 09:19 | 顯示全部樓層
先學會如何走單步調試程序。
回復

使用道具 舉報

ID:161164 發表于 2022-12-8 13:32 | 顯示全部樓層
請善用仿真內的工具
經仿真,DHT11的初始化低電平18ms后的等待時間太久了接近200us,遠大于手冊要求得20~40us 2022-12-08_112720.png

2022-12-08_114418.png

2022-12-08_114718.png

讀數據的邏輯也不太對,應改為
2022-12-08_132944.png





回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜男人免费视频 | 特级a欧美做爰片毛片 | 欧美日韩国产精品一区 | 高清视频一区二区三区 | 国产中的精品av涩差av | 午夜影院免费体验区 | 超黄视频网站 | 婷婷久久网 | 中文字幕一区二区三区乱码在线 | 国产精品久久久久久久久久不蜜臀 | 亚洲 中文 欧美 日韩 在线观看 | 亚洲精品视频导航 | 久久国产精品-国产精品 | 久在线| 激情一区 | 亚欧性视频 | 午夜欧美日韩 | 久久99蜜桃综合影院免费观看 | 国产婷婷在线视频 | 欧美一区二区免费视频 | 日韩电影免费在线观看中文字幕 | 91在线视频 | 国产精品久久久久久久久久免费看 | 亚洲自拍偷拍免费视频 | 三级黄色大片网站 | 欧美综合一区二区 | 欧美福利专区 | 日本a v在线播放 | 日韩精品一区二区久久 | av喷水| 中文字幕视频在线 | 美女天堂在线 | 欧美1区2区 | 少妇一区二区三区 | 亚洲女人天堂成人av在线 | 国产成人精品一区二区三区四区 | 九色视频网站 | www.日本精品 | 久久久人| 一区二区视屏 | 福利国产 |