|
本次設(shè)計(jì)采用的單片機(jī)AT89C52和DHT11的溫度濕度的檢測系統(tǒng)。分為硬件電路設(shè)計(jì)和單片機(jī)程序設(shè)計(jì)。硬件電路包括單片機(jī)、溫濕度傳感器、顯示模塊、報(bào)警模塊以及按鍵。之所以采用AT89C52和DHT11溫濕度傳感器及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é)果
- #include<reg52.h> //頭文件
- #include<LCD1602.h>
- #include<AT24C02.h>
- #include<DHT11.h>
- #include<oled.h>
- /*****************燈、蜂鳴器、按鍵引腳定義*******************/
- sbit led = P3^7; //超限指示燈
- sbit led1 = P3^2; //正常指示燈
- sbit buzz = P2^3; //蜂鳴器
- sbit key_set = P1^5; //設(shè)置鍵
- sbit key_jia = P1^6; //加鍵
- sbit key_jian= P1^7; //減鍵
- /************************變量定義***********************/
- 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è)置溫度下限。
- void jiexianw();
- void Delay_1ms(uint i);
- /********************************************************
- 函數(shù)名稱:void display(void)
- 函數(shù)作用:oled顯示固定作用
- 參數(shù)說明:
- ********************************************************/
- void fixed_display(void)
- {
- OLED_ShowString(0,0,"Temp:"); //固定位置顯示“Temp:”
- OLED_ShowString(56,0,"."); //固定位置顯示“.”
- OLED_ShowString(80,0,"C"); //固定位置顯示“C”
- OLED_ShowString(0,1,"Humi:"); //固定位置顯示“Humi:”
- OLED_ShowString(56,1,"."); //固定位置顯示“.”
- OLED_ShowString(80,1,"%"); //固定位置顯示“%”
- if(set_f==0) //設(shè)置鍵沒按下,非設(shè)置模式
- {
- OLED_ShowString(80,4," "); //不顯示
- }
- if(set_f==1) //設(shè)置鍵按了1次
- {
- OLED_ShowString(80,4," HU"); //顯示“HU”
- }
- if(set_f==2) //設(shè)置鍵按了2次
- {
- OLED_ShowString(80,4," HD"); //顯示“HD”
- }
- if(set_f==3) //設(shè)置鍵按了3次
- {
- OLED_ShowString(80,4," TU"); //顯示“TU”
- }
- if(set_f==4) //設(shè)置鍵按了4次
- {
- OLED_ShowString(80,4," TD"); //顯示“TD”
- }
- }
- /********************************************************
- 函數(shù)名稱:void display1(void)
- 函數(shù)作用:顯示當(dāng)前實(shí)際溫濕度
- 參數(shù)說明:
- /********************************************************/
- void display1(void)
- {
-
- if(DHT11_Check()==1) //判斷校驗(yàn)和是否正確
- {
- if(humi_old<Humi_H) //判斷濕度是否上升
- {
-
- OLED_ShowString(88,1,"up"); //上升則顯示‘up’
-
- Delay_ms(50); //延時(shí)
- humi_old=Humi_H; //記錄當(dāng)前濕度
- }
- else
- if(humi_old>Humi_H) //判斷濕度是否下降
- {
- OLED_ShowString(88,1,"down"); //下降則顯示‘down’
- Delay_ms(50); //延時(shí)
- humi_old=Humi_H; //記錄當(dāng)前濕度
- }
- if(temp_old<Temp_H) //判斷溫度是否上升
- {
- OLED_ShowString(88,0,"up"); //上升則顯示‘up’
- Delay_ms(50); //延時(shí)
- temp_old=Temp_H; //記錄當(dāng)前溫度
- }
- else
- if(temp_old>Temp_H) //判斷溫度是否下降
- {
- OLED_ShowString(88,0,"down"); //下降顯示‘down’
- Delay_ms(50); //延時(shí)
- temp_old=Temp_H; //記錄當(dāng)前溫度
- }
- //顯示實(shí)測濕度值
- OLED_ShowChar(40,1,ASCII[Humi_H/10]);//顯示濕度十位的數(shù)值
- OLED_ShowChar(48,1,ASCII[Humi_H%10]);//顯示濕度個(gè)位的數(shù)值
- OLED_ShowChar(64,1,ASCII[Humi_L/10]);//顯示濕度十分位的數(shù)值
- OLED_ShowChar(70,1,ASCII[Humi_L%10]);//顯示濕度百分位的數(shù)值
-
-
- OLED_ShowChar(40,0,ASCII[Temp_H/10]);//顯示溫度十位的數(shù)值
- OLED_ShowChar(48,0,ASCII[Temp_H%10]);//顯示溫度個(gè)位的數(shù)值
- OLED_ShowChar(64,0,ASCII[Temp_L/10]);//顯示溫度十分位的數(shù)值
- OLED_ShowChar(70,0,ASCII[Temp_L%10]);//顯示溫度百分位的數(shù)值
-
- if(temp_up<=Temp_H||temp_down>Temp_H||humi_up<=Humi_H||humi_down>Humi_H) //判斷是否超出設(shè)置的溫濕度上下限
- {
- buzz=0; //超出的話蜂鳴器響起
- led=0; //點(diǎn)亮報(bào)警燈
- led1=1;
- }
- else //否者溫濕度都處于限值范圍內(nèi)
- {
- buzz=1; //關(guān)閉蜂鳴器
- led=1;
- led1=0; //點(diǎn)亮正常燈
- }
- jiexianw();
- }
- }
- /***************溫度上下限限制*******************/
- void jiexianw()
- {
- fixed_display(); //顯示固定內(nèi)容
- OLED_ShowString(0,4,"T&H limit"); //設(shè)置區(qū)域顯示"T&H limit"
- OLED_ShowString(0,5,"T:UP"); //設(shè)置區(qū)域顯示"T:UP"
- OLED_ShowChar(32,5,ASCII[temp_up/10]); //設(shè)置區(qū)域顯示溫度上限十位的數(shù)值
- OLED_ShowChar(40,5,ASCII[temp_up%10]); //設(shè)置區(qū)域顯示溫度上限個(gè)位的數(shù)值
- OLED_ShowString(56,5,"DOWN"); //設(shè)置區(qū)域顯示"DOWN"
- OLED_ShowChar(88,5,ASCII[temp_down/10]);//設(shè)置區(qū)域顯示溫度下限十位的數(shù)值
- OLED_ShowChar(94,5,ASCII[temp_down%10]);//設(shè)置區(qū)域顯示溫度下限個(gè)位的數(shù)值
-
- OLED_ShowString(0,6,"H:UP"); //設(shè)置區(qū)域顯示"H:UP"
- OLED_ShowChar(32,6,ASCII[humi_up/10]); //設(shè)置區(qū)域顯示濕度上限十位的數(shù)值
- OLED_ShowChar(40,6,ASCII[humi_up%10]); //設(shè)置區(qū)域顯示濕度上限十位的數(shù)值
- OLED_ShowString(56,6,"DOWN"); //設(shè)置區(qū)域顯示"DOWN"
- OLED_ShowChar(88,6,ASCII[humi_down/10]);//設(shè)置區(qū)域顯示濕度下限十位的數(shù)值
- OLED_ShowChar(94,6,ASCII[humi_down%10]);//設(shè)置區(qū)域顯示濕度下限個(gè)位的數(shù)值
-
- }
- /********************************************************
- 函數(shù)名稱:void delayms(uint ms)
- 函數(shù)作用:毫秒延時(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); //延時(shí)消抖
- if(key_set==0) //再次確認(rèn)按鍵按下
- {
- led=1; //關(guān)閉報(bào)警燈
- led1=1; //關(guān)閉正常燈
- buzz=1; //關(guān)閉蜂鳴器
- if(set_f==0) //進(jìn)入設(shè)置先清除屏幕,顯示設(shè)置部分
- {
- OLED_Clear(); //清除屏幕顯示
- delay_n40us(100); //延時(shí)等待全部清除完畢
- }
- 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ù)保存
-
- OLED_Clear(); //清除屏幕顯示
- delay_n40us(100); //延時(shí)等待全部清除完畢
- fixed_display(); //清除顯示后顯示固定部分
- }
- }
- while(!key_set); //檢測按鍵松開
- }
- //加值鍵,支持連按
- if(key_jia==0&&set_f!=0||key_jian==0&&set_f!=0)//進(jìn)入設(shè)置模式,按下加鍵或減鍵
- {
- delayms(7); //延時(shí)消抖
- if(set_f==1) //設(shè)置濕度上限
- {
- if(key_jia==0)
- {
- if(humi_up<99) //濕度最大值不可大于99%RH
- humi_up++; //濕度上限+1%RH
- }
- if(key_jian==0)
- {
- if(humi_up!=0&&humi_up>humi_down+1)//濕度上限最小不可為0%RH,并且上限得比下限大
- humi_up--; //濕度上限值-1%RH
-
- }
- }
- if(set_f==2) //設(shè)置濕度下限
- {
- if(key_jia==0)
- {
- if(humi_down<99&&humi_down+1<humi_up)//濕度下限最大值小于99%RH,并且下限不可超過上限
- humi_down++; //濕度下限+1%RH
- }
- if(key_jian==0)
- {
- if(humi_down!=0) //濕度下限最小值不可為0%RH
- humi_down--; //濕度下限值-1%RH
- }
- }
- if(set_f==3) //設(shè)置溫度上限
- {
- if(key_jia==0)
- {
- if(temp_up<99) //溫度上限最大值不可大于99℃
- temp_up++; //濕度上限+1℃
- }
- if(key_jian==0)
- {
- if(temp_up!=0&&temp_up>temp_down+1)//溫度上限最小值不可為0℃,并且上限得比下限大
- temp_up--; //溫度上限值-1℃
-
- }
- }
- if(set_f==4) //設(shè)置溫度下限
- {
- if(key_jia==0)
- {
- if(temp_down<99&&temp_down+1<temp_up)//溫度下限最大值不可大于99℃,并且下限不可超過上限
- temp_down++; //溫度下限+1℃
- }
- if(key_jian==0)
- {
- if(temp_down!=0) //溫度下限最小值不可為0℃
- temp_down--; //溫度下限值-1℃
-
- }
- }
- }
- }
- /********************************************************
- 函數(shù)名稱:void main()
- 函數(shù)作用:主函數(shù)
- 參數(shù)說明:
- ********************************************************/
- void main()
- {
- if(key_jian==0) //按鍵按下
- {
- delayms(100); //延時(shí)消抖
- 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ù)
- OLED_Init(); //顯示屏初始化
- fixed_display(); //顯示固定內(nèi)容
- while(1)
- {
- scan(); //按鍵檢測處理
- DHT11_read(); //讀取DHT11溫濕度
- display1(); //顯示當(dāng)前溫、濕度
- }
- }
復(fù)制代碼
|
評分
-
查看全部評分
|