找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8734|回復(fù): 14
打印 上一主題 下一主題
收起左側(cè)

基于51單片機(jī)溫濕度檢測系統(tǒng) protues仿真

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
本次設(shè)計(jì)采用的單片機(jī)AT89C52DHT11的溫度濕度的檢測系統(tǒng)。分為硬件電路設(shè)計(jì)和單片機(jī)程序設(shè)計(jì)。硬件電路包括單片機(jī)、溫濕度傳感器、顯示模塊、報(bào)警模塊以及按鍵。之所以采用AT89C52DHT11溫濕度傳感器及OLED顯示模塊,是要保證工作穩(wěn)定、集成度高、測量精度高、成本低,其中測溫濕度控制電路由溫濕度傳感器和預(yù)設(shè)溫度限制以及報(bào)警電路組成,根據(jù)需要通過按鍵預(yù)先輸入溫濕度的上下限,當(dāng)實(shí)際測量的溫濕度大于或小于預(yù)設(shè)的限制時(shí),蜂鳴器發(fā)出報(bào)警信號并報(bào)警燈亮紅。單片機(jī)程序主要包括主程序、顯示子程序、測量溫濕度和設(shè)置溫濕度上下限子程序。
原理圖:

protues仿真圖:


proteus仿真結(jié)果
測量溫度(℃)
測量濕度(%)
溫度設(shè)定范圍
濕度設(shè)定范圍
現(xiàn)象
42
55
29-40℃
23-63%
報(bào)警器響起,紅燈亮
30
55
29-40℃
23-63%
報(bào)警器不響,綠亮
30
66
29-40℃
23-63%
報(bào)警器響起,紅燈亮
42
66
29-40℃
23-63%
報(bào)警器響起,紅燈亮


  1. #include<reg52.h>          //頭文件
  2. #include<LCD1602.h>
  3. #include<AT24C02.h>
  4. #include<DHT11.h>
  5. #include<oled.h>
  6. /*****************燈、蜂鳴器、按鍵引腳定義*******************/
  7. sbit led     = P3^7;  //超限指示燈
  8. sbit led1    = P3^2;  //正常指示燈
  9. sbit buzz    = P2^3;  //蜂鳴器
  10. sbit key_set = P1^5;  //設(shè)置鍵
  11. sbit key_jia = P1^6;  //加鍵
  12. sbit key_jian= P1^7;  //減鍵

  13. /************************變量定義***********************/
  14. uchar temp_old,humi_old;//存儲上一次的溫度、濕度
  15. uchar temp_up,temp_down;//存儲溫度上、下限值
  16. uchar humi_up,humi_down;//存儲濕度上、下限值
  17. uchar set_f;                               //設(shè)置選擇標(biāo)記,=0非設(shè)置,=1設(shè)置濕度上限,=2設(shè)置濕度下限
  18.                                                       //              =3設(shè)置溫度上限,=4設(shè)置溫度下限。

  19. void jiexianw();
  20. void Delay_1ms(uint i);

  21. /********************************************************
  22. 函數(shù)名稱:void display(void)
  23. 函數(shù)作用:oled顯示固定作用
  24. 參數(shù)說明:
  25. ********************************************************/
  26. void fixed_display(void)
  27. {
  28.         OLED_ShowString(0,0,"Temp:"); //固定位置顯示“Temp:”
  29.         OLED_ShowString(56,0,".");    //固定位置顯示“.”
  30.         OLED_ShowString(80,0,"C");    //固定位置顯示“C”
  31.         OLED_ShowString(0,1,"Humi:"); //固定位置顯示“Humi:”
  32.         OLED_ShowString(56,1,".");    //固定位置顯示“.”
  33.         OLED_ShowString(80,1,"%");    //固定位置顯示“%”

  34.         if(set_f==0)                  //設(shè)置鍵沒按下,非設(shè)置模式
  35.         {
  36.         OLED_ShowString(80,4," ");    //不顯示
  37.         }        
  38.         if(set_f==1)                  //設(shè)置鍵按了1次
  39.         {
  40.         OLED_ShowString(80,4," HU");  //顯示“HU”
  41.         }
  42.         if(set_f==2)                  //設(shè)置鍵按了2次
  43.         {
  44.         OLED_ShowString(80,4," HD");  //顯示“HD”
  45.         }
  46.                 if(set_f==3)                //設(shè)置鍵按了3次
  47.         {
  48.         OLED_ShowString(80,4," TU");  //顯示“TU”
  49.         }
  50.                 if(set_f==4)                //設(shè)置鍵按了4次
  51.         {
  52.         OLED_ShowString(80,4," TD");  //顯示“TD”
  53.         }        
  54. }

  55. /********************************************************
  56. 函數(shù)名稱:void display1(void)
  57. 函數(shù)作用:顯示當(dāng)前實(shí)際溫濕度
  58. 參數(shù)說明:
  59. /********************************************************/
  60. void display1(void)
  61. {
  62.                
  63.         if(DHT11_Check()==1)                //判斷校驗(yàn)和是否正確
  64.         {
  65.                 if(humi_old<Humi_H)                                        //判斷濕度是否上升
  66.                 {
  67.                         
  68.                         OLED_ShowString(88,1,"up");     //上升則顯示‘up’
  69.                         
  70.                         Delay_ms(50);                                            //延時(shí)
  71.                         humi_old=Humi_H;                                  //記錄當(dāng)前濕度
  72.                 }
  73.                 else
  74.                         if(humi_old>Humi_H)                                //判斷濕度是否下降
  75.                         {
  76.                                 OLED_ShowString(88,1,"down"); //下降則顯示‘down’
  77.                                 Delay_ms(50);                                    //延時(shí)
  78.                                 humi_old=Humi_H;                          //記錄當(dāng)前濕度
  79.                         }

  80.                 if(temp_old<Temp_H)                                        //判斷溫度是否上升
  81.                 {
  82.                                 OLED_ShowString(88,0,"up");   //上升則顯示‘up’
  83.                           Delay_ms(50);                                            //延時(shí)
  84.                           temp_old=Temp_H;                                  //記錄當(dāng)前溫度
  85.                 }
  86.                 else
  87.                         if(temp_old>Temp_H)                                //判斷溫度是否下降
  88.                         {
  89.                                 OLED_ShowString(88,0,"down"); //下降顯示‘down’
  90.                                 Delay_ms(50);                                    //延時(shí)
  91.                                 temp_old=Temp_H;                          //記錄當(dāng)前溫度
  92.                         }

  93.                   //顯示實(shí)測濕度值
  94.                         OLED_ShowChar(40,1,ASCII[Humi_H/10]);//顯示濕度十位的數(shù)值
  95.                         OLED_ShowChar(48,1,ASCII[Humi_H%10]);//顯示濕度個(gè)位的數(shù)值
  96.                         OLED_ShowChar(64,1,ASCII[Humi_L/10]);//顯示濕度十分位的數(shù)值
  97.                         OLED_ShowChar(70,1,ASCII[Humi_L%10]);//顯示濕度百分位的數(shù)值
  98.                         
  99.                                        
  100.                         OLED_ShowChar(40,0,ASCII[Temp_H/10]);//顯示溫度十位的數(shù)值
  101.                         OLED_ShowChar(48,0,ASCII[Temp_H%10]);//顯示溫度個(gè)位的數(shù)值
  102.                         OLED_ShowChar(64,0,ASCII[Temp_L/10]);//顯示溫度十分位的數(shù)值
  103.                         OLED_ShowChar(70,0,ASCII[Temp_L%10]);//顯示溫度百分位的數(shù)值
  104.                                                 
  105.                 if(temp_up<=Temp_H||temp_down>Temp_H||humi_up<=Humi_H||humi_down>Humi_H) //判斷是否超出設(shè)置的溫濕度上下限
  106.                 {
  107.                         buzz=0;                 //超出的話蜂鳴器響起
  108.                         led=0;                 //點(diǎn)亮報(bào)警燈
  109.                         led1=1;
  110.                 }
  111.                 else                     //否者溫濕度都處于限值范圍內(nèi)
  112.                 {
  113.                         buzz=1;                 //關(guān)閉蜂鳴器
  114.                         led=1;               
  115.                         led1=0;                 //點(diǎn)亮正常燈
  116.                 }        
  117.      jiexianw();               
  118.         }        
  119. }

  120. /***************溫度上下限限制*******************/
  121. void jiexianw()
  122. {        
  123.         fixed_display();                        //顯示固定內(nèi)容
  124.         OLED_ShowString(0,4,"T&H limit");                          //設(shè)置區(qū)域顯示"T&H limit"
  125.         OLED_ShowString(0,5,"T:UP");            //設(shè)置區(qū)域顯示"T:UP"
  126.         OLED_ShowChar(32,5,ASCII[temp_up/10]);  //設(shè)置區(qū)域顯示溫度上限十位的數(shù)值
  127.         OLED_ShowChar(40,5,ASCII[temp_up%10]);  //設(shè)置區(qū)域顯示溫度上限個(gè)位的數(shù)值
  128.         OLED_ShowString(56,5,"DOWN");           //設(shè)置區(qū)域顯示"DOWN"
  129.         OLED_ShowChar(88,5,ASCII[temp_down/10]);//設(shè)置區(qū)域顯示溫度下限十位的數(shù)值
  130.         OLED_ShowChar(94,5,ASCII[temp_down%10]);//設(shè)置區(qū)域顯示溫度下限個(gè)位的數(shù)值
  131.         
  132.         OLED_ShowString(0,6,"H:UP");            //設(shè)置區(qū)域顯示"H:UP"
  133.         OLED_ShowChar(32,6,ASCII[humi_up/10]);  //設(shè)置區(qū)域顯示濕度上限十位的數(shù)值
  134.         OLED_ShowChar(40,6,ASCII[humi_up%10]);  //設(shè)置區(qū)域顯示濕度上限十位的數(shù)值
  135.         OLED_ShowString(56,6,"DOWN");           //設(shè)置區(qū)域顯示"DOWN"
  136.         OLED_ShowChar(88,6,ASCII[humi_down/10]);//設(shè)置區(qū)域顯示濕度下限十位的數(shù)值
  137.         OLED_ShowChar(94,6,ASCII[humi_down%10]);//設(shè)置區(qū)域顯示濕度下限個(gè)位的數(shù)值
  138.         
  139. }

  140. /********************************************************
  141. 函數(shù)名稱:void delayms(uint ms)
  142. 函數(shù)作用:毫秒延時(shí)函數(shù)
  143. 參數(shù)說明:
  144. ********************************************************/
  145. void delayms(uint ms)
  146. {
  147.         unsigned char i=100,j;
  148.         for(;ms;ms--)
  149.         {
  150.                 while(--i)
  151.                 {
  152.                         j=10;
  153.                         while(--j);
  154.                 }
  155.         }
  156. }
  157. /********************************************************
  158. 函數(shù)名稱:void scan(void)
  159. 函數(shù)作用:按鍵檢測函數(shù)
  160. 參數(shù)說明:
  161. ********************************************************/
  162. void scan(void)
  163. {        
  164.         //設(shè)置鍵,不支持連按
  165.         if(key_set==0)                 //按鍵按下
  166.         {
  167.                 delayms(7);                   //延時(shí)消抖
  168.                 if(key_set==0)         //再次確認(rèn)按鍵按下
  169.                 {
  170.                         led=1;               //關(guān)閉報(bào)警燈
  171.                         led1=1;        //關(guān)閉正常燈
  172.                         buzz=1;               //關(guān)閉蜂鳴器
  173.                         if(set_f==0)   //進(jìn)入設(shè)置先清除屏幕,顯示設(shè)置部分
  174.                         {
  175.                                 OLED_Clear();      //清除屏幕顯示
  176.                                 delay_n40us(100);         //延時(shí)等待全部清除完畢
  177.                         }
  178.                         set_f++;                   //設(shè)置變量+1
  179.                         if(set_f==5)         //全部設(shè)置完成,退出設(shè)置
  180.                         {
  181.                                 set_f=0;           //重置設(shè)置變量

  182.                                 AT24C02_write_date(0,humi_up);  //寫入【濕度上限】數(shù)據(jù)保存
  183.                                 AT24C02_write_date(1,humi_down);//寫入【濕度下限】數(shù)據(jù)保存
  184.                                 AT24C02_write_date(2,temp_up);  //寫入【溫度上限】數(shù)據(jù)保存
  185.                                 AT24C02_write_date(3,temp_down);//寫入【溫度下限】數(shù)據(jù)保存
  186.                                 
  187.                                 OLED_Clear();      //清除屏幕顯示
  188.                                 delay_n40us(100);         //延時(shí)等待全部清除完畢
  189.                                 fixed_display();   //清除顯示后顯示固定部分
  190.                         }                        
  191.                 }
  192.                 while(!key_set);       //檢測按鍵松開
  193.         }

  194.           //加值鍵,支持連按        
  195.         if(key_jia==0&&set_f!=0||key_jian==0&&set_f!=0)//進(jìn)入設(shè)置模式,按下加鍵或減鍵
  196.         {
  197.          delayms(7);       //延時(shí)消抖
  198.   if(set_f==1)       //設(shè)置濕度上限
  199.   {
  200.         if(key_jia==0)
  201.         {
  202.                         if(humi_up<99)  //濕度最大值不可大于99%RH
  203.                         humi_up++;      //濕度上限+1%RH
  204.         }
  205.         if(key_jian==0)
  206.         {
  207.         if(humi_up!=0&&humi_up>humi_down+1)//濕度上限最小不可為0%RH,并且上限得比下限大
  208.          humi_up--;                       //濕度上限值-1%RH
  209.         
  210.         }
  211. }
  212.   if(set_f==2)        //設(shè)置濕度下限
  213.   {
  214.         if(key_jia==0)
  215.         {
  216.                                 if(humi_down<99&&humi_down+1<humi_up)//濕度下限最大值小于99%RH,并且下限不可超過上限
  217.                                         humi_down++;                       //濕度下限+1%RH
  218.         }
  219.         if(key_jian==0)
  220.         {
  221.                                 if(humi_down!=0)                   //濕度下限最小值不可為0%RH
  222.                                         humi_down--;                    //濕度下限值-1%RH        
  223.         }
  224. }

  225.   if(set_f==3)          //設(shè)置溫度上限
  226.   {
  227.         if(key_jia==0)
  228.         {
  229.                                 if(temp_up<99) //溫度上限最大值不可大于99℃
  230.                                         temp_up++;   //濕度上限+1℃
  231.         }
  232.         if(key_jian==0)
  233.         {
  234.                                 if(temp_up!=0&&temp_up>temp_down+1)//溫度上限最小值不可為0℃,并且上限得比下限大
  235.                                         temp_up--;                       //溫度上限值-1℃
  236.         
  237.         }
  238. }

  239.         if(set_f==4)        //設(shè)置溫度下限
  240. {
  241.         if(key_jia==0)
  242.         {
  243.                                 if(temp_down<99&&temp_down+1<temp_up)//溫度下限最大值不可大于99℃,并且下限不可超過上限
  244.                                         temp_down++;                       //溫度下限+1℃
  245.         }
  246.         if(key_jian==0)
  247.         {               
  248.                                 if(temp_down!=0)                    //溫度下限最小值不可為0℃
  249.                                         temp_down--;                      //溫度下限值-1℃
  250.         
  251.         }
  252.                 }
  253.         }
  254. }

  255. /********************************************************
  256. 函數(shù)名稱:void main()
  257. 函數(shù)作用:主函數(shù)
  258. 參數(shù)說明:
  259. ********************************************************/
  260. void main()
  261. {
  262.         if(key_jian==0)              //按鍵按下
  263.         {
  264.                 delayms(100);              //延時(shí)消抖
  265.                 if(key_jian==0)            //按鍵按下
  266.                 {
  267.                         AT24C02_write_date(0,75);//寫入【濕度上限值】數(shù)據(jù)保存
  268.                         AT24C02_write_date(1,45);//寫入【濕度下限值】數(shù)據(jù)保存
  269.                         AT24C02_write_date(2,30);//寫入【溫度上限值】數(shù)據(jù)保存
  270.                         AT24C02_write_date(3,16);//寫入【溫度下限值】數(shù)據(jù)保存
  271.                 }
  272.         }

  273.         humi_up=AT24C02_read_date(0);  //讀取存儲的【濕度上限值】數(shù)據(jù)
  274.         humi_down=AT24C02_read_date(1);//讀取存儲的【濕度下限值】數(shù)據(jù)
  275.         temp_up=AT24C02_read_date(2);  //讀取存儲的【溫度上限值】數(shù)據(jù)
  276.         temp_down=AT24C02_read_date(3);//讀取存儲的【溫度下限值】數(shù)據(jù)

  277.         OLED_Init();                         //顯示屏初始化        
  278.         fixed_display();               //顯示固定內(nèi)容
  279.         while(1)
  280.         {               
  281.                 scan();                               //按鍵檢測處理
  282.                 DHT11_read();            //讀取DHT11溫濕度
  283.                 display1();                    //顯示當(dāng)前溫、濕度
  284.         }
  285. }   
復(fù)制代碼



圖片1.png (96.59 KB, 下載次數(shù): 252)

原理圖

原理圖

圖片2.png (102.11 KB, 下載次數(shù): 203)

圖片2.png

基于單片機(jī)的多功能室內(nèi)溫濕度測量儀.zip

150.11 KB, 下載次數(shù): 367, 下載積分: 黑幣 -5

Proteus8.13

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評分

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

使用道具 舉報(bào)

沙發(fā)
ID:792559 發(fā)表于 2020-7-4 16:47 | 只看該作者
運(yùn)行了為什么一直在響

回復(fù)

使用道具 舉報(bào)

板凳
ID:792559 發(fā)表于 2020-7-4 20:57 | 只看該作者
博主  你上個(gè)月發(fā)的那個(gè)溫濕度感應(yīng)器的keil文件有沒有呀,求一份
回復(fù)

使用道具 舉報(bào)

地板
ID:796671 發(fā)表于 2020-7-6 09:16 | 只看該作者
樓主,keil工程可以發(fā)一份嗎,我自建工程添加你的文件總報(bào)錯(cuò)
回復(fù)

使用道具 舉報(bào)

5#
ID:803004 發(fā)表于 2020-7-14 11:09 | 只看該作者
可以發(fā)一下keil工程文件嗎 自建的報(bào)錯(cuò)
回復(fù)

使用道具 舉報(bào)

6#
ID:792559 發(fā)表于 2020-7-14 19:59 | 只看該作者
發(fā)表于 2020-7-4 16:47
運(yùn)行了為什么一直在響

蜂鳴器
回復(fù)

使用道具 舉報(bào)

7#
ID:803901 發(fā)表于 2020-7-15 20:47 | 只看該作者
博主  你上個(gè)月發(fā)的那個(gè)溫濕度感應(yīng)器的keil文件有沒有呀,求一份
回復(fù)

使用道具 舉報(bào)

8#
ID:89286 發(fā)表于 2020-8-3 12:58 | 只看該作者
Thanks for sharing
回復(fù)

使用道具 舉報(bào)

9#
ID:783837 發(fā)表于 2020-9-8 09:01 | 只看該作者
博主,keil文件可以發(fā)一下嗎?
回復(fù)

使用道具 舉報(bào)

10#
ID:883149 發(fā)表于 2021-2-24 11:12 | 只看該作者
求一份keil文件,謝謝啦~
回復(fù)

使用道具 舉報(bào)

11#
ID:310349 發(fā)表于 2021-4-16 12:34 | 只看該作者
發(fā)表于 2020-7-4 20:57
博主  你上個(gè)月發(fā)的那個(gè)溫濕度感應(yīng)器的keil文件有沒有呀,求一份

DHT11.H就是溫濕度感應(yīng)模塊的文件
回復(fù)

使用道具 舉報(bào)

12#
ID:1031103 發(fā)表于 2022-10-12 16:46 | 只看該作者
溫度和濕度上下限在代碼里面怎么修改初值啊 求求了
回復(fù)

使用道具 舉報(bào)

13#
ID:1031103 發(fā)表于 2022-10-12 16:47 | 只看該作者
在代碼里面怎么修改溫度和濕度的初值啊 大哥們求求了
回復(fù)

使用道具 舉報(bào)

14#
ID:922131 發(fā)表于 2023-4-25 22:10 | 只看該作者
博主用的Proteus幾啊,我的8打不開
回復(fù)

使用道具 舉報(bào)

15#
ID:922131 發(fā)表于 2023-5-21 11:05 | 只看該作者
樓主用AT24c02的主要用途是干什么的啊?直接用單片機(jī)讀取傳感器溫濕度的值也可以嗎?
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表