找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于89c51的dht11温湿度检测1602显示(附加串口显示)

  [复制链接]
跳转到指定楼层
楼主


全部资料51hei下载地址:
DHT11 串口显示.rar (44.77 KB, 下载次数: 355)

单片机源码:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. uchar str1[]={"  "},str2[]={"  "};
  6. sbit dat=P2^0; //dht11 dat端口
  7. sbit EN=P3^4;
  8. sbit RS=P3^5;  
  9. sbit RW=P3^6;
  10. uchar TH_data,TL_data,RH_data,RL_data,CK_data;
  11. uchar FLAG,k,count,temp,comdata;
  12. uchar T_data_H,T_data_L,RH_data_H,RH_data_L,checkdata;
  13. uchar T_data_H_temp,T_data_L_temp,RH_data_H_temp,
  14.       RH_data_L_temp,checkdata_temp;
  15. void delayms(uint x)   
  16. {
  17.         uint y;
  18.         for(;x>0;x--)
  19.                 for(y=110;y>0;y--);
  20. }
  21. void Delay(uint j) //100us
  22. {      
  23.         uchar i;
  24.         for(;j>0;j--)        
  25.                 for(i=0;i<27;i++);
  26. }
  27. void Delay_10us(void)
  28. {
  29.         uchar i;
  30.         i--;
  31.         i--;
  32.         i--;
  33.         i--;
  34.         i--;
  35.         i--;
  36. }
  37. bit LCD_Check_Busy(void)
  38. {
  39.         P0=0xFF;
  40.         RS=0;
  41.         RW=1;
  42.         EN=0;
  43.         _nop_();
  44.         EN=1;
  45.         return(bit)(P0&0x80);
  46. }
  47. void LCD_Write_Com(uchar com)
  48. {  
  49.         while(LCD_Check_Busy()); //忙则等待
  50.         RS=0;
  51.         RW=0;
  52.         P0=com;
  53.         _nop_();
  54.         EN=1;  
  55.         _nop_();
  56.         EN=0;
  57. }
  58. void LCD_Write_Data(uchar Data)
  59. {
  60.         while(LCD_Check_Busy()); //忙则等待
  61.         RS=1;
  62.         RW=0;
  63.         P0=Data;
  64.         _nop_();
  65.         EN=1;  
  66.         _nop_();
  67.         EN=0;
  68. }
  69. void LCD_Write_String(uchar x,y,uchar *s)
  70. {     
  71.         if(y==0)
  72.         {     
  73.                 LCD_Write_Com(0x80+x); //表示第一行
  74.          }
  75.         else
  76.         {      
  77.                 LCD_Write_Com(0xC0+x); //表示第二行
  78.         }        
  79.         while(*s)
  80.         {     
  81.                 LCD_Write_Data(*s);     
  82.                 s++;     
  83.          }
  84. }
  85. void LCD_Write_Char(uchar x,y,Data)
  86. {     
  87.         if (y==0)
  88.         {     
  89.                 LCD_Write_Com(0x80+x);     
  90.         }   
  91.         else
  92.         {     
  93.                 LCD_Write_Com(0xC0+x);     
  94.          }        
  95.         LCD_Write_Data(Data);  
  96. }
  97. void LCD_Init(void)
  98. {
  99.         LCD_Write_Com(0x01); //清屏
  100.         LCD_Write_Com(0x38);   
  101.         LCD_Write_Com(0x08); //显示关闭
  102.         LCD_Write_Com(0x01); //显示清屏
  103.         LCD_Write_Com(0x06); //显示光标移动设置  
  104.         LCD_Write_Com(0x0C); //显示开及光标设置
  105. }      
  106. void COM(void)
  107. {
  108.         uchar i;
  109.         for(i=0;i<8;i++)           
  110.         {               
  111.                 FLAG=2;        
  112.                 while((!dat)&&FLAG++);
  113.                 Delay_10us();
  114.                 Delay_10us();
  115.                 Delay_10us();
  116.                 temp=0;
  117.                 if(dat)temp=1;
  118.                 FLAG=2;
  119.                 while((dat)&&FLAG++); //超时则跳出for循环                  
  120.                 if(FLAG==1) //判断数据位是0还是1
  121.                         break; //如果高电平高过预定0高电平值则数据位为 1
  122.                 comdata<<=1;
  123.                 comdata|=temp;        //0
  124.         }           
  125. }
  126. void RH(void)
  127. {
  128.         dat=0;
  129.         Delay(200);        
  130.         dat=1;
  131.         Delay_10us(); //总线由上拉电阻拉高 主机延时20us
  132.         Delay_10us();
  133.         Delay_10us();
  134.         Delay_10us();
  135.         //主机设为输入 判断从机响应信号
  136.         dat=1;
  137.         //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行         
  138.         if(!dat)  //T !         
  139.         {
  140.                 FLAG=2;
  141.                 //判断从机是否发出 80us 的低电平响应信号是否结束         
  142.                 while((!dat)&&FLAG++);
  143.                 FLAG=2;
  144.                 //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
  145.                 while((dat)&&FLAG++);
  146.                 //数据接收状态                 
  147.                 COM();
  148.                 RH_data_H_temp=comdata;
  149.                 COM();
  150.                 RH_data_L_temp=comdata;
  151.                 COM();
  152.                 T_data_H_temp=comdata;
  153.                 COM();
  154.                 T_data_L_temp=comdata;
  155.                 COM();
  156.                 checkdata_temp=comdata;
  157.                 dat=1; //数据校验         
  158.                 temp=(T_data_H_temp+T_data_L_temp+RH_data_H_temp+RH_data_L_temp);
  159.                 if(temp==checkdata_temp)
  160.                 {
  161.                         RH_data_H=RH_data_H_temp;
  162.                         RH_data_L=RH_data_L_temp;
  163.                         T_data_H=T_data_H_temp;
  164.                         T_data_L=T_data_L_temp;
  165.                         checkdata=checkdata_temp;
  166.                 }
  167.         }      
  168. }      
  169. void main()
  170. {      
  171.                 LCD_Init();
  172.                 Delay(20000);
  173.                 LCD_Write_String(0,0,"shidu:");
  174.                 LCD_Write_String(0,1,"wendu:");
  175.                 LCD_Write_Char(9,0,'%');
  176.                 LCD_Write_Char(10,1,'C');
  177.                 //LCD_Write_String(10,1,"C");
  178.                 LCD_Write_String(10,0," RH");
  179.                 Delay(1);      
  180.         while(1)
  181.         {  
  182.                         RH();
  183.                         RH_data=RH_data_H; //把湿度整数给予SRT0.(直接使用即可)
  184.                         RL_data=RH_data_L; //把湿度小数给予SRT1.==0(为零,不用)
  185.                         TH_data=T_data_H;  //把温度整数给予SRT2.(直接使用即可)
  186.                         TL_data=T_data_L;  //把温度小数给予SRT3.==0(为零,不用)
  187.                         CK_data=checkdata; //校验位(不用)                                
  188.                         str1[0]=(char)(0x30+RH_data/10); //湿度整数部分
  189.                         str1[1]=(char)(0x30+RH_data%10);                                
  190.                         str2[0]=(char)(0x30+TH_data/10); //温度整数部分
  191.                         str2[1]=(char)(0x30+TH_data%10);                                                
  192.                         LCD_Write_Char(7,0,str1[0]); //显示湿度        
  193.                         LCD_Write_Char(8,0,str1[1]);                                       
  194.                         LCD_Write_Char(7,1,str2[0]); //显示温度        
  195.                         LCD_Write_Char(8,1,str2[1]);                                                                 
  196.                         Delay(20000); //读取模块数据周期不易小于 2S
  197.         }     
  198. }
复制代码


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:334737 发表于 2018-5-22 15:37 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

板凳
ID:258975 发表于 2018-6-11 12:07 | 只看该作者
为什么我的串口显示的是乱码
回复

使用道具 举报

地板
ID:317625 发表于 2018-6-12 09:04 | 只看该作者
gugugu 发表于 2018-6-11 12:07
为什么我的串口显示的是乱码

接受选择不要用十六进制  字符接收即可 应该是 printf 做的输出
回复

使用道具 举报

5#
ID:381859 发表于 2018-8-18 15:17 | 只看该作者
请问。要想在这个程序中加报警系统,怎么弄啊
回复

使用道具 举报

6#
ID:359667 发表于 2018-12-4 17:53 | 只看该作者
gugugu 发表于 2018-6-11 12:07
为什么我的串口显示的是乱码

你好,这个程序烧进去后在串口助手显示的也是乱码(在文本模式下是汉字的那种乱码),想问一下你是怎么解决的
回复

使用道具 举报

7#
ID:242804 发表于 2018-12-4 18:30 | 只看该作者
学习了,感谢分享
回复

使用道具 举报

8#
ID:406408 发表于 2018-12-5 10:50 来自手机 | 只看该作者
最近正想做一个,学习了。
回复

使用道具 举报

9#
ID:499446 发表于 2019-3-27 21:53 | 只看该作者
楼楼大人可以发送一份完整的在串口助手中显示大代码?
回复

使用道具 举报

10#
ID:483579 发表于 2019-4-7 15:09 来自手机 | 只看该作者
liding12356 发表于 2018-12-4 18:30
学习了,感谢分享

可以发我一份完整资料嘛?2756873747@qq.com
回复

使用道具 举报

11#
ID:483579 发表于 2019-4-7 15:10 来自手机 | 只看该作者
楼主可以发我一份完整资料嘛?2756873747@qq.com
回复

使用道具 举报

12#
ID:163730 发表于 2019-6-21 23:21 | 只看该作者
谢谢分享!
回复

使用道具 举报

13#
ID:561669 发表于 2019-7-3 11:22 | 只看该作者
厉害厉害,非常感谢啊
回复

使用道具 举报

14#
ID:561669 发表于 2019-7-3 11:22 | 只看该作者
这篇程序非常棒
回复

使用道具 举报

15#
ID:282095 发表于 2019-7-3 11:54 | 只看该作者
数据帧的传送
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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