找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1440|回复: 1
打印 上一主题 下一主题
收起左侧

有大佬用过DHT11温湿度模块吗?单片机测出来的数据不太正常,求救

[复制链接]
跳转到指定楼层
楼主
ID:494791 发表于 2019-5-6 10:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
还有就是那个从机响应函数response()加上的话lcd就什么也不显示了,不加的话现在显示湿度68,温度46,

程序如下
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit DATA=P2^0;
  5. sbit rs=P2^6;        
  6. sbit rw=P2^5;        
  7. sbit en=P2^7;     
  8. uchar rec_dat[9];   //用于显示的接收数据数组
  9. /*1ms延时函数*/
  10. void delay1ms(uint x)   //误差 0us
  11. {
  12.     unsigned char a,b,c;
  13.     for(c=x;c>0;c--)
  14.         for(b=142;b>0;b--)
  15.             for(a=2;a>0;a--);
  16. }
  17. /*80us延时函数*/
  18. void delay80us(void)   //误差 0us
  19. {
  20.     unsigned char a,b;
  21.     for(b=11;b>0;b--)
  22.         for(a=2;a>0;a--);
  23. }
  24. /*60us延时函数*/
  25. void delay60us(void)   //误差 0us
  26. {
  27.     unsigned char a,b;
  28.     for(b=3;b>0;b--)
  29.         for(a=8;a>0;a--);
  30. }
  31. /*24us延时函数*/
  32. void delay24us(void)   //误差 0us
  33. {
  34.     unsigned char a,b;
  35.     for(b=3;b>0;b--)
  36.         for(a=2;a>0;a--);
  37. }
  38. /*27us延时函数*/
  39. void delay27us(void)   //误差 0us
  40. {
  41.     unsigned char a;
  42.     for(a=12;a>0;a--);
  43. }
  44. /*主机发送起始信号*/
  45. void start()
  46. {
  47.    DATA=0;
  48.    delay1ms(20);
  49.    DATA=1;
  50.    delay24us();
  51. }
  52. /*检测从机应答信号*/
  53. void response()
  54. {
  55.    DATA=0;
  56.    delay80us();
  57.    DATA=1;
  58.    delay80us();
  59. }
  60. /*接收1字节数据*/
  61. uint receivebyte()
  62. {
  63.       uchar i,dat=0;
  64.     for(i=0;i<8;i++)
  65.     {
  66.        while(!DATA);//等待50ms低电平过去
  67.        delay27us();
  68.        if(DATA==1)
  69.          dat+=1;
  70.        dat<<=1;//数据移位
  71.        while(DATA);
  72.     }
  73.     return dat;
  74. }
  75. void DHT11()
  76. {
  77.    uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revive;
  78.    start();
  79.    DATA=1;
  80. //   response();
  81.    if(DATA==0)
  82.    {
  83.      while(DATA==0);
  84.      delay80us();
  85.      R_H=receivebyte(); //接收湿度高八位
  86.      R_L=receivebyte(); //接收湿度低八位
  87.      T_H=receivebyte(); //接收温度高八位
  88.      T_L=receivebyte(); //接收温度低八位
  89.      revive=receivebyte(); //接收校正位
  90.      delay60us();
  91.    }
  92.    if((R_H+R_L+T_H+T_L)==revive) //校正
  93.    {
  94.     RH=R_H;
  95.     RL=R_L;
  96.     TH=T_H;
  97.     TL=T_L;
  98.    }
  99.     /*数据处理,方便显示*/
  100.     rec_dat[0]='0'+(RH/10);
  101.     rec_dat[1]='0'+(RH%10);
  102.     rec_dat[2]='R';
  103.     rec_dat[3]='H';
  104.     rec_dat[4]=' ';
  105.     rec_dat[5]=' ';
  106.     rec_dat[6]='0'+(TH/10);
  107.     rec_dat[7]='0'+(TH%10);
  108.     rec_dat[8]='C';
  109. }
  110. void lcd_wcom(uchar com)
  111. {
  112.    rs=0;
  113.    rw=0;
  114.    P0=com;
  115.    delay1ms(5);
  116.    en=1;
  117.    delay1ms(5);
  118.    en=0;
  119. }
  120. void lcd_wdat(uchar dat)
  121. {
  122.    rs=1;
  123.    rw=0;
  124.    P0=dat;
  125.    delay1ms(5);
  126.    en=1;
  127.    delay1ms(5);
  128.    en=0;
  129. }
  130. void lcd_init()
  131. {
  132.    lcd_wcom(0x38);
  133.    lcd_wcom(0x0c);
  134.    lcd_wcom(0x06);
  135.    lcd_wcom(0x01);
  136. }
  137. void main()
  138. {
  139.    uchar i;
  140.    lcd_init();
  141.    delay1ms(1000);
  142.    while(1)
  143.    {
  144.    DHT11();
  145.    lcd_wcom(0x80);
  146.    for(i=0;i<9;i++)
  147.    {
  148.       lcd_wdat(rec_dat[i]);
  149.    }
  150.    }
  151. }
复制代码

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:528677 发表于 2019-5-6 18:58 | 只看该作者
主函数加个延时试试,这模块不能太过频繁调用,最好1~2s调用一次。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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