找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机控制温湿度传感器DHt11程序错误 求帮助

[复制链接]
跳转到指定楼层
楼主
ID:274459 发表于 2018-1-10 18:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机源程序如下:
  1. //51单片机控制温湿度传感器DHT11 然后在LCD1602上显示当前的温湿度及单位 其中湿度在第一行显示 温度在第二行显示。单片机为YL-9最小系统。
  2. # include <reg51.h>
  3. # include <intrins.h>
  4. typedef unsigned char BYTE;
  5. typedef unsigned int WORD;
  6. #define uint unsigned int
  7. #define uchar unsigned char
  8. sbit io=P1^0;//dht11data端接单片机的P1^0口//
  9. sbit rw=P2^1;//一下三行是设置lcd1602的使能端//
  10. sbit rs=P2^0;
  11. sbit ep=P2^2;
  12. typedef bit BOOL;//此声明一个布尔型变量即真或假//
  13. uchar data_byte;
  14. uchar RH,RL,TH,TL;
  15. //***************延时函数*************************************
  16. void delay(uchar ms) //延时模块//
  17. {
  18.   uchar i;
  19.   while(ms--)               
  20.       
  21. for(i=0;i<100;i++);
  22. }
  23. void delay1()//一个for循环大概需要8个多机器周期 一个机器周期为1us 晶振为12MHz  也就是说本函数延时8us多 此延时函数必须德稍微精确一点
  24. {
  25.   uchar i;
  26.   for(i=0;i<1;i++);
  27. }

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

以上代码51hei提供下载:
51单片机控制温湿度传感器DH.doc (24.5 KB, 下载次数: 102)


评分

参与人数 1黑币 +5 收起 理由
spirit小杰 + 5 能不能私发完整的代码给我,急需 谢谢

查看全部评分

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

使用道具 举报

沙发
ID:260698 发表于 2018-10-11 00:52 | 只看该作者
楼主自己都没把程序弄明白!
回复

使用道具 举报

板凳
ID:808911 发表于 2020-7-28 18:36 | 只看该作者
是程序有问题还是什么,为什么不能生产hex文件
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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