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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于51單片機的DHT11溫濕度控制系統仿真設計 實測可用

  [復制鏈接]
跳轉到指定樓層
樓主
ID:135102 發表于 2017-7-1 21:23 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
單片機驅動DHT11獲取環境溫濕度并在1602顯示,同時可以調整溫濕度的各自的上下限,有提示降溫除濕功能。程序實測可用

原理圖,Proteus仿真文件(需要8.5以上版本才能打開)都有:

單片機源程序如下:
  1. //http://www.zg4o1577.cn/bbs/dpj-51190-1.html
  2. #include <reg51.h>
  3. #include <intrins.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. typedef unsigned char  U8;       /* defined for unsigned 8-bits integer variable    無符號8位整型變量  */
  7. typedef signed   char  S8;       /* defined for signed 8-bits integer variable    有符號8位整型變量  */
  8. typedef unsigned int   U16;      /* defined for unsigned 16-bits integer variable    無符號16位整型變量 */

  9. sbit speek  =P3^4;  //報警
  10. sbit hh     =P2^1;        //高燈
  11. sbit ll     =P2^2;        //高燈

  12. sbit LCD_RS =P1^3;
  13. sbit LCD_RW =P1^4;
  14. sbit LCD_EN =P1^5;
  15. //sbit LCD_RS =P2^4;
  16. //sbit LCD_RW =P2^5;
  17. //sbit LCD_EN =P2^6;

  18. sbit setup  =P1^6;  //  設置+
  19. sbit setdown=P1^7;  //  設置-
  20. sbit set    =P3^0;    //  設置

  21. sbit  P2_0  =P1^0;          //DHT11的DATE
  22. sbit  P2_1  =P3^1;          //串行總線---不用

  23. //----------------------------------------------//
  24. //----------------定義區--------------------//
  25. //----------------------------------------------//
  26. U8  U8FLAG;
  27. U8  U8count,U8temp;
  28. U8  U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
  29. U8  U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
  30. U8  U8comdata;   
  31. U8  indata[5];
  32. U8  count, count_r=0;
  33. U16 U16temp1,U16temp2;
  34. uchar settem_h,settem_l,sethum_h,sethum_l,con=0;
  35. bit sethumbz_h=0,sethumbz_l=0,settembz_h=0,settembz_l=0,setkey;
  36. uchar i;
  37. bit BIAO;
  38. void Delay_1(U16 j)           //100us延時
  39. {   
  40. U8 i;
  41. for(;j>0;j--)
  42. {  
  43.   for(i=0;i<27;i++);         
  44. }
  45. }
  46. //void elay(unsigned int num)//延時函數
  47. //{
  48. //  while( --num );
  49. //}

  50. void  Delay_10us(void)  //進入函數3us
  51. {
  52. U8 i;             //1us
  53. i--;                   //1us
  54. i--;
  55. i--;
  56. i--;
  57. i--;
  58. i--;
  59. }


  60.         

  61. /********************************************************************/
  62. /*                                                                  */
  63. /*檢查LCD忙狀態                                                     */
  64. /*lcd_busy為1時,忙,等待。lcd-busy為0時,閑,可寫指令與數據。       */
  65. /*                                                                  */
  66. /********************************************************************/

  67. bit lcd_busy()
  68. {                          
  69.     bit result;
  70.     LCD_RS = 0;
  71.     LCD_RW = 1;
  72.     LCD_EN = 1;
  73.     _nop_();
  74.     _nop_();
  75.     _nop_();
  76.     _nop_();
  77.     result = (bit)(P0&0x80);
  78.     LCD_EN = 0;
  79.     return result;
  80. }

  81. /********************************************************************/
  82. /*                                                                  */
  83. /*寫指令數據到LCD                                                   */
  84. /*RS=L,RW=L,E=高脈沖,D0-D7=指令碼。                              */
  85. /*                                                                  */
  86. /********************************************************************/

  87. void lcd_wcmd(uchar cmd)

  88. {                          
  89.    while(lcd_busy());
  90.     LCD_RS = 0;
  91.     LCD_RW = 0;
  92.     LCD_EN = 0;
  93.     _nop_();
  94.     _nop_();
  95.     P0 = cmd;
  96.     _nop_();
  97.     _nop_();
  98.     _nop_();
  99.     _nop_();
  100.     LCD_EN = 1;
  101.     _nop_();
  102.     _nop_();
  103.     _nop_();
  104.     _nop_();
  105.     LCD_EN = 0;  
  106. }

  107. /********************************************************************/
  108. /*                                                                  */
  109. /*寫顯示數據到LCD                                                   */
  110. /*RS=H,RW=L,E=高脈沖,D0-D7=數據。                                */
  111. /*                                                                  */
  112. /********************************************************************/

  113. void lcd_wdat(uchar dat)
  114. {                          
  115.    while(lcd_busy());
  116.     LCD_RS = 1;
  117.     LCD_RW = 0;
  118.     LCD_EN = 0;
  119.     P0 = dat;
  120.     _nop_();
  121.     _nop_();
  122.     _nop_();
  123.     _nop_();
  124.     LCD_EN = 1;
  125.     _nop_();
  126.     _nop_();
  127.     _nop_();
  128.     _nop_();
  129.     LCD_EN = 0;
  130. }

  131. /********************************************************************/
  132. /*                                                                  */
  133. /*  LCD初始化設定                                                   */
  134. /*                                                                  */
  135. /********************************************************************/

  136. void lcd_init()
  137. {                        
  138.     lcd_wcmd(0x38);      //16*2顯示,5*7點陣,8位數據
  139.     Delay_1(5);
  140.     lcd_wcmd(0x38);         
  141.     Delay_1(5);
  142.     lcd_wcmd(0x38);         
  143.     Delay_1(5);

  144.     lcd_wcmd(0x0c);      //顯示開,關光標
  145.     Delay_1(5);
  146.     lcd_wcmd(0x06);      //移動光標
  147.     Delay_1(5);
  148.     lcd_wcmd(0x01);      //清除LCD的顯示內容
  149.     Delay_1(5);
  150. }

  151. /********************************************************************/
  152. /*                                                                  */
  153. /*  設定顯示位置                                                    */
  154. /*                                                                  */
  155. /********************************************************************/

  156. void lcd_pos(uchar pos)
  157. {                          
  158.   lcd_wcmd(pos | 0x80);  //數據指針=80+地址變量
  159. }

  160. void LCD1602PutStr(char* s)
  161. {
  162.         uchar i = 0;
  163.         while (*(i + s))
  164.                 {
  165.                 lcd_wdat(*(i + s));
  166.                                 Delay_1(200);
  167.                 i++;
  168.         }
  169. }



  170. void COM(void)                 //串行讀一個字節數據
  171. {
  172. U8 i;
  173. for(i=0;i<8;i++)   
  174. {
  175.   U8FLAG=2;
  176.   while((!P2_0)&&U8FLAG++);        //自加254次 默認執行下面程序 50us低電平結束判斷
  177.   Delay_10us();
  178.   Delay_10us();
  179.   Delay_10us();         
  180.   U8temp=0;
  181.   if(P2_0)U8temp=1;
  182.   U8FLAG=2;
  183.   while((P2_0)&&U8FLAG++);
  184.   
  185.   if(U8FLAG==1)break;  //屏蔽
  186.   U8comdata<<=1;
  187.   U8comdata|=U8temp;      
  188. }

  189. }

  190. //--------------------------------
  191. //-----濕度讀取子程序 ------------
  192. //--------------------------------
  193. //----以下變量均為全局變量--------
  194. //----溫度高8位== U8T_data_H------
  195. //----溫度低8位== U8T_data_L------
  196. //----濕度高8位== U8RH_data_H-----
  197. //----濕度低8位== U8RH_data_L-----
  198. //----校驗 8位 == U8checkdata-----
  199. //----調用相關子程序如下----------
  200. //---- Delay();, Delay_10us();,COM();
  201. //--------------------------------

  202. void RH(void)
  203. {  TR0=0;
  204.   //主機拉低18ms
  205.    P2_0=0;
  206.    Delay_1(180);
  207.    P2_0=1;
  208. //總線由上拉電阻拉高 主機延時20us
  209.    Delay_10us();
  210.    Delay_10us();
  211.    Delay_10us();
  212.    Delay_10us();
  213.    P2_0=1;  
  214.    //主機設為輸入 判斷從機響應信號
  215.    if(!P2_0) //判斷從機是否有低電平響應信號 如不響應則不讀數據,響應則向下運行     
  216.     {        //speek=0;
  217.             U8FLAG=2;
  218.             while((!P2_0)&&U8FLAG++);
  219.             U8FLAG=2;
  220.             while((P2_0)&&U8FLAG++);
  221.             //數據接收狀態   
  222.             COM();
  223.             U8RH_data_H_temp=U8comdata;
  224.             COM();
  225.             U8RH_data_L_temp=U8comdata;
  226.             COM();
  227.             U8T_data_H_temp=U8comdata;
  228.             COM();
  229.             U8T_data_L_temp=U8comdata;
  230.             COM();
  231.             U8checkdata_temp=U8comdata;
  232.             P2_0=1;
  233.             //數據校驗
  234.          
  235.             U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
  236.             if(U8temp==U8checkdata_temp)
  237.             {
  238.                U8RH_data_H=U8RH_data_H_temp;
  239.                U8RH_data_L=U8RH_data_L_temp;
  240.                U8T_data_H=U8T_data_H_temp;
  241.                U8T_data_L=U8T_data_L_temp;
  242.                U8checkdata=U8checkdata_temp;
  243.                   
  244.             }
  245.                 TR0=1;
  246.    }

  247. }

  248. void Disp_Temperature()//顯示溫度
  249. {
  250. //unsigned char  n=0;
  251. //  display[4]=temp_data[0]&0x0f;
  252. //  display[0]=ditab[display[4]];     //查表得小數位的值
  253. //  display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
  254.                 Delay_1(200);
  255.         lcd_pos(0x04);
  256.         lcd_wdat('0'+U8RH_data_H/10);  /* 顯示濕度 */
  257.                 Delay_1(200);
  258.         lcd_wdat('0'+U8RH_data_H%10);  

  259.                  Delay_1(200);
  260.         lcd_pos(0x44);
  261.         lcd_wdat('0'+U8T_data_H/10);  /* 顯示溫度*/
  262.                  Delay_1(200);
  263.         lcd_wdat('0'+U8T_data_H%10);

  264.                 Delay_1(200);
  265.         lcd_pos(9);
  266.         lcd_wdat('0' + sethum_h / 10);
  267.                 Delay_1(200);
  268.         lcd_wdat('0' + sethum_h % 10); /* 顯示濕度上限 */
  269.                 Delay_1(200);
  270.         lcd_pos(13);
  271.         lcd_wdat('0' + sethum_l / 10);
  272.                 Delay_1(200);
  273.         lcd_wdat('0' + sethum_l % 10); /* 顯示濕度下限 */               
  274.         
  275.                 Delay_1(200);
  276.         lcd_pos(0x49);
  277.         lcd_wdat('0' + settem_h / 10);
  278.                 Delay_1(200);
  279.         lcd_wdat('0' + settem_h % 10); /* 顯示溫度上限 */

  280.                 Delay_1(200);
  281.         lcd_pos(0x4d);
  282.         lcd_wdat('0' + settem_l / 10);
  283.          Delay_1(200);
  284.         lcd_wdat('0' + settem_l % 10); /* 顯示溫度下限 */
  285.         

  286.            if ((settembz_h==0)&&(settembz_l)&&(sethumbz_h)&&(sethumbz_l))
  287.            {
  288.                      lcd_pos(0x4f);         //消濕度下限的箭頭
  289.          lcd_wdat(' ');
  290.                  Delay_1(10);
  291.          lcd_pos(0x0f);
  292.          lcd_wdat(' ');
  293.            
  294.            }

  295.            if (settembz_h)
  296.         {
  297.          lcd_pos(0x4f);         //消濕度下限的箭頭
  298.          
  299. ……………………

  300. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
基于51單片機的DHT11溫濕度控制系統.rar (2.05 MB, 下載次數: 345)


評分

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

查看全部評分

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

使用道具 舉報

來自 2#
ID:698121 發表于 2020-3-2 17:54 | 只看該作者
為什么仿真的時候液晶屏不顯示溫濕度呢
回復

使用道具 舉報

板凳
ID:135102 發表于 2017-7-1 21:25 | 只看該作者
stc12c5a60s2用不了,實測AT89C52RC可用,晶振11.0592MHZ
回復

使用道具 舉報

地板
ID:88606 發表于 2017-8-23 09:21 | 只看該作者
看樓下的 說明,剛好手頭有stc12c5a60s2,來試試否真的不能用!
回復

使用道具 舉報

5#
ID:101093 發表于 2017-8-23 11:56 | 只看該作者
回頭試試,看能不能用!
回復

使用道具 舉報

6#
ID:235332 發表于 2019-10-16 16:01 | 只看該作者
代碼和仿真圖的管腳不一樣
回復

使用道具 舉報

7#
ID:634994 發表于 2019-11-3 20:57 | 只看該作者
感謝 太實用了
回復

使用道具 舉報

8#
ID:505668 發表于 2020-4-20 19:31 | 只看該作者
仿真不了。。。
回復

使用道具 舉報

9#
ID:773644 發表于 2020-6-9 09:59 來自手機 | 只看該作者
為什么什么8.6都打不開他的仿真
回復

使用道具 舉報

10#
ID:557673 發表于 2020-7-27 18:21 | 只看該作者
仿真運行無顯示啊
回復

使用道具 舉報

11#
ID:510607 發表于 2020-10-6 00:16 | 只看該作者
沒有顯示呀
回復

使用道具 舉報

12#
ID:109079 發表于 2020-10-6 21:39 | 只看該作者
本帖最后由 清風碧雪 于 2020-10-6 22:17 編輯

DHT11這種溫濕度傳感器前些日子玩過,在單位倉庫里發現的,單位一些配電柜里用這玩意。清庫存的時候弄了幾個,這玩意只能顯示兩位整數而且個體間差異太大,代換性不好,濕度就更離譜了。傳一個采用12232液晶屏顯示的程序。

12232C.rar

55.25 KB, 下載次數: 11, 下載積分: 黑幣 -5

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产免费xxx | 久久视频免费看 | 中文字幕一区二区三区在线观看 | 中文字幕一级 | 免费观看一级特黄欧美大片 | 亚洲综合在线视频 | 亚洲乱码一区二区三区在线观看 | h网站在线观看 | 国产精品永久久久久 | 日韩视频在线一区 | 国产乱码久久久久久 | 久久国产精品免费视频 | 草草草影院 | 国产97视频在线观看 | 亚洲 中文 欧美 | 国产激情第一页 | 国产精品中文字幕在线观看 | www.性色| 亚洲免费在线观看av | 日韩精品免费播放 | 欧美激情视频一区二区三区免费 | 不卡在线视频 | 国产欧美久久一区二区三区 | 日韩在线一区二区三区 | 久久久久久亚洲精品不卡 | 中文一区 | 香蕉一区二区 | 黑人精品 | 成人精品鲁一区一区二区 | 狠狠撸在线视频 | 亚洲视频免费 | 国产区精品在线观看 | 毛片站| 欧美午夜精品久久久久久浪潮 | 最近日韩中文字幕 | 亚洲成人精品 | 日韩久草 | 亚洲欧美中文日韩在线v日本 | 91免费在线| 一本色道久久综合亚洲精品高清 | 久草综合在线视频 |