找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 16455|回复: 26
收起左侧

51单片机控制DHT11在1602上显示温湿度的程序

  [复制链接]
ID:199245 发表于 2018-3-15 19:33 | 显示全部楼层 |阅读模式
需要的拿去

单片机源程序如下:
  1. #include <reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. typedef bit BOOL;
  5. sbit io = P2^0;
  6. sbit rs = P2^6;  
  7. sbit rw = P2^5;
  8. sbit ep = P2^7;
  9. uchar data_byte;
  10. uchar RH,RL,TH,TL;
  11. /********延时模块***********/
  12. void delay(uchar ms)
  13. {  // 延时子程序
  14. uchar i;
  15. while(ms--)
  16. {
  17.   for(i = 0;i<250;i++);  
  18. }
  19. }
  20. void delay1()//延时10us
  21. {
  22. uchar i;
  23. i--;
  24. i--;
  25. i--;
  26. i--;
  27. i--;
  28. i--;
  29. }
  30. void longdelay(uchar s) //长延时
  31. {
  32. while(s--)
  33. {
  34.   delay(60);
  35. }
  36. }
  37. BOOL lcd_bz()//测试LCD忙碌状态
  38. {
  39. BOOL result;  
  40. rs = 0;  
  41. rw = 1;
  42. ep = 1;
  43. result = (BOOL)(P0 & 0x80);
  44. ep = 0;  
  45. return result;  
  46. }
  47. void write_cmd(uchar cmd)// 写指令
  48. {  
  49. while(lcd_bz());
  50. rs = 0;
  51. rw = 0;
  52. ep = 0;
  53. P0 = cmd;
  54. ep = 1;
  55. ep = 0;
  56. }
  57. void write_addr(uchar addr)//写地址
  58. {
  59. write_cmd(addr|0x80);
  60. }
  61. void write_byte(uchar dat)//写字节
  62. {  
  63. while(lcd_bz());
  64. rs = 1;
  65. rw = 0;
  66. ep = 0;
  67. P0 = dat;          
  68. ep = 1;
  69. ep = 0;
  70. }
  71. void lcd_init()// 初始化
  72. {
  73. write_cmd(0x38);
  74. delay(1);
  75.   write_cmd(0x08);
  76. delay(1);
  77. write_cmd(0x01);
  78. delay(1);
  79. write_cmd(0x06);
  80. delay(1);  
  81. write_cmd(0x0c);
  82. delay(1);
  83. }
  84. void display(uchar addr, uchar q)//在某一地址上显示一字节
  85. {
  86. delay(10);
  87. write_addr(addr);
  88. write_byte(q);
  89. longdelay(2);
  90. }
  91. void start()//开始信号
  92. {
  93. io=1;
  94. delay1();
  95. io=0;
  96. delay(20);//>18ms  
  97. io=1;
  98. delay1();//20-40us
  99. delay1();
  100. delay1();
  101. delay1();
  102. delay1();
  103. }
  104. uchar receive_byte()//接收一个字节
  105. {
  106. uchar i,temp,count;
  107. for(i=0;i<8;i++)
  108. {
  109.    count=2;  
  110.   while((!io)&&count++)//等待50us低电平结束
  111.   temp=0;
  112.   delay1();
  113.   delay1();
  114.   delay1();
  115.   delay1();
  116.    if(io==1)
  117.   temp=1;
  118.   count=2;
  119.   while((io)&&count++);
  120.   if(count==1)break;
  121. data_byte<<=1;
  122.   data_byte|=temp;
  123. }
  124. return data_byte;
  125. }
  126. void receive()//接收数据
  127. {
  128. uchar T_H,T_L,R_H,R_L,check,num_check;
  129.    uchar count;
  130. start();//开始信号
  131. io=1;
  132. if(!io)//读取DHT11响应信号
  133. {
  134.   count=2;
  135.   while((!io)&&count++);//DHT11高电平80us是否结束
  136.   count=2;
  137.   while((io)&&count++);
  138.   R_H=receive_byte();
  139.   R_L=receive_byte();
  140.   T_H=receive_byte();
  141.   T_L=receive_byte();
  142.   check=receive_byte();
  143.   io=0;//拉低延时50us
  144.   delay1();
  145.    delay1();
  146.   delay1();
  147.   delay1();
  148.   delay1();
  149.   io=1;
  150.   num_check=R_H+R_L+T_H+T_L;
  151.   if(num_check=check)
  152.   {
  153.    RH=R_H;
  154. RL=R_L;
  155. TH=T_H;
  156. TL=T_L;
  157. check=num_check;
  158.   }
  159. }
  160. }
  161. void main()
  162. {
  163. lcd_init();
  164. delay(10);
  165. while(1)
  166. {
  167.   receive();
  168.   delay(100);
  169.   display(0x00,'R');
  170.   display(0x01,':');
  171.   display(0x02,RH/10+0x30);
  172.    display(0x03,RH%10+0x30);
  173.   display(0x04,'%');
  174.   display(0x40,'T');
  175.   display(0x41,':');                                
  176.   display(0x42,TH/10+0x30);
  177.   display(0x43,TH%10+0x30);
  178. display(0x44,0xdf);
  179.   display(0x45,0x43);
  180. }
  181. }
复制代码

所有资料51hei提供下载:
程序.rar (29.75 KB, 下载次数: 342)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:427492 发表于 2019-7-14 21:35 | 显示全部楼层
我找到一个时序是对的,你们可以参考一下:
/*********************** DHT11测试模块***************************************/
void start()//开始信号
{
         io=0;
         delay(18);//>18ms
         io=1;
         delay1();//20-40us
         delay1();
         delay1();
         delay1();
}
uchar receive_byte()//接收一个字节
{
         uchari;
         for(i=0;i<8;i++)
         {      
             data_byte<<=1;                                                                   //循环左移
                  while(!io);                                                                        //每发送一位数据间隔50us低电平
                  delay1();delay1();delay1();delay1();        //延迟40us
                  if(io==1)
                  {
                    data_byte=data_byte|0x01;
                    while(io);
                  }
                  else
                  {
                   data_byte=data_byte|0x00;
                  }
         }
         returndata_byte;
}
void receive()//接收数据
{
         ucharT_H,T_L,R_H,R_L,check;
         start();//开始信号
         io=1;
         if(!io)//读取DHT11响应信号
         {
   while(!io) ;                                    //判断输出低电平
   while( io) ;                                                            //判断输出高电平
         R_H=receive_byte();      
         R_L=receive_byte();
         T_H=receive_byte();
         T_L=receive_byte();
         check=receive_byte();
         io=0;                                
         delay1();delay1();delay1();delay1();delay1();//拉低延时50us
         io=1;
         if(R_H+R_L+T_H+T_L==check)                        //矫正
         {
                  RH=R_H;
                  RL=R_L;
                  TH=T_H;
                  TL=T_L;
         }
         }
}
回复

使用道具 举报

ID:299721 发表于 2018-3-30 23:51 | 显示全部楼层
厉害了
回复

使用道具 举报

ID:77707 发表于 2018-3-31 08:45 | 显示全部楼层
不错,通过编译。需要温度传感器,才能实现测温。
回复

使用道具 举报

ID:299278 发表于 2018-3-31 10:54 | 显示全部楼层
有protues仿真图吗
回复

使用道具 举报

ID:299931 发表于 2018-4-1 16:11 | 显示全部楼层
为啥数据显示一直是0
回复

使用道具 举报

ID:308121 发表于 2018-4-14 18:28 | 显示全部楼层
51宅男 发表于 2018-4-1 16:11
为啥数据显示一直是0

你解决问题了吗?
回复

使用道具 举报

ID:382962 发表于 2018-8-11 16:54 | 显示全部楼层
显示一直是0
回复

使用道具 举报

ID:294657 发表于 2018-9-2 21:55 | 显示全部楼层
是1602显示吗,为什么我的没有显示呢
回复

使用道具 举报

ID:303383 发表于 2018-9-2 22:55 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

ID:291850 发表于 2018-10-27 11:19 | 显示全部楼层
温湿度一直是0是什么情况啊?小白不太懂啊
回复

使用道具 举报

ID:291850 发表于 2018-10-27 13:25 | 显示全部楼层
貌似DHT11数据一直没收到
回复

使用道具 举报

ID:85740 发表于 2019-3-13 09:29 | 显示全部楼层
11.0592 stc89c52rc实测无法成功和dht11通信成功。
回复

使用道具 举报

ID:368574 发表于 2019-3-16 15:37 | 显示全部楼层
beyonbirth 发表于 2018-10-27 13:25
貌似DHT11数据一直没收到

我的也是只显示0
回复

使用道具 举报

ID:501427 发表于 2019-4-4 19:24 | 显示全部楼层

解决了吗?我也显示是0,什么情况啊
回复

使用道具 举报

ID:243819 发表于 2019-4-5 13:02 | 显示全部楼层
先赞一个!
回复

使用道具 举报

ID:182535 发表于 2019-4-27 15:20 | 显示全部楼层
正好需要。。。。。。。。。
回复

使用道具 举报

ID:520461 发表于 2019-5-6 20:16 | 显示全部楼层
beyonbirth 发表于 2018-10-27 13:25
貌似DHT11数据一直没收到

解决了没
回复

使用道具 举报

ID:545996 发表于 2019-7-2 22:16 | 显示全部楼层
显示0怎么办
回复

使用道具 举报

ID:427492 发表于 2019-7-14 21:18 | 显示全部楼层
时序有问题,就一直显示初始化时的值
回复

使用道具 举报

ID:623338 发表于 2019-11-10 12:55 | 显示全部楼层
你们解决了吗
回复

使用道具 举报

ID:56204 发表于 2019-11-29 02:50 来自手机 | 显示全部楼层
113333 发表于 2019-11-10 12:55
你们解决了吗

学习一下,感谢分享
回复

使用道具 举报

ID:631951 发表于 2019-11-29 10:34 | 显示全部楼层
枫树566 发表于 2019-7-14 21:35
我找到一个时序是对的,你们可以参考一下:
/*********************** DHT11测试模块******************** ...

我用了你这个,也不好用 啊,一直显示00
回复

使用道具 举报

ID:638896 发表于 2019-12-5 20:25 | 显示全部楼层
不行,啥都不显示,大家别看了,去找下一个。
回复

使用道具 举报

ID:638896 发表于 2019-12-6 11:00 | 显示全部楼层
不行,显示不了。
回复

使用道具 举报

ID:791947 发表于 2020-6-29 16:09 | 显示全部楼层
为什么我的是什么都不显示
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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