久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3101|回復: 0
打印 上一主題 下一主題
收起左側

51單片機1602+dht11實時顯示溫度程序

[復制鏈接]
跳轉到指定樓層
樓主
本帖最后由 清泉映殘月 于 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 (113.71 KB, 下載次數: 55)

51hei圖片_20200420191336.jpg

溫濕報警.rar

3.65 KB, 下載次數: 38, 下載積分: 黑幣 -5

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产精选 | 欧美区在线 | 中文字幕免费 | 亚州精品天堂中文字幕 | 在线亚洲人成电影网站色www | 国产亚洲人成a在线v网站 | 久久国产精品视频 | 91久久精品国产91久久 | 久久国产精品-久久精品 | 国产精品久久久久久 | 黄色毛片一级 | 伦理二区 | 羞羞的视频免费看 | 日本不卡一区二区三区在线观看 | 91精品国产综合久久精品 | 国产大片一区 | 青青草免费在线视频 | 久久久免费 | 美女在线国产 | 欧美成人精品一区二区男人看 | 欧美美女二区 | 久色网| 成人精品一区二区三区中文字幕 | 日日摸日日添日日躁av | 日韩欧美在线视频 | 午夜亚洲 | 美女久久视频 | 国产成人精品一区二区三区在线 | 欧美精品一区二区在线观看 | 精品久久国产 | 不卡一区二区三区四区 | 欧美日韩精品一区二区 | 午夜视频在线播放 | 国产成人免费视频网站高清观看视频 | 超碰日本 | av日日操 | 精品日韩一区 | 中文字幕精品一区二区三区精品 | 国产精品日本一区二区在线播放 | 久久久综合色 | 一区二区三区国产 |