oth11溫濕度傳感器,at89c51單片機
設(shè)計要求:
①了解DTH1I溫濕度模塊的功能;
②利用T0實現(xiàn)1秒(或自定義時間)定時,定時時間到,獲取當前溫濕度值,在OLED
液晶上顯示溫濕度值;
③通過矩陣鍵盤和OLED液晶設(shè)計人機交互設(shè)置界面,可設(shè)置3檔溫濕度狀態(tài)(正常、
1級警報和2級警報),報警位置顯示在OLED液晶最后兩行,要求16個按鍵的功能分別為:
0~9、設(shè)置、左移、右移、上移、下移、確認;
④超限進行報警和燈光指示,當處于不同安全等級時,給出不同的報警提示,利用51
mini板上的蜂鳴器和LED實現(xiàn),并且將安全等級反映在OLED界面上;
⑤要求OLED液晶第一-行為溫度值,第二行為濕度值,應(yīng)有字符加以區(qū)分;
⑥按下“設(shè)置"功能按鍵,可以進入單獨設(shè)置界面,設(shè)置溫濕度報警值;
⑦制定通訊協(xié)議,可以在PC機通過串口助手獲取溫濕度值和系統(tǒng)運行狀態(tài)(正常、1
級警報或2級警報);
⑧制定通訊協(xié)議,可以在PC機通過串口助手設(shè)定溫濕度報警值。
單片機源程序如下:
- #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;
- //默認設(shè)定定時時間為1s
- unsigned int settingTime=100;//100*10ms=1000ms=1s
- //默認設(shè)定報警溫度
- unsigned int settingTemp1=20;
- unsigned int settingTemp2=30;
- //默認設(shè)定報警濕度
- unsigned int settingHumi1=50;
- unsigned int settingHumi2=60;
- extern int temp_value, humi_value; //讀到的溫濕度值
- //溫濕度報警標記
- 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è)置界面行光標
- unsigned char tLineIndex = 0;
- //溫度設(shè)置界面列光標
- unsigned char tRowIndex = 0;
- //濕度設(shè)置界面行光標
- unsigned char hLineIndex = 0;
- //濕度設(shè)置界面列光標
- 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://確認
- //設(shè)置模式才可以按確認
- if(mode!=0)
- {
- mode=0;
- }
- break;
- default://0-9:設(shè)定對應(yīng)光標上的數(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;//舊的個位
- 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;//舊的個位
- 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;//舊的個位
- 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;//舊的個位
- 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;//填充溫度報警值
- humiAlertDisBuf[10]='0'+humiAlert;//填充濕度報警值
- LCD_P8x16Str(0,2,tempAlertDisBuf);//顯示溫度報警
- LCD_P8x16Str(0,3,humiAlertDisBuf);//顯示濕度報警
- }
- 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;//填充溫度報警值
- humiAlertDisBuf[10]='0'+humiAlert;//填充濕度報警值
- UART1_SendStr(tempDisBuf);//發(fā)送溫度
- UART1_SendStr(humiDisBuf);//發(fā)送濕度
- UART1_SendStr(tempAlertDisBuf);//發(fā)送溫度報警
- UART1_SendStr(humiAlertDisBuf);//發(fā)送濕度報警
- }
- void displaySetTemp()
- {
- unsigned char buf[]=" Temp1=00";
- LCD_Fill(0x00); //清屏
- LCD_P8x16Str(0,0,"Temp Setting");
- buf[0]=(tLineIndex==0)?'-':' ';//當前修改行光標指示
- buf[5]='1';//填充Temp1
- toString(buf+7,settingTemp1);//填充
- LCD_P8x16Str(0,1,buf);//顯示settingTemp1
- buf[1]=(tLineIndex==1)?'-':' ';//當前修改行光標指示
- 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)?'-':' ';//當前修改行光標指示
- buf[5]='1';//填充Temp1
- toString(buf+7,settingHumi1);//填充
- LCD_P8x16Str(0,1,buf);//顯示settingTemp1
- buf[1]=(tLineIndex==1)?'-':' ';//當前修改行光標指示
- 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();//初始化定時器0,用于定時檢測溫度濕度
- UART1_Init(0xDc,0,1);
- LCD_Init();
-
- while(1)
- {
- //根據(jù)當前模式顯示不同的界面
- switch(mode)
- {
- case 0:
- displayNormal();
- break;
- case 1:
- displaySetTemp();
- break;
- case 2:
- displaySetHumi();
- break;
- default:
- break;
- }
-
- //按鍵函數(shù)
- KeyFun();
-
- //處理串口數(shù)據(jù)
- //協(xié)議:
- //設(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位)
- //獲取運行參數(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;
- }
-
- //判斷是否聲光報警
- 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)
- {
- //定時時間到,獲取一次溫濕度
- getDHT11();
-
- //檢查溫度范圍是否需要報警,不報警tempAlert=0,一檔二檔報警分別為1,2
- if(temp_value<=settingTemp1)
- {
- tempAlert=0;
- }
- else if(temp_value<=settingTemp2)
- {
- tempAlert=1;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
3.rar
(113.75 KB, 下載次數(shù): 50)
2020-1-8 23:15 上傳
點擊文件名下載附件
含程序原理圖 下載積分: 黑幣 -5
|