找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2284|回复: 2
收起左侧

DHT11温湿度传感器程序

[复制链接]
ID:843201 发表于 2020-11-13 18:09 | 显示全部楼层 |阅读模式
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. sbit IO=P3^2;
  6. sbit lcden=P3^4;
  7. sbit lcdrs=P3^5;
  8. sbit lcdrw=P3^6;
  9. uchar data_byte;
  10. uchar RH,RL,TH,TL;

  11. void delay(uchar ms) // 延时模块
  12. {
  13.         uint i,j;
  14.         for(i=ms;i>0;i--)
  15.                 for(j=110;j>0;j--);
  16. }
  17. void delayms()        //一个for循环大概需要8个多机器周期一个机器周期为1us  
  18. {                    //本函数延时8us多
  19.    uchar i;                        
  20.    for(i=0;i<1;i++);
  21. }
  22. void writecom(uchar com)
  23. {
  24.         lcdrs=0;
  25.         P0=com;
  26.         delay(5);
  27.         lcden=1;
  28.         delay(5);
  29.         lcden=0;
  30. }
  31. void writedata(uchar date)
  32. {
  33.         lcdrs=1;
  34.         P0=date;
  35.         delay(5);
  36.         lcden=1;
  37.         delay(5);
  38.         lcden=0;
  39. }
  40. void lcd_init()
  41. {
  42.         lcden=0;
  43.         lcdrw=0;
  44.         writecom(0x38);
  45.         writecom(0x0c);
  46.         writecom(0x06);
  47.         writecom(0x01);
  48. }
  49. void display(uchar addr,uchar q)
  50. {
  51.         delay(10);
  52.         writecom(addr|0x80);
  53.         writedata(q);
  54.         delay(1);
  55. }
  56.                 //DHT11测试
  57. void start()// 开始信号
  58. {
  59.         IO=1;
  60.         delayms();
  61.         IO=0;
  62.         delay(25);        // 主机把总线拉低必须大于 18ms 保证 DHT11 能检测到起始信号
  63.         IO=1;                         //发送开始信号结束后 拉高电平延时 20-40us
  64.         delayms();        // 以下三个延时函数差不多为 24us 符合要求
  65.         delayms();
  66.         delayms();
  67. }
  68. uchar receive_byte()//接收一个字节
  69. {
  70.     uchar i,temp;
  71.     for(i=0;i<8;i++)        // 接收 8bit 的数据
  72.         {
  73.         while(!IO);        // 等待 50us的低电平开始信号结束
  74.         delayms();        //开始信号结束之后 延时 26us-28us 以下三个延时函数
  75.         delayms();        
  76.         delayms();
  77.         temp=0;                        //时间为 26us-28us 表示接收的为数据 '0'
  78.         if(IO==1)
  79.         temp=1;                 //如果 26us-28us之后 还为高电平 则表示接收的数据为 '1'
  80.         while(IO);        // 等待数据信号高电平 '0'为 26us-28us '1'为 70us
  81.         data_byte<<=1;        // 接收的数据为高位在前 右移
  82.         data_byte|=temp;
  83.         }                                           
  84.                 return data_byte;
  85. }
  86. void receive()// 接收数据
  87. {
  88.     uchar T_H,T_L,R_H,R_L,check,num_check,i;
  89.     start();// 开始信号
  90.     IO=1;         //主机设为输入 判断从机 DHT11 响应信号
  91.     if(!IO)        // 判断从机是否有低电平响应信号
  92.         {
  93.                 while(!IO);                        // 判断从机发出 80us 的低电平响应信号是否结束
  94.         while(IO);        // 判断从机发出 80us 的高电平是否结束 如结束则主机进入数据接收状态
  95.         R_H=receive_byte();// 湿度高位
  96.         R_L=receive_byte();// 湿度低位
  97.         T_H=receive_byte();// 温度高位
  98.         T_L=receive_byte();// 温度低位
  99.         check=receive_byte();// 校验位
  100.         IO=0;                                         // 当最后一 bit 数据接完毕后 从机拉低电平 50us
  101.             for(i=0;i<7;i++)// 差不多 50us 的延时
  102.                 delayms();
  103.         IO=1;                // 总线由上拉电阻拉高 进入空闲状态
  104.         num_check=R_H+R_L+T_H+T_L;
  105.         if(num_check==check)                // 判断读到的四个数据之和是否与校验位相同
  106.                 {
  107.                 RH=R_H;
  108.                 RL=R_L;
  109.                 TH=T_H;
  110.                 TL=T_L;
  111.                 check=num_check;
  112.                 }}}

  113. void main()
  114. {
  115.         lcd_init();// 初始化LCD
  116.         while(1)
  117.         {
  118.                 receive();// 接收数据       
  119.                 display(0x00,'R');//LCD 的第一行显示
  120.                 display(0x01,':');
  121.                 display(0x02,RH/10+0x30);         //0x30 表示 带字库的 LCD1602 中 0x30 的位置放有数字 0 RH/10+0x30 即表示湿度的十位数字在字库 RH/10+0x30 的位置处放着
  122.                 display(0x03,RH%10+0x30);
  123.                 display(0x04,'.');
  124.                 display(0x05,RL+0x30);        
  125.                 display(0X06,'%');

  126.                 display(0x40,'T');
  127.                 display(0x41,':');
  128.                 display(0x42,TH/10+0x30);
  129.                 display(0x43,TH%10+0x30);                 
  130.                 display(0x44,'.');
  131.                 display(0x45,TL+0x30);           //温度的小数部分就一位数,范围0-9
  132.                 display(0x46,0xdf);                        //温度单位
  133.                 display(0x47,0x43);
  134.         } }
复制代码

DHT11.zip

3.52 KB, 下载次数: 45, 下载积分: 黑币 -5

回复

使用道具 举报

ID:372579 发表于 2021-7-2 17:28 来自手机 | 显示全部楼层
有原理图配上
回复

使用道具 举报

ID:918298 发表于 2021-8-11 11:11 | 显示全部楼层
为什么我显示的一直是0,我用这个程序和我原来的程序都是显示0,求解?谢谢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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