欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標(biāo)題:
DTH11+單片機(jī)溫濕度源程序
[打印本頁]
作者:
諾-童
時間:
2020-1-8 23:16
標(biāo)題:
DTH11+單片機(jī)溫濕度源程序
oth11溫濕度傳感器,at89c51單片機(jī)
設(shè)計要求:
①了解DTH1I溫濕度模塊的功能;
②利用T0實現(xiàn)1秒(或自定義時間)定時,定時時間到,獲取當(dāng)前溫濕度值,在OLED
液晶上顯示溫濕度值;
③通過矩陣鍵盤和OLED液晶設(shè)計人機(jī)交互設(shè)置界面,可設(shè)置3檔溫濕度狀態(tài)(正常、
1級警報和2級警報),報警位置顯示在OLED液晶最后兩行,要求16個按鍵的功能分別為:
0~9、設(shè)置、左移、右移、上移、下移、確認(rèn);
④超限進(jìn)行報警和燈光指示,當(dāng)處于不同安全等級時,給出不同的報警提示,利用51
mini板上的蜂鳴器和LED實現(xiàn),并且將安全等級反映在OLED界面上;
⑤要求OLED液晶第一-行為溫度值,第二行為濕度值,應(yīng)有字符加以區(qū)分;
⑥按下“設(shè)置"功能按鍵,可以進(jìn)入單獨設(shè)置界面,設(shè)置溫濕度報警值;
⑦制定通訊協(xié)議,可以在PC機(jī)通過串口助手獲取溫濕度值和系統(tǒng)運(yùn)行狀態(tài)(正常、1
級警報或2級警報);
⑧制定通訊協(xié)議,可以在PC機(jī)通過串口助手設(shè)定溫濕度報警值。
單片機(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è)定定時時間為1s
unsigned int settingTime=100;//100*10ms=1000ms=1s
//默認(rèn)設(shè)定報警溫度
unsigned int settingTemp1=20;
unsigned int settingTemp2=30;
//默認(rèn)設(shè)定報警濕度
unsigned int settingHumi1=50;
unsigned int settingHumi2=60;
extern int temp_value, humi_value; //讀到的溫濕度值
//溫濕度報警標(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è)定對應(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;//舊的個位
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)?'-':' ';//當(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();//初始化定時器0,用于定時檢測溫度濕度
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è)置定時時間:"*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;
}
//判斷是否聲光報警
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
作者:
liyueyue222
時間:
2020-6-2 16:11
兄弟有仿真圖嗎
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1