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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1566|回復: 3
打印 上一主題 下一主題
收起左側

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

[復制鏈接]
跳轉到指定樓層
樓主
剛學C51單片機,想學學DHT11在LCD顯示,遇到了濕度和溫度都是00的問題,請教一下各位大神這是什么問題導致的~

代碼是
  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. }
復制代碼

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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





讀數據的邏輯也不太對,應改為






回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 色综合天天综合网国产成人网 | 欧美国产日韩一区二区三区 | 日韩欧美在线视频播放 | 国产伦一区二区三区视频 | 亚洲欧美成人影院 | 日韩中文一区二区 | 国产在线网站 | 亚洲精品久久久久久宅男 | 欧美一级小视频 | 日韩毛片中文字幕 | 成人国产在线观看 | 日日碰碰 | 欧美性jizz18性欧美 | 黄色大片毛片 | 欧美日韩一二三区 | 欧美成人免费 | 精品国产不卡一区二区三区 | 天堂精品视频 | 欧美嘿咻 | 国产成人久久精品一区二区三区 | 久久精品 | 成人在线小视频 | 国产熟熟| 久久精品91久久久久久再现 | 亚洲福利免费 | 天天天天天天天干 | 久久伊| 欧美日韩精品一区 | 老外黄色一级片 | 99色综合| 青青草亚洲 | 中文字幕一区二区在线观看 | 久久久精品网站 | 天天躁日日躁性色aⅴ电影 免费在线观看成年人视频 国产欧美精品 | 中文字幕久久精品 | 99热欧美| 国产91成人 | 国产乱码精品一区二区三区忘忧草 | 国产中文字幕亚洲 | 国产精品一区视频 | 欧美性受xxx|