找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2733|回复: 0
收起左侧

51单片机1602+dht11实时显示温度程序

[复制链接]
ID:727137 发表于 2020-4-20 19:51 | 显示全部楼层 |阅读模式
本帖最后由 清泉映残月 于 2020-4-20 19:54 编辑

学习51单片机C语言编程6天,成功实现通过液晶实时显示周围环境温湿度,当与所设温湿度区间不符立即蜂鸣报警(报警音是---八月桂花),具有一键报警消音功能,设置键按一次设置湿度上限,两次湿度下限,三次温度上限,四次温度下限,五次退出设置部分代码如下
  1. /*-----------------------------------------------
  2. 硬件:单片机AT89C52、液晶1602、温湿传感器DHT11、晶振11.0592M
  3. 功能:实时显示周围环境温湿度,与所设温湿度区间不符立即蜂鸣报警,
  4.           具有报警消音功能,s1循环设置,s2加,s3减,s4报警消音  
  5. 通讯连接:P0口与液晶1602通讯,P3.7口与温湿传感器DHT11通讯连接
  6. ------------------------------------------------*/
  7. #include <reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
  8. #include <intrins.h>
  9. #include <math.h>
  10. #define uchar unsigned char
  11. #define uint unsigned int        
  12. sbit RS = P2^3;   //定义端口
  13. sbit RW = P2^4;
  14. sbit EN = P2^5;
  15. sbit Data = P3^7;//定义数据线
  16. sbit moshi=P2^6;   //模式切换
  17. sbit INC=P2^7;     //加
  18. sbit DEC=P2^0;     //减
  19. sbit SPK=P3^6;     //蜂鸣报警
  20. sbit XY=P2^1;           //蜂鸣报警消音
  21. uchar rec_dat0[16];   //用于显示的接收数据数组
  22. uchar rec_dat1[16];
  23. uchar countRH=95,countRL=20,moshicount=0,n=0;//n为报警音乐节拍常数变量
  24. uchar RH,RL,TH,TL;
  25. char   countTH=50,countTL=0;
  26. void xiaoyin();
  27. unsigned char code music_tab[] ={   
  28. 0x18, 0x30, 0x1C , 0x10, //格式为: 频率常数, 节拍常数, 频率常数, 节拍常数,   
  29. 0x20, 0x40, 0x1C , 0x10,   
  30. 0x18, 0x10, 0x20 , 0x10,   
  31. 0x1C, 0x10, 0x18 , 0x40,   
  32. 0x1C, 0x20, 0x20 , 0x20,   
  33. 0x1C, 0x20, 0x18 , 0x20,   
  34. 0x20, 0x80, 0xFF , 0x20,   
  35. 0x30, 0x1C, 0x10 , 0x18,   
  36. 0x20, 0x15, 0x20 , 0x1C,   
  37. 0x20, 0x20, 0x20 , 0x26,   
  38. 0x40, 0x20, 0x20 , 0x2B,   
  39. 0x20, 0x26, 0x20 , 0x20,   
  40. 0x20, 0x30, 0x80 , 0xFF,   
  41. 0x20, 0x20, 0x1C , 0x10,   
  42. 0x18, 0x10, 0x20 , 0x20,   
  43. 0x26, 0x20, 0x2B , 0x20,   
  44. 0x30, 0x20, 0x2B , 0x40,   
  45. 0x20, 0x20, 0x1C , 0x10,   
  46. 0x18, 0x10, 0x20 , 0x20,   
  47. 0x26, 0x20, 0x2B , 0x20,   
  48. 0x30, 0x20, 0x2B , 0x40,   
  49. 0x20, 0x30, 0x1C , 0x10,   
  50. 0x18, 0x20, 0x15 , 0x20,   
  51. 0x1C, 0x20, 0x20 , 0x20,   
  52. 0x26, 0x40, 0x20 , 0x20,   
  53. 0x2B, 0x20, 0x26 , 0x20,   
  54. 0x20, 0x20, 0x30 , 0x80,   
  55. 0x20, 0x30, 0x1C , 0x10,   
  56. 0x20, 0x10, 0x1C , 0x10,   
  57. 0x20, 0x20, 0x26 , 0x20,   
  58. 0x2B, 0x20, 0x30 , 0x20,   
  59. 0x2B, 0x40, 0x20 , 0x15,   
  60. 0x1F, 0x05, 0x20 , 0x10,   
  61. 0x1C, 0x10, 0x20 , 0x20,   
  62. 0x26, 0x20, 0x2B , 0x20,   
  63. 0x30, 0x20, 0x2B , 0x40,   
  64. 0x20, 0x30, 0x1C , 0x10,   
  65. 0x18, 0x20, 0x15 , 0x20,   
  66. 0x1C, 0x20, 0x20 , 0x20,   
  67. 0x26, 0x40, 0x20 , 0x20,   
  68. 0x2B, 0x20, 0x26 , 0x20,   
  69. 0x20, 0x20, 0x30 , 0x30,   
  70. 0x20, 0x30, 0x1C , 0x10,   
  71. 0x18, 0x40, 0x1C , 0x20,   
  72. 0x20, 0x20, 0x26 , 0x40,   
  73. 0x13, 0x60, 0x18 , 0x20,   
  74. 0x15, 0x40, 0x13 , 0x40,   
  75. 0x18, 0x80, 0x00   
  76. };

  77. #define RS_CLR RS=0
  78. #define RS_SET RS=1

  79. #define RW_CLR RW=0
  80. #define RW_SET RW=1

  81. #define EN_CLR EN=0
  82. #define EN_SET EN=1

  83. #define DataPort P0


  84. /*------------------------------------------------
  85. uS延时函数,含有输入参数 unsigned char t,无返回值
  86. unsigned char 是定义无符号字符变量,其值的范围是
  87. 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
  88. 长度如下 T=tx2+5 uS
  89. ------------------------------------------------*/
  90. void DelayUs2x(unsigned int t)
  91. {   
  92. while(--t);
  93. }
  94. /*------------------------------------------------
  95. mS延时函数,含有输入参数 unsigned char t,无返回值
  96. unsigned char 是定义无符号字符变量,其值的范围是
  97. 0~255 这里使用晶振12M,精确延时请使用汇编
  98. ------------------------------------------------*/
  99. void DelayMs(unsigned char t)
  100. {
  101.      
  102. while(t--)
  103. {
  104.      //大致延时1mS
  105.      DelayUs2x(245);
  106.          DelayUs2x(245);
  107. }
  108. }

  109. void delay (unsigned char m)   //控制频率延时   
  110. {   
  111. unsigned i=3*m;   
  112. while(--i);  
  113. }  

  114. /*------------------------------------------------
  115.               判忙函数
  116. ------------------------------------------------*/
  117. bit LCD_Check_Busy(void)
  118. {
  119. DataPort= 0xFF;
  120. RS_CLR;
  121. RW_SET;
  122. EN_CLR;
  123. _nop_();
  124. EN_SET;
  125. return (bit)(DataPort & 0x80);
  126. }
  127. /*------------------------------------------------
  128.               写入命令函数
  129. ------------------------------------------------*/
  130. void LCD_Write_Com(unsigned char com)
  131. {  
  132. while(LCD_Check_Busy()); //忙则等待
  133. RS_CLR;
  134. RW_CLR;
  135. EN_SET;
  136. DataPort= com;
  137. _nop_();
  138. EN_CLR;
  139. }
  140. /*------------------------------------------------
  141.               写入数据函数
  142. ------------------------------------------------*/
  143. void LCD_Write_Data(unsigned char Data)
  144. {
  145. while(LCD_Check_Busy()); //忙则等待
  146. RS_SET;
  147. RW_CLR;
  148. EN_SET;
  149. DataPort= Data;
  150. _nop_();
  151. EN_CLR;
  152. }


  153. /*------------------------------------------------
  154.               写入字符函数
  155. ------------------------------------------------*/
  156. void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
  157. {     
  158. if (y == 1)
  159.          {     
  160.          LCD_Write_Com(0x80 + x);     
  161.          }   
  162. else
  163.          {     
  164.          LCD_Write_Com(0xC0 + x);     
  165.          }        
  166. LCD_Write_Data( Data);  
  167. }
  168. /*------------------------------------------------
  169.               初始化函数
  170. ------------------------------------------------*/
  171. void LCD_Init(void)
  172. {
  173.    LCD_Write_Com(0x38);        //设置 8 位格式,2 行,5x7
  174.    LCD_Write_Com(0x0C);        //整体显示,关光标,不闪烁
  175.    LCD_Write_Com(0x06);        //写一个字符后地址指针加 1,设定输入方式,增量不移位
  176.    LCD_Write_Com(0x01); //清除屏幕显示
  177.    DelayMs(5);  
  178.    }

  179. //*******定时器初始化函数**********
  180. void timerinit()         //采用中断0 控制节拍   
  181. {
  182.         TMOD=0x01;//设置定时器0为工作方式1
  183.         TH0=0xd8;        
  184.         TL0=0xef;
  185.         EA=1; //开总中断                  
  186.         ET0=1;//开定时器0中断
  187. }        
  188. //********************************   

  189. /*------------------------------------------------
  190.               DHT11延时函数
  191. ------------------------------------------------*/
  192. void DHT11_delay_us(uchar n)//2微秒延时
  193. {
  194.     while(--n);
  195. }

  196. void DHT11_delay_ms(uint z)//1毫秒延时
  197. {
  198.    uint i,j;
  199.    for(i=z;i>0;i--)
  200.       for(j=110;j>0;j--);
  201. }
  202. /*------------------------------------------------
  203.               DHT11开始信号
  204. ------------------------------------------------*/
  205. void DHT11_start()
  206. {
  207.    Data=1;
  208.    DHT11_delay_us(2);
  209.    Data=0;
  210.    DHT11_delay_ms(20);   //延时18ms以上
  211.    Data=1;
  212.    DHT11_delay_us(30);
  213. }
  214. /*------------------------------------------------
  215.               接收八位二进制
  216. ------------------------------------------------*/
  217. uchar DHT11_rec_byte()      //接收一个字节
  218. {
  219.    uchar i,dat=0;
  220.   for(i=0;i<8;i++)    //从高到低依次接收8位数据
  221.    {         
  222.       while(!Data);   ////等待50us低电平过去
  223.       DHT11_delay_us(8);     //延时60us,如果还为高则数据为1,否则为0
  224.       dat<<=1;           //移位使正确接收8位数据,数据为0时直接移位
  225.       if(Data==1)    //数据为1时,使dat加1来接收数据1
  226.          dat+=1;
  227.       while(Data);  //等待数据线拉低   
  228.     }  
  229.     return dat;
  230. }
  231. /*------------------------------------------------
  232.               接收40bit数据
  233. ------------------------------------------------*/
  234. void DHT11_receive()      //接收40位的数据
  235. {
  236.     uchar R_H,R_L,T_H,T_L,revise;
  237.     DHT11_start();

  238.     if(Data==0)
  239.     {
  240.         
  241.         while(Data==0);   //等待拉高     
  242.                
  243.         DHT11_delay_us(40);  //拉高后延时80us
  244.         R_H=DHT11_rec_byte();    //接收湿度高八位  
  245.         R_L=DHT11_rec_byte();    //接收湿度低八位  
  246.         T_H=DHT11_rec_byte();    //接收温度高八位  
  247.         T_L=DHT11_rec_byte();    //接收温度低八位
  248.         revise=DHT11_rec_byte(); //接收校正位
  249.                         
  250.         DHT11_delay_us(25);    //结束

  251.         if((R_H+R_L+T_H+T_L)==revise)      //校正
  252.         {
  253.             RH=R_H;
  254.             RL=R_L;
  255.             TH=T_H;
  256.             TL=T_L;
  257.                         rec_dat0[0]=RH/10;
  258.                         rec_dat0[1]=RH%10;
  259.                         rec_dat1[0]=TH/10;
  260.                         rec_dat1[1]=TH%10;
  261.         }

  262.     }
  263. }

复制代码

51hei图片_20200420191336.jpg

温湿报警.rar

3.65 KB, 下载次数: 38, 下载积分: 黑币 -5

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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