|
oth11溫濕度傳感器,at89c51單片機(jī)
設(shè)計(jì)要求:
①了解DTH1I溫濕度模塊的功能;
②利用T0實(shí)現(xiàn)1秒(或自定義時(shí)間)定時(shí),定時(shí)時(shí)間到,獲取當(dāng)前溫濕度值,在OLED
液晶上顯示溫濕度值;
③通過(guò)矩陣鍵盤和OLED液晶設(shè)計(jì)人機(jī)交互設(shè)置界面,可設(shè)置3檔溫濕度狀態(tài)(正常、
1級(jí)警報(bào)和2級(jí)警報(bào)),報(bào)警位置顯示在OLED液晶最后兩行,要求16個(gè)按鍵的功能分別為:
0~9、設(shè)置、左移、右移、上移、下移、確認(rèn);
④超限進(jìn)行報(bào)警和燈光指示,當(dāng)處于不同安全等級(jí)時(shí),給出不同的報(bào)警提示,利用51
mini板上的蜂鳴器和LED實(shí)現(xiàn),并且將安全等級(jí)反映在OLED界面上;
⑤要求OLED液晶第一-行為溫度值,第二行為濕度值,應(yīng)有字符加以區(qū)分;
⑥按下“設(shè)置"功能按鍵,可以進(jìn)入單獨(dú)設(shè)置界面,設(shè)置溫濕度報(bào)警值;
⑦制定通訊協(xié)議,可以在PC機(jī)通過(guò)串口助手獲取溫濕度值和系統(tǒng)運(yùn)行狀態(tài)(正常、1
級(jí)警報(bào)或2級(jí)警報(bào));
⑧制定通訊協(xié)議,可以在PC機(jī)通過(guò)串口助手設(shè)定溫濕度報(bào)警值。
單片機(jī)源程序如下:
- #include <STC12C5A60S2.H>
- #include<dht11.h>
- #include<oled12864.H>
- #include<uart.h>
- #include<keyboard.h>
- sbit led = P3^1;
- sbit beep = P3^2;
- //變量定義
- unsigned char getUart[8],Recv_Val,getUart_i;
- unsigned char key,c0;
- //默認(rèn)設(shè)定定時(shí)時(shí)間為1s
- unsigned int settingTime=100;//100*10ms=1000ms=1s
- //默認(rèn)設(shè)定報(bào)警溫度
- unsigned int settingTemp1=20;
- unsigned int settingTemp2=30;
- //默認(rèn)設(shè)定報(bào)警濕度
- unsigned int settingHumi1=50;
- unsigned int settingHumi2=60;
- extern int temp_value, humi_value; //讀到的溫濕度值
- //溫濕度報(bào)警標(biāo)記
- unsigned char humiAlert=0,tempAlert=0;
- unsigned char mode=0;//設(shè)置濕度模式:2,設(shè)置溫度模式:1,正常模式:0
- void timer0Init()
- {
- TMOD = (TMOD&0xF0)|0X01;
- ET0 = 1;
- EA = 1;
- TH0 = (65536-50000)/256;
- TL0 = (65536-50000)%256;
- TR0 = 1;
- }
- ////////////轉(zhuǎn)換成ASII碼//////////////////
- void toString(unsigned char* array,unsigned char dat)
- {
- array[0] = dat/10+0x30;
- array[1] = dat%10+0x30;
- }
- //溫度設(shè)置界面行光標(biāo)
- unsigned char tLineIndex = 0;
- //溫度設(shè)置界面列光標(biāo)
- unsigned char tRowIndex = 0;
- //濕度設(shè)置界面行光標(biāo)
- unsigned char hLineIndex = 0;
- //濕度設(shè)置界面列光標(biāo)
- unsigned char hRowIndex = 0;
-
- //串口接收一條指令完成
- bit recvComplete=0;
- //按鍵處理函數(shù)
- void KeyFun()
- {
- key = Check_KeyBoard();
- if(key != 20)
- {
- switch(key)
- {
- case 10://設(shè)置
- //在設(shè)置溫度濕度模式之間切換
- if(mode==0)
- {
- mode=1;
- }
- else if(mode==1)
- {
- mode=2;
- }
- else if(mode==2)
- {
- mode=1;
- }
- break;
- case 11://左移
- //設(shè)置模式才可以按
- if(mode!=0)
- {
- //溫度設(shè)置
- if(mode==1)
- {
- if(tRowIndex<2)
- {
- tRowIndex++;
- }
- }
- //濕度設(shè)置
- else
- {
- if(hRowIndex<2)
- {
- hRowIndex++;
- }
- }
- }
- break;
- case 12://右移
- //設(shè)置模式才可以按
- if(mode!=0)
- {
- //溫度設(shè)置
- if(mode==1)
- {
- if(tRowIndex>0)
- {
- tRowIndex--;
- }
- }
- //濕度設(shè)置
- else
- {
- if(hRowIndex>0)
- {
- hRowIndex--;
- }
- }
- }
- break;
- case 13://上移
- //設(shè)置模式才可以按
- if(mode!=0)
- {
- //溫度設(shè)置
- if(mode==1)
- {
- if(tLineIndex>0)
- {
- tLineIndex--;
- }
- }
- //濕度設(shè)置
- else
- {
- if(hLineIndex>0)
- {
- hLineIndex--;
- }
- }
- }
- break;
- case 14://下移
- //設(shè)置模式才可以按
- if(mode!=0)
- {
- //溫度設(shè)置
- if(mode==1)
- {
- if(tLineIndex<2)
- {
- tLineIndex++;
- }
- }
- //濕度設(shè)置
- else
- {
- if(hLineIndex<2)
- {
- hLineIndex++;
- }
- }
- }
- break;
- case 15://確認(rèn)
- //設(shè)置模式才可以按確認(rèn)
- if(mode!=0)
- {
- mode=0;
- }
- break;
- default://0-9:設(shè)定對(duì)應(yīng)光標(biāo)上的數(shù)值
- //設(shè)置模式才可以按0-9
- if(mode!=0)
- {
- //溫度設(shè)置
- if(mode==1)
- {
- if(tLineIndex==0)//設(shè)定settingTemp1
- {
- if(tRowIndex==0)//設(shè)置十位
- {
- unsigned char ge = settingTemp1%10;//舊的個(gè)位
- settingTemp1=key*10+ge;
- }
- else
- {
- unsigned char shi = settingTemp1/10;//舊的十位
- settingTemp1=shi*10+key;
- }
- }
- else if(tLineIndex==1)//設(shè)定settingTemp2
- {
- if(tRowIndex==0)//設(shè)置十位
- {
- unsigned char ge = settingTemp2%10;//舊的個(gè)位
- settingTemp2=key*10+ge;
- }
- else
- {
- unsigned char shi = settingTemp2/10;//舊的十位
- settingTemp2=shi*10+key;
- }
- }
- }
- //濕度設(shè)置
- else
- {
- if(hLineIndex==0)//設(shè)定settingHumi1
- {
- if(hRowIndex==0)//設(shè)置十位
- {
- unsigned char ge = settingHumi1%10;//舊的個(gè)位
- settingHumi1=key*10+ge;
- }
- else
- {
- unsigned char shi = settingHumi1/10;//舊的十位
- settingHumi1=shi*10+key;
- }
- }
- else if(hLineIndex==1)//設(shè)定settingHumi2
- {
- if(hRowIndex==0)//設(shè)置十位
- {
- unsigned char ge = settingHumi2%10;//舊的個(gè)位
- settingHumi2=key*10+ge;
- }
- else
- {
- unsigned char shi = settingHumi2/10;//舊的十位
- settingHumi2=shi*10+key;
- }
- }
- }
- }
- break;
- }
- }
- }
- void displayNormal()
- {
- unsigned char tempDisBuf[]="Temp:00C";//顯示溫度
- unsigned char humiDisBuf[]="Humi:00%";//顯示濕度
- unsigned char humiAlertDisBuf[]="HumiAlert:0";//顯示濕度
- unsigned char tempAlertDisBuf[]="TempAlert:0";//顯示濕度
- LCD_Fill(0x00); //清屏
- toString(tempDisBuf+5,temp_value);//填充溫度
- toString(tempDisBuf+5,humi_value);//填充濕度
- LCD_P8x16Str(0,0,tempDisBuf);//顯示溫度
- LCD_P8x16Str(0,1,humiDisBuf);//顯示濕度
- tempAlertDisBuf[10]='0'+tempAlert;//填充溫度報(bào)警值
- humiAlertDisBuf[10]='0'+humiAlert;//填充濕度報(bào)警值
- LCD_P8x16Str(0,2,tempAlertDisBuf);//顯示溫度報(bào)警
- LCD_P8x16Str(0,3,humiAlertDisBuf);//顯示濕度報(bào)警
- }
- void sendStatus()
- {
- unsigned char tempDisBuf[]="Temp:00C\r\n";//顯示溫度
- unsigned char humiDisBuf[]="Humi:00%\r\n";//顯示濕度
- unsigned char humiAlertDisBuf[]="HumiAlert:0\r\n";//顯示濕度
- unsigned char tempAlertDisBuf[]="TempAlert:0\r\n";//顯示濕度
- toString(tempDisBuf+5,temp_value);//填充溫度
- toString(tempDisBuf+5,humi_value);//填充濕度
- tempAlertDisBuf[10]='0'+tempAlert;//填充溫度報(bào)警值
- humiAlertDisBuf[10]='0'+humiAlert;//填充濕度報(bào)警值
- UART1_SendStr(tempDisBuf);//發(fā)送溫度
- UART1_SendStr(humiDisBuf);//發(fā)送濕度
- UART1_SendStr(tempAlertDisBuf);//發(fā)送溫度報(bào)警
- UART1_SendStr(humiAlertDisBuf);//發(fā)送濕度報(bào)警
- }
- void displaySetTemp()
- {
- unsigned char buf[]=" Temp1=00";
- LCD_Fill(0x00); //清屏
- LCD_P8x16Str(0,0,"Temp Setting");
- buf[0]=(tLineIndex==0)?'-':' ';//當(dāng)前修改行光標(biāo)指示
- buf[5]='1';//填充Temp1
- toString(buf+7,settingTemp1);//填充
- LCD_P8x16Str(0,1,buf);//顯示settingTemp1
- buf[1]=(tLineIndex==1)?'-':' ';//當(dāng)前修改行光標(biāo)指示
- buf[5]='2';//填充Temp2
- toString(buf+7,settingTemp2);//填充
- LCD_P8x16Str(0,2,buf);//顯示settingTemp2
- }
- void displaySetHumi()
- {
- unsigned char buf[]=" Humi1=00";
- LCD_Fill(0x00); //清屏
- LCD_P8x16Str(0,0,"Humi Setting");
- buf[0]=(tLineIndex==0)?'-':' ';//當(dāng)前修改行光標(biāo)指示
- buf[5]='1';//填充Temp1
- toString(buf+7,settingHumi1);//填充
- LCD_P8x16Str(0,1,buf);//顯示settingTemp1
- buf[1]=(tLineIndex==1)?'-':' ';//當(dāng)前修改行光標(biāo)指示
- buf[5]='2';//填充Temp2
- toString(buf+7,settingHumi2);//填充
- LCD_P8x16Str(0,2,buf);//顯示settingTemp2
- }
- void main()
- {
- unsigned int tmpTime=0;
- unsigned int tmpVal=0;
- unsigned char tmpCharVal=0;
- timer0Init();//初始化定時(shí)器0,用于定時(shí)檢測(cè)溫度濕度
- UART1_Init(0xDc,0,1);
- LCD_Init();
-
- while(1)
- {
- //根據(jù)當(dāng)前模式顯示不同的界面
- switch(mode)
- {
- case 0:
- displayNormal();
- break;
- case 1:
- displaySetTemp();
- break;
- case 2:
- displaySetHumi();
- break;
- default:
- break;
- }
-
- //按鍵函數(shù)
- KeyFun();
-
- //處理串口數(shù)據(jù)
- //協(xié)議:
- //設(shè)置定時(shí)時(shí)間:"*S1100#",其中1100表示1100ms,最大為9999ms(只能為4位)
- //設(shè)置溫度閾值:"*T1:50#",其中1表示閾值1,可為1,2;50表示設(shè)定該值為50(只能為2位)
- //設(shè)置濕度閾值:"*H1:50#",其中1表示閾值1,可為1,2;50表示設(shè)定該值為50(只能為2位)
- //獲取運(yùn)行參數(shù):"*G#"
- if(recvComplete==1)
- {
- switch(getUart[1])
- {
- case 'S':
- tmpTime = (getUart[2]-'0')*1000+(getUart[3]-'0')*100+(getUart[4]-'0')*10+(getUart[5]-'0');
- if(tmpTime<9999)
- {
- settingTime=tmpTime;
- }
- else
- {
- UART1_SendStr("Set timer0 error!\r\n");
- }
- break;
- case 'T':
- tmpCharVal = getUart[2]-'0';
- tmpVal = (getUart[4]-'0')*10+(getUart[5]-'0');
- if((tmpVal<99)&&(tmpCharVal<3)&&(tmpCharVal>0))
- {
- if(tmpCharVal==1)
- {
- settingTemp1 = tmpVal;
- }
- else
- {
- settingTemp2 = tmpVal;
- }
- }
- else
- {
- UART1_SendStr("Set Temp value error!\r\n");
- }
- break;
- case 'H':
- tmpCharVal = getUart[2]-'0';
- tmpVal = (getUart[4]-'0')*10+(getUart[5]-'0');
- if((tmpVal<99)&&(tmpCharVal<3)&&(tmpCharVal>0))
- {
- if(tmpCharVal==1)
- {
- settingHumi1 = tmpVal;
- }
- else
- {
- settingHumi2 = tmpVal;
- }
- }
- else
- {
- UART1_SendStr("Set Humi value error!\r\n");
- }
- break;
- case 'G':
- sendStatus();
- break;
- }
- recvComplete=0;
- }
-
- //判斷是否聲光報(bào)警
- if((humiAlert>0)||(tempAlert>0))
- {
- beep=1;
- led=1;
- }
- else
- {
- beep=0;
- led=0;
- }
- }
- }
- void Timer0_Int() interrupt 1
- {
- //10ms中斷一次
- TH0 = (65536-10000)/256;
- TL0 = (65536-10000)%256;
-
- c0++;
- if(c0==settingTime)
- {
- //定時(shí)時(shí)間到,獲取一次溫濕度
- getDHT11();
-
- //檢查溫度范圍是否需要報(bào)警,不報(bào)警tempAlert=0,一檔二檔報(bào)警分別為1,2
- if(temp_value<=settingTemp1)
- {
- tempAlert=0;
- }
- else if(temp_value<=settingTemp2)
- {
- tempAlert=1;
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
3.rar
(113.75 KB, 下載次數(shù): 50)
2020-1-8 23:15 上傳
點(diǎn)擊文件名下載附件
含程序原理圖
|
|