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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5463|回復: 1
收起左側

單片機大棚溫濕度檢測制作 Proteus仿真程序

[復制鏈接]
ID:698919 發表于 2020-2-27 10:36 | 顯示全部樓層 |閱讀模式
Altium Designer畫的單片機大棚溫濕度檢測原理圖和PCB圖如下:(51hei附件中可下載工程文件)
51hei.png 51hei.png

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png

制作出來的實物圖如下:
00006-1.jpg 00006-2.jpg 00006-M.jpg 00006-B.jpg 00006-Z.jpg P0006-1.jpg P0006-2.jpg P0006-3.jpg P0006-M.jpg P0006-B.jpg

單片機源程序如下:
  1. /*************************************************************
  2.                       大棚溫濕度檢測

  3. 補充說明:
  4. ***************************************************************/
  5. #include<reg52.h>          //頭文件
  6. #include<LCD1602.h>
  7. #include<AT24C02.h>
  8. #include<DHT11.h>

  9. /*****************燈、蜂鳴器、按鍵引腳定義*******************/
  10. sbit led     = P3^7;  //超限指示燈
  11. sbit led1    = P3^2;  //正常指示燈
  12. sbit buzz    = P2^3;  //蜂鳴器
  13. sbit key_set = P1^0;  //設置鍵
  14. sbit key_jia = P1^3;  //加鍵
  15. sbit key_jian= P1^6;  //減鍵

  16. /************************變量定義***********************/
  17. uchar temp_old,humi_old;//存儲上一次的溫度、濕度
  18. uchar temp_up,temp_down;//存儲溫度上、下限值
  19. uchar humi_up,humi_down;//存儲濕度上、下限值
  20. uchar set_f;                           //設置選擇標記,=0非設置,=1設置濕度上限,=2設置濕度下限
  21.                                             //              =3設置溫度上限,=4設置溫度下限。
  22. uchar T0_num;                        //計數變量

  23. /********************************************************
  24. 函數名稱:void display(void)
  25. 函數作用:LCD1602顯示固定的內容
  26. 參數說明:
  27. ********************************************************/
  28. void fixed_display(void)
  29. {
  30.         lcd1602_write_character(0,1,"Humi:");//0:表示第1列,1:表示第1行,所有關于顯示都一樣
  31.         lcd1602_write_character(0,2,"Temp:");//0:表示第1列,2:表示第2行,所有關于顯示都一樣
  32.         lcd1602_write_character(12,1,"%RH"); //12:表示第13列,2:表示第1行,所有關于顯示都一樣
  33.         LCD_disp_char(12,2,0x00);                         //顯示自定義字符‘°’
  34.         LCD_disp_char(13,2,'C');                         //顯示‘C’
  35. }
  36. /********************************************************
  37. 函數名稱:void display1(void)
  38. 函數作用:顯示當前實際溫濕度
  39. 參數說明:
  40. ********************************************************/
  41. void display1(void)
  42. {
  43.         if(DHT11_Check()==1)                  //判斷校驗和是否正確
  44.         {
  45.                 if(humi_old<Humi_H)                                  //判斷濕度是否上升
  46.                 {
  47.                         LCD_disp_char(15,1,0x01);          //顯示‘↑’
  48.                         Delay_ms(50);                                  //延時
  49.                         humi_old=Humi_H;                          //記錄當前濕度
  50.                 }
  51.                 else
  52.                         if(humi_old>Humi_H)                          //判斷濕度是否下降
  53.                         {
  54.                                 LCD_disp_char(15,1,0x02); //顯示‘↓’
  55.                                 Delay_ms(50);                          //延時
  56.                                 humi_old=Humi_H;                  //記錄當前濕度
  57.                         }

  58.                 if(temp_old<Temp_H)                                  //判斷溫度是否上升
  59.                 {
  60.                         LCD_disp_char(15,2,0x01);          //顯示‘↑’
  61.                         Delay_ms(50);                                  //延時
  62.                         temp_old=Temp_H;                          //記錄當前溫度
  63.                 }
  64.                 else
  65.                         if(temp_old>Temp_H)                          //判斷溫度是否下降
  66.                         {
  67.                                 LCD_disp_char(15,2,0x02); //顯示‘↓’
  68.                                 Delay_ms(50);                          //延時
  69.                                 temp_old=Temp_H;                  //記錄當前溫度
  70.                         }
  71.                 //顯示實測濕度值
  72.                 LCD_disp_char(6,1,ASCII[Humi_H/10]);           
  73.                 LCD_disp_char(7,1,ASCII[Humi_H%10]);
  74.                 LCD_disp_char(8,1,ASCII[12]);
  75.                 LCD_disp_char(9,1,ASCII[Humi_L%10]);
  76.                 LCD_disp_char(10,1,'0');
  77.                 //顯示實測溫度值
  78.                 LCD_disp_char(6,2,ASCII[Temp_H/10]);           
  79.                 LCD_disp_char(7,2,ASCII[Temp_H%10]);
  80.                 LCD_disp_char(8,2,ASCII[12]);
  81.                 LCD_disp_char(9,2,ASCII[Temp_L%10]);
  82.                 LCD_disp_char(10,2,'0');
  83.                
  84.                 if(temp_up<=Temp_H||temp_down>Temp_H||humi_up<=Humi_H||humi_down>Humi_H) //判斷是否超出設置的溫濕度上下限
  85.                 {
  86.                         buzz=0;                 //超出的話蜂鳴器響起
  87.                         led=0;                 //點亮報警燈
  88.                         led1=1;
  89.                 }
  90.                 else                     //否者溫濕度都處于限值范圍內
  91.                 {
  92.                         buzz=1;                 //關閉蜂鳴器
  93.                         led=1;               
  94.                         led1=0;                 //點亮正常燈
  95.                 }                                                
  96.         }        
  97. }
  98. /********************************************************
  99. 函數名稱:void display2(void)
  100. 函數作用:顯示設置時溫濕度上下限
  101. 參數說明:
  102. ********************************************************/
  103. void display2(void)
  104. {
  105.         T0_num++;

  106.         lcd1602_write_character(0,1,"Humi:Up");
  107.         lcd1602_write_character(0,2,"Temp:Up");
  108.         lcd1602_write_character(9,1,",Down");
  109.         lcd1602_write_character(9,2,",Down");

  110.         if(T0_num%2==0)        //偶數次顯示,奇數次不顯示。這樣就會有閃爍效果,可以清楚看到當前設置的是哪個值
  111.         {
  112.                 LCD_disp_char(7,1,ASCII[humi_up/10]);           //顯示 濕度上限
  113.                 LCD_disp_char(8,1,ASCII[humi_up%10]);
  114.                 LCD_disp_char(14,1,ASCII[humi_down/10]);   //顯示 濕度下限
  115.                 LCD_disp_char(15,1,ASCII[humi_down%10]);
  116.         
  117.                 LCD_disp_char(7,2,ASCII[temp_up/10]);           //顯示 溫度上限
  118.                 LCD_disp_char(8,2,ASCII[temp_up%10]);
  119.                 LCD_disp_char(14,2,ASCII[temp_down/10]);   //顯示 溫度下限
  120.                 LCD_disp_char(15,2,ASCII[temp_down%10]);
  121.                 Delay_ms(1);
  122.         }
  123.         else                         //奇數次不顯示
  124.         {
  125.                 switch(set_f)//根據當前設置的內容,對應位置閃爍
  126.                 {
  127.                         case 1:lcd1602_write_character(7,1,"  "); break;
  128.                         case 2:lcd1602_write_character(14,1,"  "); break;
  129.                         case 3:lcd1602_write_character(7,2,"  "); break;
  130.                         case 4:lcd1602_write_character(14,2,"  "); break;
  131.                         default: break;
  132.                 }
  133.         }
  134. }
  135. /********************************************************
  136. 函數名稱:void delayms(uint ms)
  137. 函數作用:毫秒延時函數
  138. 參數說明:
  139. ********************************************************/
  140. void delayms(uint ms)
  141. {
  142.         unsigned char i=100,j;
  143.         for(;ms;ms--)
  144.         {
  145.                 while(--i)
  146.                 {
  147.                         j=10;
  148.                         while(--j);
  149.                 }
  150.         }
  151. }
  152. /********************************************************
  153. 函數名稱:void scan(void)
  154. 函數作用:按鍵檢測函數
  155. 參數說明:
  156. ********************************************************/
  157. void scan(void)
  158. {        
  159.         //設置鍵,不支持連按
  160.         if(key_set==0)                //按鍵按下
  161.         {
  162.                 delayms(7);                //延時消抖
  163.                 if(key_set==0)        //再次確認按鍵按下
  164.                 {
  165.                         led=1;            //關閉報警燈
  166.                         led1=1;
  167.                         buzz=1;            //關閉蜂鳴器
  168.                         if(set_f==0)//進入設置先清除屏幕,顯示設置部分
  169.                         {
  170.                                 LCD_write_command(0x01);        //清除屏幕顯示
  171.                                 delay_n40us(100);                        //延時等待全部清除完畢
  172.                         }
  173.                         set_f++;        //設置變量+1
  174.                         if(set_f==5)//全部設置完成,退出設置
  175.                         {
  176.                                 set_f=0;//重置設置變量

  177.                                 AT24C02_write_date(0,humi_up);  //寫入【濕度上限】數據保存
  178.                                 AT24C02_write_date(1,humi_down);//寫入【濕度下限】數據保存
  179.                                 AT24C02_write_date(2,temp_up);  //寫入【溫度上限】數據保存
  180.                                 AT24C02_write_date(3,temp_down);//寫入【溫度下限】數據保存
  181.                                 
  182.                                 LCD_write_command(0x01);        //清除屏幕顯示
  183.                                 delay_n40us(100);                        //延時等待全部清除完畢
  184.                                 fixed_display();                         //清除顯示后顯示固定部分
  185.                         }                        
  186.                 }
  187.                 while(!key_set);//檢測按鍵松開
  188.         }

  189.         //加值鍵,支持連按
  190.         if(key_jia==0&&set_f!=0)
  191.         {
  192.                 delayms(7);
  193.                 if(key_jia==0)
  194.                 {
  195.                         if(set_f==1)        //設置 濕度上限值
  196.                         {
  197.                                 if(humi_up<99)  //最大值可設置99%RH
  198.                                         humi_up++;  //濕度上限+1%RH
  199.                         }
  200.         
  201.                         if(set_f==2)        //設置 濕度下限值
  202.                         {
  203.                                 if(humi_down<99&&humi_down+1<humi_up)//最大值可設置99%RH,并且下限不可超過上限
  204.                                         humi_down++;//濕度下限+1%RH
  205.                         }
  206.         
  207.                         if(set_f==3)        //設置 溫度上限值
  208.                         {
  209.                                 if(temp_up<99)  //最大值可設置99℃
  210.                                         temp_up++;  //濕度上限+1℃
  211.                         }
  212.         
  213.                         if(set_f==4)        //設置 溫度下限值
  214.                         {
  215.                                 if(temp_down<99&&temp_down+1<temp_up)//最大值可設置99℃,并且下限不可超過上限
  216.                                         temp_down++;//溫度下限+1℃
  217.                         }
  218.                 }
  219.         }

  220.         //減值鍵,支持連按
  221.         if(key_jian==0&&set_f!=0)
  222.         {
  223.                 delayms(7);
  224.                 if(key_jian==0)
  225.                 {
  226.                         if(set_f==1)        //設置濕度上限值
  227.                         {
  228.                                 if(humi_up!=0&&humi_up>humi_down+1)//最小值可設置0%RH,并且上限得比下限大
  229.                                         humi_up--;  //濕度上限值-1%RH
  230.                         }
  231.         
  232.                         if(set_f==2)        //設置濕度下限值
  233.                         {
  234.                                 if(humi_down!=0)//最小值可設置0%RH
  235.                                         humi_down--;//濕度下限值-1%RH
  236.                         }
  237.         
  238.                         if(set_f==3)        //設置溫度上限值
  239.                         {
  240.                                 if(temp_up!=0&&temp_up>temp_down+1)//最小值可設置0℃,并且上限得比下限大
  241.                                         temp_up--;  //溫度上限值-1℃
  242.                         }
  243.         
  244.                         if(set_f==4)        //設置溫度下限值
  245.                         {
  246.                                 if(temp_down!=0)//最小值可設置0℃
  247.                                         temp_down--;//溫度下限值-1℃
  248.                         }
  249.                 }
  250.         }
  251. }
  252. /********************************************************
  253. 函數名稱:void main()
  254. 函數作用:主函數
  255. 參數說明:
  256. ********************************************************/
  257. void main()
  258. {
  259.         if(key_jian==0)
  260.         {
  261.                 delayms(100);
  262.                 if(key_jian==0)
  263.                 {
  264.                         AT24C02_write_date(0,75);//寫入【濕度上限值】數據保存
  265.                         AT24C02_write_date(1,45);//寫入【濕度下限值】數據保存
  266.                         AT24C02_write_date(2,30);//寫入【溫度上限值】數據保存
  267.                         AT24C02_write_date(3,16);//寫入【溫度下限值】數據保存
  268.                 }
  269.         }

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

  274.         LCD_init();                    //初始化LCD1602
  275.         lcd1602_write_pic(0x00,pic);   //將自定義字符“°”寫入到LCD1602中
  276.         lcd1602_write_pic(0x01,zeng);  //將自定義字符“↑”寫入到LCD1602中
  277.         lcd1602_write_pic(0x02,jian);  //將自定義字符“↓”寫入到LCD1602中

  278.         fixed_display();               //顯示固定內容
  279.         while(1)
  280.         {
  281.                 scan();                               //按鍵檢測處理
  282.                 if(set_f==0)                           //正常顯示模式
  283.                 {
  284.                         DHT11_read();          //讀取DHT11溫濕度
  285.                         display1();                   //顯示當前溫、濕度
  286.                 }
  287.                 else
  288.                         display2();                   //顯示設置溫濕度上下限
  289.         }
  290. }
復制代碼

所有資料51hei提供下載:
大棚溫濕度檢測.7z (2.2 MB, 下載次數: 153)




回復

使用道具 舉報

ID:710465 發表于 2020-3-22 22:25 來自手機 | 顯示全部樓層
用附帶的main.c文件代碼,生成新的hex文件,放到仿真中運行出錯咋回事
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久久国产一区二区三区 | 日韩一三区 | 国产aa | 欧美一区2区三区4区公司 | 中文字幕一区二区三区四区五区 | 玖玖玖在线 | 性色的免费视频 | 蜜桃视频成人 | 龙珠z国语版在线观看 | 亚洲一av| 亚洲精品美女在线观看 | 国内精品久久久久久久影视简单 | 在线观看免费观看在线91 | 天天综合亚洲 | 中文一级片 | 精品一区二区三区中文字幕 | 国产视频一区在线 | 久久久精品一区 | 国产欧美在线 | 精品成人免费一区二区在线播放 | 久久精品亚洲 | 国产成在线观看免费视频 | 免费在线观看成人 | 天天综合日日夜夜 | 国产成在线观看免费视频 | 色偷偷888欧美精品久久久 | 欧美亚洲视频 | 五月婷婷 六月丁香 | 91精品国产91久久综合桃花 | 欧美性生活一区二区三区 | 亚洲日韩中文字幕一区 | 青草青草久热精品视频在线观看 | jlzzjlzz国产精品久久 | 天堂中文在线观看 | 国产一区影院 | www.xxxx欧美| 国产一区二区三区色淫影院 | 亚洲国产免费 | 狠狠做六月爱婷婷综合aⅴ 国产精品视频网 | 99久久精品免费视频 | 国产激情视频在线免费观看 |