找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1005|回复: 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 单片机教程网

快速回复 返回顶部 返回列表