|
Altium Designer畫的單片機大棚溫濕度檢測原理圖和PCB圖如下:(51hei附件中可下載工程文件)
51hei.png (25.26 KB, 下載次數(shù): 40)
下載附件
2020-2-27 15:41 上傳
51hei.png (49.71 KB, 下載次數(shù): 41)
下載附件
2020-2-27 15:41 上傳
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png (23.51 KB, 下載次數(shù): 59)
下載附件
2020-2-27 15:44 上傳
制作出來的實物圖如下:
00006-1.jpg (135.44 KB, 下載次數(shù): 33)
下載附件
2020-2-27 15:36 上傳
00006-2.jpg (139.12 KB, 下載次數(shù): 34)
下載附件
2020-2-27 15:36 上傳
00006-M.jpg (146.51 KB, 下載次數(shù): 38)
下載附件
2020-2-27 15:36 上傳
00006-B.jpg (220.19 KB, 下載次數(shù): 44)
下載附件
2020-2-27 15:36 上傳
00006-Z.jpg (441.49 KB, 下載次數(shù): 37)
下載附件
2020-2-27 15:36 上傳
P0006-1.jpg (135.9 KB, 下載次數(shù): 35)
下載附件
2020-2-27 15:37 上傳
P0006-2.jpg (127.11 KB, 下載次數(shù): 27)
下載附件
2020-2-27 15:37 上傳
P0006-3.jpg (129.57 KB, 下載次數(shù): 29)
下載附件
2020-2-27 15:37 上傳
P0006-M.jpg (118.39 KB, 下載次數(shù): 30)
下載附件
2020-2-27 15:37 上傳
P0006-B.jpg (124.09 KB, 下載次數(shù): 29)
下載附件
2020-2-27 15:40 上傳
單片機源程序如下:
- /*************************************************************
- 大棚溫濕度檢測
- 補充說明:
- ***************************************************************/
- #include<reg52.h> //頭文件
- #include<LCD1602.h>
- #include<AT24C02.h>
- #include<DHT11.h>
- /*****************燈、蜂鳴器、按鍵引腳定義*******************/
- sbit led = P3^7; //超限指示燈
- sbit led1 = P3^2; //正常指示燈
- sbit buzz = P2^3; //蜂鳴器
- sbit key_set = P1^0; //設(shè)置鍵
- sbit key_jia = P1^3; //加鍵
- sbit key_jian= P1^6; //減鍵
- /************************變量定義***********************/
- uchar temp_old,humi_old;//存儲上一次的溫度、濕度
- uchar temp_up,temp_down;//存儲溫度上、下限值
- uchar humi_up,humi_down;//存儲濕度上、下限值
- uchar set_f; //設(shè)置選擇標(biāo)記,=0非設(shè)置,=1設(shè)置濕度上限,=2設(shè)置濕度下限
- // =3設(shè)置溫度上限,=4設(shè)置溫度下限。
- uchar T0_num; //計數(shù)變量
- /********************************************************
- 函數(shù)名稱:void display(void)
- 函數(shù)作用:LCD1602顯示固定的內(nèi)容
- 參數(shù)說明:
- ********************************************************/
- void fixed_display(void)
- {
- lcd1602_write_character(0,1,"Humi:");//0:表示第1列,1:表示第1行,所有關(guān)于顯示都一樣
- lcd1602_write_character(0,2,"Temp:");//0:表示第1列,2:表示第2行,所有關(guān)于顯示都一樣
- lcd1602_write_character(12,1,"%RH"); //12:表示第13列,2:表示第1行,所有關(guān)于顯示都一樣
- LCD_disp_char(12,2,0x00); //顯示自定義字符‘°’
- LCD_disp_char(13,2,'C'); //顯示‘C’
- }
- /********************************************************
- 函數(shù)名稱:void display1(void)
- 函數(shù)作用:顯示當(dāng)前實際溫濕度
- 參數(shù)說明:
- ********************************************************/
- void display1(void)
- {
- if(DHT11_Check()==1) //判斷校驗和是否正確
- {
- if(humi_old<Humi_H) //判斷濕度是否上升
- {
- LCD_disp_char(15,1,0x01); //顯示‘↑’
- Delay_ms(50); //延時
- humi_old=Humi_H; //記錄當(dāng)前濕度
- }
- else
- if(humi_old>Humi_H) //判斷濕度是否下降
- {
- LCD_disp_char(15,1,0x02); //顯示‘↓’
- Delay_ms(50); //延時
- humi_old=Humi_H; //記錄當(dāng)前濕度
- }
- if(temp_old<Temp_H) //判斷溫度是否上升
- {
- LCD_disp_char(15,2,0x01); //顯示‘↑’
- Delay_ms(50); //延時
- temp_old=Temp_H; //記錄當(dāng)前溫度
- }
- else
- if(temp_old>Temp_H) //判斷溫度是否下降
- {
- LCD_disp_char(15,2,0x02); //顯示‘↓’
- Delay_ms(50); //延時
- temp_old=Temp_H; //記錄當(dāng)前溫度
- }
- //顯示實測濕度值
- LCD_disp_char(6,1,ASCII[Humi_H/10]);
- LCD_disp_char(7,1,ASCII[Humi_H%10]);
- LCD_disp_char(8,1,ASCII[12]);
- LCD_disp_char(9,1,ASCII[Humi_L%10]);
- LCD_disp_char(10,1,'0');
- //顯示實測溫度值
- LCD_disp_char(6,2,ASCII[Temp_H/10]);
- LCD_disp_char(7,2,ASCII[Temp_H%10]);
- LCD_disp_char(8,2,ASCII[12]);
- LCD_disp_char(9,2,ASCII[Temp_L%10]);
- LCD_disp_char(10,2,'0');
-
- if(temp_up<=Temp_H||temp_down>Temp_H||humi_up<=Humi_H||humi_down>Humi_H) //判斷是否超出設(shè)置的溫濕度上下限
- {
- buzz=0; //超出的話蜂鳴器響起
- led=0; //點亮報警燈
- led1=1;
- }
- else //否者溫濕度都處于限值范圍內(nèi)
- {
- buzz=1; //關(guān)閉蜂鳴器
- led=1;
- led1=0; //點亮正常燈
- }
- }
- }
- /********************************************************
- 函數(shù)名稱:void display2(void)
- 函數(shù)作用:顯示設(shè)置時溫濕度上下限
- 參數(shù)說明:
- ********************************************************/
- void display2(void)
- {
- T0_num++;
- lcd1602_write_character(0,1,"Humi:Up");
- lcd1602_write_character(0,2,"Temp:Up");
- lcd1602_write_character(9,1,",Down");
- lcd1602_write_character(9,2,",Down");
- if(T0_num%2==0) //偶數(shù)次顯示,奇數(shù)次不顯示。這樣就會有閃爍效果,可以清楚看到當(dāng)前設(shè)置的是哪個值
- {
- LCD_disp_char(7,1,ASCII[humi_up/10]); //顯示 濕度上限
- LCD_disp_char(8,1,ASCII[humi_up%10]);
- LCD_disp_char(14,1,ASCII[humi_down/10]); //顯示 濕度下限
- LCD_disp_char(15,1,ASCII[humi_down%10]);
-
- LCD_disp_char(7,2,ASCII[temp_up/10]); //顯示 溫度上限
- LCD_disp_char(8,2,ASCII[temp_up%10]);
- LCD_disp_char(14,2,ASCII[temp_down/10]); //顯示 溫度下限
- LCD_disp_char(15,2,ASCII[temp_down%10]);
- Delay_ms(1);
- }
- else //奇數(shù)次不顯示
- {
- switch(set_f)//根據(jù)當(dāng)前設(shè)置的內(nèi)容,對應(yīng)位置閃爍
- {
- case 1:lcd1602_write_character(7,1," "); break;
- case 2:lcd1602_write_character(14,1," "); break;
- case 3:lcd1602_write_character(7,2," "); break;
- case 4:lcd1602_write_character(14,2," "); break;
- default: break;
- }
- }
- }
- /********************************************************
- 函數(shù)名稱:void delayms(uint ms)
- 函數(shù)作用:毫秒延時函數(shù)
- 參數(shù)說明:
- ********************************************************/
- void delayms(uint ms)
- {
- unsigned char i=100,j;
- for(;ms;ms--)
- {
- while(--i)
- {
- j=10;
- while(--j);
- }
- }
- }
- /********************************************************
- 函數(shù)名稱:void scan(void)
- 函數(shù)作用:按鍵檢測函數(shù)
- 參數(shù)說明:
- ********************************************************/
- void scan(void)
- {
- //設(shè)置鍵,不支持連按
- if(key_set==0) //按鍵按下
- {
- delayms(7); //延時消抖
- if(key_set==0) //再次確認按鍵按下
- {
- led=1; //關(guān)閉報警燈
- led1=1;
- buzz=1; //關(guān)閉蜂鳴器
- if(set_f==0)//進入設(shè)置先清除屏幕,顯示設(shè)置部分
- {
- LCD_write_command(0x01); //清除屏幕顯示
- delay_n40us(100); //延時等待全部清除完畢
- }
- set_f++; //設(shè)置變量+1
- if(set_f==5)//全部設(shè)置完成,退出設(shè)置
- {
- set_f=0;//重置設(shè)置變量
- AT24C02_write_date(0,humi_up); //寫入【濕度上限】數(shù)據(jù)保存
- AT24C02_write_date(1,humi_down);//寫入【濕度下限】數(shù)據(jù)保存
- AT24C02_write_date(2,temp_up); //寫入【溫度上限】數(shù)據(jù)保存
- AT24C02_write_date(3,temp_down);//寫入【溫度下限】數(shù)據(jù)保存
-
- LCD_write_command(0x01); //清除屏幕顯示
- delay_n40us(100); //延時等待全部清除完畢
- fixed_display(); //清除顯示后顯示固定部分
- }
- }
- while(!key_set);//檢測按鍵松開
- }
- //加值鍵,支持連按
- if(key_jia==0&&set_f!=0)
- {
- delayms(7);
- if(key_jia==0)
- {
- if(set_f==1) //設(shè)置 濕度上限值
- {
- if(humi_up<99) //最大值可設(shè)置99%RH
- humi_up++; //濕度上限+1%RH
- }
-
- if(set_f==2) //設(shè)置 濕度下限值
- {
- if(humi_down<99&&humi_down+1<humi_up)//最大值可設(shè)置99%RH,并且下限不可超過上限
- humi_down++;//濕度下限+1%RH
- }
-
- if(set_f==3) //設(shè)置 溫度上限值
- {
- if(temp_up<99) //最大值可設(shè)置99℃
- temp_up++; //濕度上限+1℃
- }
-
- if(set_f==4) //設(shè)置 溫度下限值
- {
- if(temp_down<99&&temp_down+1<temp_up)//最大值可設(shè)置99℃,并且下限不可超過上限
- temp_down++;//溫度下限+1℃
- }
- }
- }
- //減值鍵,支持連按
- if(key_jian==0&&set_f!=0)
- {
- delayms(7);
- if(key_jian==0)
- {
- if(set_f==1) //設(shè)置濕度上限值
- {
- if(humi_up!=0&&humi_up>humi_down+1)//最小值可設(shè)置0%RH,并且上限得比下限大
- humi_up--; //濕度上限值-1%RH
- }
-
- if(set_f==2) //設(shè)置濕度下限值
- {
- if(humi_down!=0)//最小值可設(shè)置0%RH
- humi_down--;//濕度下限值-1%RH
- }
-
- if(set_f==3) //設(shè)置溫度上限值
- {
- if(temp_up!=0&&temp_up>temp_down+1)//最小值可設(shè)置0℃,并且上限得比下限大
- temp_up--; //溫度上限值-1℃
- }
-
- if(set_f==4) //設(shè)置溫度下限值
- {
- if(temp_down!=0)//最小值可設(shè)置0℃
- temp_down--;//溫度下限值-1℃
- }
- }
- }
- }
- /********************************************************
- 函數(shù)名稱:void main()
- 函數(shù)作用:主函數(shù)
- 參數(shù)說明:
- ********************************************************/
- void main()
- {
- if(key_jian==0)
- {
- delayms(100);
- if(key_jian==0)
- {
- AT24C02_write_date(0,75);//寫入【濕度上限值】數(shù)據(jù)保存
- AT24C02_write_date(1,45);//寫入【濕度下限值】數(shù)據(jù)保存
- AT24C02_write_date(2,30);//寫入【溫度上限值】數(shù)據(jù)保存
- AT24C02_write_date(3,16);//寫入【溫度下限值】數(shù)據(jù)保存
- }
- }
- humi_up=AT24C02_read_date(0); //讀取存儲的【濕度上限值】數(shù)據(jù)
- humi_down=AT24C02_read_date(1);//讀取存儲的【濕度下限值】數(shù)據(jù)
- temp_up=AT24C02_read_date(2); //讀取存儲的【溫度上限值】數(shù)據(jù)
- temp_down=AT24C02_read_date(3);//讀取存儲的【溫度下限值】數(shù)據(jù)
- LCD_init(); //初始化LCD1602
- lcd1602_write_pic(0x00,pic); //將自定義字符“°”寫入到LCD1602中
- lcd1602_write_pic(0x01,zeng); //將自定義字符“↑”寫入到LCD1602中
- lcd1602_write_pic(0x02,jian); //將自定義字符“↓”寫入到LCD1602中
- fixed_display(); //顯示固定內(nèi)容
- while(1)
- {
- scan(); //按鍵檢測處理
- if(set_f==0) //正常顯示模式
- {
- DHT11_read(); //讀取DHT11溫濕度
- display1(); //顯示當(dāng)前溫、濕度
- }
- else
- display2(); //顯示設(shè)置溫濕度上下限
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
大棚溫濕度檢測.7z
(2.2 MB, 下載次數(shù): 153)
2020-2-27 15:44 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
|