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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8692|回復: 14
收起左側

基于51單片機溫濕度檢測系統 protues仿真

  [復制鏈接]
ID:310349 發表于 2020-6-2 11:17 | 顯示全部樓層 |閱讀模式
本次設計采用的單片機AT89C52DHT11的溫度濕度的檢測系統。分為硬件電路設計和單片機程序設計。硬件電路包括單片機、溫濕度傳感器、顯示模塊、報警模塊以及按鍵。之所以采用AT89C52DHT11溫濕度傳感器及OLED顯示模塊,是要保證工作穩定、集成度高、測量精度高、成本低,其中測溫濕度控制電路由溫濕度傳感器和預設溫度限制以及報警電路組成,根據需要通過按鍵預先輸入溫濕度的上下限,當實際測量的溫濕度大于或小于預設的限制時,蜂鳴器發出報警信號并報警燈亮紅。單片機程序主要包括主程序、顯示子程序、測量溫濕度和設置溫濕度上下限子程序。
原理圖:

protues仿真圖:


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


  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;  //設置鍵
  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;                               //設置選擇標記,=0非設置,=1設置濕度上限,=2設置濕度下限
  18.                                                       //              =3設置溫度上限,=4設置溫度下限。

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

  21. /********************************************************
  22. 函數名稱:void display(void)
  23. 函數作用:oled顯示固定作用
  24. 參數說明:
  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)                  //設置鍵沒按下,非設置模式
  35.         {
  36.         OLED_ShowString(80,4," ");    //不顯示
  37.         }        
  38.         if(set_f==1)                  //設置鍵按了1次
  39.         {
  40.         OLED_ShowString(80,4," HU");  //顯示“HU”
  41.         }
  42.         if(set_f==2)                  //設置鍵按了2次
  43.         {
  44.         OLED_ShowString(80,4," HD");  //顯示“HD”
  45.         }
  46.                 if(set_f==3)                //設置鍵按了3次
  47.         {
  48.         OLED_ShowString(80,4," TU");  //顯示“TU”
  49.         }
  50.                 if(set_f==4)                //設置鍵按了4次
  51.         {
  52.         OLED_ShowString(80,4," TD");  //顯示“TD”
  53.         }        
  54. }

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

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

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

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

  140. /********************************************************
  141. 函數名稱:void delayms(uint ms)
  142. 函數作用:毫秒延時函數
  143. 參數說明:
  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. 函數名稱:void scan(void)
  159. 函數作用:按鍵檢測函數
  160. 參數說明:
  161. ********************************************************/
  162. void scan(void)
  163. {        
  164.         //設置鍵,不支持連按
  165.         if(key_set==0)                 //按鍵按下
  166.         {
  167.                 delayms(7);                   //延時消抖
  168.                 if(key_set==0)         //再次確認按鍵按下
  169.                 {
  170.                         led=1;               //關閉報警燈
  171.                         led1=1;        //關閉正常燈
  172.                         buzz=1;               //關閉蜂鳴器
  173.                         if(set_f==0)   //進入設置先清除屏幕,顯示設置部分
  174.                         {
  175.                                 OLED_Clear();      //清除屏幕顯示
  176.                                 delay_n40us(100);         //延時等待全部清除完畢
  177.                         }
  178.                         set_f++;                   //設置變量+1
  179.                         if(set_f==5)         //全部設置完成,退出設置
  180.                         {
  181.                                 set_f=0;           //重置設置變量

  182.                                 AT24C02_write_date(0,humi_up);  //寫入【濕度上限】數據保存
  183.                                 AT24C02_write_date(1,humi_down);//寫入【濕度下限】數據保存
  184.                                 AT24C02_write_date(2,temp_up);  //寫入【溫度上限】數據保存
  185.                                 AT24C02_write_date(3,temp_down);//寫入【溫度下限】數據保存
  186.                                 
  187.                                 OLED_Clear();      //清除屏幕顯示
  188.                                 delay_n40us(100);         //延時等待全部清除完畢
  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)//進入設置模式,按下加鍵或減鍵
  196.         {
  197.          delayms(7);       //延時消抖
  198.   if(set_f==1)       //設置濕度上限
  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)        //設置濕度下限
  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)          //設置溫度上限
  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)        //設置溫度下限
  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. 函數名稱:void main()
  257. 函數作用:主函數
  258. 參數說明:
  259. ********************************************************/
  260. void main()
  261. {
  262.         if(key_jian==0)              //按鍵按下
  263.         {
  264.                 delayms(100);              //延時消抖
  265.                 if(key_jian==0)            //按鍵按下
  266.                 {
  267.                         AT24C02_write_date(0,75);//寫入【濕度上限值】數據保存
  268.                         AT24C02_write_date(1,45);//寫入【濕度下限值】數據保存
  269.                         AT24C02_write_date(2,30);//寫入【溫度上限值】數據保存
  270.                         AT24C02_write_date(3,16);//寫入【溫度下限值】數據保存
  271.                 }
  272.         }

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

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



原理圖

原理圖
圖片2.png

基于單片機的多功能室內溫濕度測量儀.zip

150.11 KB, 下載次數: 367, 下載積分: 黑幣 -5

Proteus8.13

評分

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

查看全部評分

回復

使用道具 舉報

ID:792559 發表于 2020-7-4 16:47 | 顯示全部樓層
運行了為什么一直在響

回復

使用道具 舉報

ID:792559 發表于 2020-7-4 20:57 | 顯示全部樓層
博主  你上個月發的那個溫濕度感應器的keil文件有沒有呀,求一份
回復

使用道具 舉報

ID:796671 發表于 2020-7-6 09:16 | 顯示全部樓層
樓主,keil工程可以發一份嗎,我自建工程添加你的文件總報錯
回復

使用道具 舉報

ID:803004 發表于 2020-7-14 11:09 | 顯示全部樓層
可以發一下keil工程文件嗎 自建的報錯
回復

使用道具 舉報

ID:792559 發表于 2020-7-14 19:59 | 顯示全部樓層
發表于 2020-7-4 16:47
運行了為什么一直在響

蜂鳴器
回復

使用道具 舉報

ID:803901 發表于 2020-7-15 20:47 | 顯示全部樓層
博主  你上個月發的那個溫濕度感應器的keil文件有沒有呀,求一份
回復

使用道具 舉報

ID:89286 發表于 2020-8-3 12:58 | 顯示全部樓層
Thanks for sharing
回復

使用道具 舉報

ID:783837 發表于 2020-9-8 09:01 | 顯示全部樓層
博主,keil文件可以發一下嗎?
回復

使用道具 舉報

ID:883149 發表于 2021-2-24 11:12 | 顯示全部樓層
求一份keil文件,謝謝啦~
回復

使用道具 舉報

ID:310349 發表于 2021-4-16 12:34 | 顯示全部樓層
發表于 2020-7-4 20:57
博主  你上個月發的那個溫濕度感應器的keil文件有沒有呀,求一份

DHT11.H就是溫濕度感應模塊的文件
回復

使用道具 舉報

ID:1031103 發表于 2022-10-12 16:46 | 顯示全部樓層
溫度和濕度上下限在代碼里面怎么修改初值啊 求求了
回復

使用道具 舉報

ID:1031103 發表于 2022-10-12 16:47 | 顯示全部樓層
在代碼里面怎么修改溫度和濕度的初值啊 大哥們求求了
回復

使用道具 舉報

ID:922131 發表于 2023-4-25 22:10 | 顯示全部樓層
博主用的Proteus幾啊,我的8打不開
回復

使用道具 舉報

ID:922131 發表于 2023-5-21 11:05 | 顯示全部樓層
樓主用AT24c02的主要用途是干什么的啊?直接用單片機讀取傳感器溫濕度的值也可以嗎?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 视频一区在线播放 | 欧美日韩精品一区二区 | 夜夜骑首页 | 日韩一区二区三区视频在线观看 | caoporn国产精品免费公开 | 亚洲欧美一区二区三区在线 | 五月天婷婷丁香 | 日韩精品一区二区三区中文在线 | 亚洲精品一区二三区不卡 | 亚洲免费人成在线视频观看 | 免费簧片视频 | 日本三级电影在线免费观看 | 人人看人人干 | 香蕉久久久久久 | 国产视频在线观看一区二区三区 | 黄色免费网站在线看 | 久久av一区 | 免费国产网站 | 在线欧美一区 | 国产一级在线观看 | 国产精品av久久久久久久久久 | 中文日韩在线视频 | 日本在线观看视频 | 亚洲精品成人在线 | 国产欧美日韩精品在线观看 | 色婷婷综合久久久久中文一区二区 | 国产精品一区二区av | 亚洲天堂中文字幕 | 亚洲视频免费 | 一区二区三区在线免费观看 | 91在线导航| 亚洲444kkkk在线观看最新 | 欧美视频二区 | 日韩成年人视频在线 | 日韩黄色小视频 | 韩国av一区二区 | 黄色男女网站 | 国产精品久久久99 | 亚洲成人免费观看 | 天天操,夜夜爽 | 91亚洲国产成人久久精品网站 |