找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2423|回复: 5
收起左侧

求助利用DHT11进行温湿度调节的风扇的程序传输困难的问题

[复制链接]
ID:350909 发表于 2018-6-13 10:56 | 显示全部楼层 |阅读模式
现在急需大神帮助解决DHT11传输困难的问题,具体程序如下
  1. #include<reg51.h>
  2. #include<intrins.h>

  3. #define   uint         unsigned int
  4. #define   uchar unsigned char //宏的定义变量类型 uchar 代替 unsigned char

  5. typedef unsigned char  BYTE;
  6. typedef unsigned char  WORD;
  7. typedef         bit BOOL;//声明一个布尔型变量,即真或假
  8. sbit io=P2^3;         //dht11data端接单片机的P2^3
  9. sbit rw=P2^0;
  10. sbit rs=P2^1;
  11. sbit ep=P2^2;   //设置LCD1602的使能端
  12. uchar  data_byte;        //单片机接收DHT11的数据
  13. uchar  RH,RL,TH,TL;         //湿度、温度各自的高八位和低八位
  14. void  delay1()  //用于一个FOR循环大概需要8个多机器周期,一个机器周期为1us,晶振12mhz,本延迟函数8us多
  15. {
  16.   uchar  i;                                 
  17.   for(i=0;i<1;i++);
  18. }

  19. BOOL  lcd_bz()    //测试LCD忙碌状态,返回值为布尔型数值,真或假“1”、“‘0”
  20. {
  21.     BOOL   result;
  22.         rs=0; //读忙信号
  23.         rw=1;
  24.         ep=1;
  25.         _nop_();
  26.         _nop_();
  27.         _nop_();
  28.         _nop_();
  29.         result=(BOOL)(P2&0x80);
  30.         ep=0;
  31.         return(result);
  32. }
  33. void  write_cmd(uchar cmd)    //写指令
  34. {
  35.     while(lcd_bz());
  36.     rs=0;
  37.     rw=0;
  38.     ep=0;
  39.     _nop_();
  40.     _nop_();
  41.     P0=cmd;
  42.          _nop_();
  43.     _nop_();
  44.          _nop_();
  45.     _nop_();
  46.         ep=1;
  47.          _nop_();
  48.     _nop_();
  49.          _nop_();
  50.     _nop_();
  51.         ep=0;
  52. }
  53. void write_addr(uchar addr) //写地址
  54. {
  55. write_cmd(addr|0x80);//LCD第一行的首地址为0X80,第二行的首地址为0X80+0X40+0XC0
  56. }
  57. void write_byte(uchar  dat)          //写字节
  58. {
  59.      while(lcd_bz());
  60.     rs=1;
  61.     rw=0;
  62.     ep=0;
  63.     _nop_();
  64.     _nop_();
  65.     P0=dat;
  66.          _nop_();
  67.     _nop_();
  68.          _nop_();
  69.     _nop_();
  70.         ep=1;
  71.          _nop_();
  72.     _nop_();
  73.          _nop_();
  74.     _nop_();
  75.         ep=0;
  76. }
  77. void lcd_init()//LCD初始化
  78. {
  79.   write_cmd(0x38);//设置lcd两行显示,一个数据由5*7点阵表示 ,8位数据接口
  80.   delay(1);
  81.   write_cmd(0x0c);//清除屏幕显示
  82.   delay(1);
  83.   write_cmd(0x06);//设定输入方式,增量不移位
  84.   delay(1);
  85. }
  86. void display(uchar addr,uchar q)//在某地址上显示内容,addr表示的是地址偏移量,q表示的是显示的字符或者数字
  87. {
  88.      delay(10);
  89.          write_addr(addr);
  90.          write_byte(q);
  91.          delay(10);  //修改此时间,可以改变lcd上数值跳变的速度
  92. }
  93. //*****DHT11测试模块**
  94. void  start()//开始信号
  95. {
  96.    io=1;
  97.    delay1();
  98.    io=0;
  99.    delay(25);//主机把总线拉低必须大于18MS  DHT11能检测到起始信号
  100.    io=1;//  20-40us
  101.    delay1();
  102.    delay1();
  103.    delay1();//三个延时函数差不多为24us
  104. }
  105. uchar receive_byte()//接收一个字节
  106. {
  107.      uchar i,temp;
  108.      for(i=0;i<8;i++)//        接收8bit的数据
  109.         {
  110.          while(!io);      //等待50US的低电平开始信号结束
  111.          delay1();       //开始信号结束之后,延时26US-28US以下是三个延时函数
  112.          delay1();
  113.          delay1();
  114.          temp=0;       //时间为26us-28us ,表示接收的数据为“0”
  115.          if(io==1)
  116.          temp=1;      //如果26us-28us之后,还为高电平,则表示接收的数据为“1”
  117.          while(io);   //等待数据信号高电平,“0'为26us-28us,’1‘为70us
  118.          data_byte<<=1;        //接受的数据为高位在前,右移
  119.          data_byte|=temp;
  120.          }
  121.          return data_byte;
  122.         }
  123. void receive()//单片机接收DHT11数据
  124. {
  125.      uchar T_H,T_L,R_H,R_L,check,num_check,i;
  126.          start();//开始信号
  127.          io=1;//主机设为输入,判断从机  DHT11响应信号
  128.          if(!io)//判断从机有低电平响应信号是否结束
  129.         {
  130.           while(!io); //判断从机发出80us的低电平响应信号是否结束
  131.           while(io);//判断从机发出80us的高电平是否结束,如结束则主机进入数据接收状态
  132.          R_H=receive_byte();//湿度高位
  133.          R_L=receive_byte();//湿度低位
  134.          T_H=receive_byte();//温度高位
  135.          T_L=receive_byte();//温度低位
  136.      check=receive_byte();//校验位
  137.      io=0;//当最后一BIT数据接完毕后,从机拉低电平50US
  138.      for(i=0;i<7;i++)  //差不多50US的延时
  139.      delay1();
  140.      io=1;//总线由上拉电阻拉高,进入空闲状态
  141.       num_check=R_H+R_L+T_H+T_L;
  142.       if(num_check==check)//判断读到四个数据之和是否与校验位相同
  143.    {
  144.             RH=R_H;
  145.          RL=R_L;
  146.          TH=T_H;
  147.          TL=T_L;
  148.          check=num_check;
  149.    }
  150.   }
  151. }
  152. //DHT11数据显示程序
  153. void  main()
  154. {
  155.   lcd_init();//初始化LCD
  156.   while(1)
  157.   {
  158.         display(0x00,'R');//LCD的第一行显示
  159.         display(0x01,':');
  160.         display(0x02,RH/10+0x30);//表示带字库的LCD1602中的0x30的位置放有数字0RH/10+0x30即表示湿度的十位数字在字库RH/10+0x30的位置处放着
  161.         display(0x03,RH%10+0x30);
  162.         display(0x04,'%');
  163.         display(0x40,'T');//LCD的第二行显示
  164.         display(0x41,':');
  165.         display(0x42,TH/10+0x30);
  166.         display(0x43,TH%10+0x30);
  167.         display(0x44,0xdf);//以下是两个温度单位的处理
  168.         display(0x45,0x43);
  169.   }
  170. }
复制代码


回复

使用道具 举报

ID:320306 发表于 2018-6-13 13:35 | 显示全部楼层
传输困难是什么问题!!!!!!!!!!!!!!
回复

使用道具 举报

ID:350909 发表于 2018-6-15 12:38 | 显示全部楼层
就是传感器不能把数据传输到单片机,启动后完全没有反应
回复

使用道具 举报

ID:498899 发表于 2019-3-27 09:26 来自手机 | 显示全部楼层
DHT11湿度传感器当开关控制风扇程序如何写
回复

使用道具 举报

ID:246251 发表于 2019-4-1 19:08 | 显示全部楼层
一个个模块功能的排查,先看下DHT11是否正常工作
回复

使用道具 举报

ID:299872 发表于 2019-4-2 04:16 来自手机 | 显示全部楼层
2290692143 发表于 2018-6-15 12:38
就是传感器不能把数据传输到单片机,启动后完全没有反应

你搞个热敏电阻,不就完事了,搞这复杂!!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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