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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:698919 發(fā)表于 2020-2-27 10:36 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
Altium Designer畫的單片機大棚溫濕度檢測原理圖和PCB圖如下:(51hei附件中可下載工程文件)


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


制作出來的實物圖如下:


單片機源程序如下:
  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;  //設(shè)置鍵
  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;                           //設(shè)置選擇標(biāo)記,=0非設(shè)置,=1設(shè)置濕度上限,=2設(shè)置濕度下限
  21.                                             //              =3設(shè)置溫度上限,=4設(shè)置溫度下限。
  22. uchar T0_num;                        //計數(shù)變量

  23. /********************************************************
  24. 函數(shù)名稱:void display(void)
  25. 函數(shù)作用:LCD1602顯示固定的內(nèi)容
  26. 參數(shù)說明:
  27. ********************************************************/
  28. void fixed_display(void)
  29. {
  30.         lcd1602_write_character(0,1,"Humi:");//0:表示第1列,1:表示第1行,所有關(guān)于顯示都一樣
  31.         lcd1602_write_character(0,2,"Temp:");//0:表示第1列,2:表示第2行,所有關(guān)于顯示都一樣
  32.         lcd1602_write_character(12,1,"%RH"); //12:表示第13列,2:表示第1行,所有關(guān)于顯示都一樣
  33.         LCD_disp_char(12,2,0x00);                         //顯示自定義字符‘°’
  34.         LCD_disp_char(13,2,'C');                         //顯示‘C’
  35. }
  36. /********************************************************
  37. 函數(shù)名稱:void display1(void)
  38. 函數(shù)作用:顯示當(dāng)前實際溫濕度
  39. 參數(shù)說明:
  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;                          //記錄當(dāng)前濕度
  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;                  //記錄當(dāng)前濕度
  57.                         }

  58.                 if(temp_old<Temp_H)                                  //判斷溫度是否上升
  59.                 {
  60.                         LCD_disp_char(15,2,0x01);          //顯示‘↑’
  61.                         Delay_ms(50);                                  //延時
  62.                         temp_old=Temp_H;                          //記錄當(dāng)前溫度
  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;                  //記錄當(dāng)前溫度
  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) //判斷是否超出設(shè)置的溫濕度上下限
  85.                 {
  86.                         buzz=0;                 //超出的話蜂鳴器響起
  87.                         led=0;                 //點亮報警燈
  88.                         led1=1;
  89.                 }
  90.                 else                     //否者溫濕度都處于限值范圍內(nèi)
  91.                 {
  92.                         buzz=1;                 //關(guān)閉蜂鳴器
  93.                         led=1;               
  94.                         led1=0;                 //點亮正常燈
  95.                 }                                                
  96.         }        
  97. }
  98. /********************************************************
  99. 函數(shù)名稱:void display2(void)
  100. 函數(shù)作用:顯示設(shè)置時溫濕度上下限
  101. 參數(shù)說明:
  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)        //偶數(shù)次顯示,奇數(shù)次不顯示。這樣就會有閃爍效果,可以清楚看到當(dāng)前設(shè)置的是哪個值
  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                         //奇數(shù)次不顯示
  124.         {
  125.                 switch(set_f)//根據(jù)當(dāng)前設(shè)置的內(nèi)容,對應(yīng)位置閃爍
  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. 函數(shù)名稱:void delayms(uint ms)
  137. 函數(shù)作用:毫秒延時函數(shù)
  138. 參數(shù)說明:
  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. 函數(shù)名稱:void scan(void)
  154. 函數(shù)作用:按鍵檢測函數(shù)
  155. 參數(shù)說明:
  156. ********************************************************/
  157. void scan(void)
  158. {        
  159.         //設(shè)置鍵,不支持連按
  160.         if(key_set==0)                //按鍵按下
  161.         {
  162.                 delayms(7);                //延時消抖
  163.                 if(key_set==0)        //再次確認按鍵按下
  164.                 {
  165.                         led=1;            //關(guān)閉報警燈
  166.                         led1=1;
  167.                         buzz=1;            //關(guān)閉蜂鳴器
  168.                         if(set_f==0)//進入設(shè)置先清除屏幕,顯示設(shè)置部分
  169.                         {
  170.                                 LCD_write_command(0x01);        //清除屏幕顯示
  171.                                 delay_n40us(100);                        //延時等待全部清除完畢
  172.                         }
  173.                         set_f++;        //設(shè)置變量+1
  174.                         if(set_f==5)//全部設(shè)置完成,退出設(shè)置
  175.                         {
  176.                                 set_f=0;//重置設(shè)置變量

  177.                                 AT24C02_write_date(0,humi_up);  //寫入【濕度上限】數(shù)據(jù)保存
  178.                                 AT24C02_write_date(1,humi_down);//寫入【濕度下限】數(shù)據(jù)保存
  179.                                 AT24C02_write_date(2,temp_up);  //寫入【溫度上限】數(shù)據(jù)保存
  180.                                 AT24C02_write_date(3,temp_down);//寫入【溫度下限】數(shù)據(jù)保存
  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)        //設(shè)置 濕度上限值
  196.                         {
  197.                                 if(humi_up<99)  //最大值可設(shè)置99%RH
  198.                                         humi_up++;  //濕度上限+1%RH
  199.                         }
  200.         
  201.                         if(set_f==2)        //設(shè)置 濕度下限值
  202.                         {
  203.                                 if(humi_down<99&&humi_down+1<humi_up)//最大值可設(shè)置99%RH,并且下限不可超過上限
  204.                                         humi_down++;//濕度下限+1%RH
  205.                         }
  206.         
  207.                         if(set_f==3)        //設(shè)置 溫度上限值
  208.                         {
  209.                                 if(temp_up<99)  //最大值可設(shè)置99℃
  210.                                         temp_up++;  //濕度上限+1℃
  211.                         }
  212.         
  213.                         if(set_f==4)        //設(shè)置 溫度下限值
  214.                         {
  215.                                 if(temp_down<99&&temp_down+1<temp_up)//最大值可設(shè)置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)        //設(shè)置濕度上限值
  227.                         {
  228.                                 if(humi_up!=0&&humi_up>humi_down+1)//最小值可設(shè)置0%RH,并且上限得比下限大
  229.                                         humi_up--;  //濕度上限值-1%RH
  230.                         }
  231.         
  232.                         if(set_f==2)        //設(shè)置濕度下限值
  233.                         {
  234.                                 if(humi_down!=0)//最小值可設(shè)置0%RH
  235.                                         humi_down--;//濕度下限值-1%RH
  236.                         }
  237.         
  238.                         if(set_f==3)        //設(shè)置溫度上限值
  239.                         {
  240.                                 if(temp_up!=0&&temp_up>temp_down+1)//最小值可設(shè)置0℃,并且上限得比下限大
  241.                                         temp_up--;  //溫度上限值-1℃
  242.                         }
  243.         
  244.                         if(set_f==4)        //設(shè)置溫度下限值
  245.                         {
  246.                                 if(temp_down!=0)//最小值可設(shè)置0℃
  247.                                         temp_down--;//溫度下限值-1℃
  248.                         }
  249.                 }
  250.         }
  251. }
  252. /********************************************************
  253. 函數(shù)名稱:void main()
  254. 函數(shù)作用:主函數(shù)
  255. 參數(shù)說明:
  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);//寫入【濕度上限值】數(shù)據(jù)保存
  265.                         AT24C02_write_date(1,45);//寫入【濕度下限值】數(shù)據(jù)保存
  266.                         AT24C02_write_date(2,30);//寫入【溫度上限值】數(shù)據(jù)保存
  267.                         AT24C02_write_date(3,16);//寫入【溫度下限值】數(shù)據(jù)保存
  268.                 }
  269.         }

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

  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();               //顯示固定內(nèi)容
  279.         while(1)
  280.         {
  281.                 scan();                               //按鍵檢測處理
  282.                 if(set_f==0)                           //正常顯示模式
  283.                 {
  284.                         DHT11_read();          //讀取DHT11溫濕度
  285.                         display1();                   //顯示當(dāng)前溫、濕度
  286.                 }
  287.                 else
  288.                         display2();                   //顯示設(shè)置溫濕度上下限
  289.         }
  290. }
復(fù)制代碼

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




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

使用道具 舉報

沙發(fā)
ID:710465 發(fā)表于 2020-3-22 22:25 來自手機 | 只看該作者
用附帶的main.c文件代碼,生成新的hex文件,放到仿真中運行出錯咋回事
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕亚洲区 | 日本福利视频 | 爱爱小视频 | 福利精品 | 亚洲第一色站 | 日本黄色片免费在线观看 | 免费观看毛片 | 亚洲精品乱码久久久久久9色 | 国产成人av一区二区三区 | 日韩喷潮 | 国产午夜精品一区二区三区四区 | 日韩一级二级片 | 色综合久久88色综合天天 | 国产精品免费一区二区三区 | 视频二区在线观看 | 91精品一区二区三区久久久久久 | 亚洲性在线 | 青青草综合网 | 91色视频在线观看 | 成人精品一区 | 日韩在线一区二区 | 日韩国产三区 | 国产999在线观看 | 日韩在线小视频 | 亚洲一区国产精品 | 性欧美xxxx| 国产一区二区不卡 | 久综合| 亚洲精品日韩综合观看成人91 | 天天操网 | 国产综合久久 | 日韩中文字幕在线免费 | 中文字幕免费观看 | 欧美成人精品一区 | 国产午夜精品视频 | 久久精品视频一区二区三区 | 一级毛片网 | 一区二区三区免费看 | 亚洲精品视频在线观看视频 | 亚洲欧洲在线观看视频 | 久久综合久色欧美综合狠狠 |