标题:
DTH11+单片机温湿度源程序
[打印本页]
作者:
诺-童
时间:
2020-1-8 23:16
标题:
DTH11+单片机温湿度源程序
oth11温湿度传感器,at89c51单片机
设计要求:
①了解DTH1I温湿度模块的功能;
②利用T0实现1秒(或自定义时间)定时,定时时间到,获取当前温湿度值,在OLED
液晶上显示温湿度值;
③通过矩阵键盘和OLED液晶设计人机交互设置界面,可设置3档温湿度状态(正常、
1级警报和2级警报),报警位置显示在OLED液晶最后两行,要求16个按键的功能分别为:
0~9、设置、左移、右移、上移、下移、确认;
④超限进行报警和灯光指示,当处于不同安全等级时,给出不同的报警提示,利用51
mini板上的蜂鸣器和LED实现,并且将安全等级反映在OLED界面上;
⑤要求OLED液晶第一-行为温度值,第二行为湿度值,应有字符加以区分;
⑥按下“设置"功能按键,可以进入单独设置界面,设置温湿度报警值;
⑦制定通讯协议,可以在PC机通过串口助手获取温湿度值和系统运行状态(正常、1
级警报或2级警报);
⑧制定通讯协议,可以在PC机通过串口助手设定温湿度报警值。
单片机源程序如下:
#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;
//默认设定定时时间为1s
unsigned int settingTime=100;//100*10ms=1000ms=1s
//默认设定报警温度
unsigned int settingTemp1=20;
unsigned int settingTemp2=30;
//默认设定报警湿度
unsigned int settingHumi1=50;
unsigned int settingHumi2=60;
extern int temp_value, humi_value; //读到的温湿度值
//温湿度报警标记
unsigned char humiAlert=0,tempAlert=0;
unsigned char mode=0;//设置湿度模式:2,设置温度模式:1,正常模式:0
void timer0Init()
{
TMOD = (TMOD&0xF0)|0X01;
ET0 = 1;
EA = 1;
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
TR0 = 1;
}
////////////转换成ASII码//////////////////
void toString(unsigned char* array,unsigned char dat)
{
array[0] = dat/10+0x30;
array[1] = dat%10+0x30;
}
//温度设置界面行光标
unsigned char tLineIndex = 0;
//温度设置界面列光标
unsigned char tRowIndex = 0;
//湿度设置界面行光标
unsigned char hLineIndex = 0;
//湿度设置界面列光标
unsigned char hRowIndex = 0;
//串口接收一条指令完成
bit recvComplete=0;
//按键处理函数
void KeyFun()
{
key = Check_KeyBoard();
if(key != 20)
{
switch(key)
{
case 10://设置
//在设置温度湿度模式之间切换
if(mode==0)
{
mode=1;
}
else if(mode==1)
{
mode=2;
}
else if(mode==2)
{
mode=1;
}
break;
case 11://左移
//设置模式才可以按
if(mode!=0)
{
//温度设置
if(mode==1)
{
if(tRowIndex<2)
{
tRowIndex++;
}
}
//湿度设置
else
{
if(hRowIndex<2)
{
hRowIndex++;
}
}
}
break;
case 12://右移
//设置模式才可以按
if(mode!=0)
{
//温度设置
if(mode==1)
{
if(tRowIndex>0)
{
tRowIndex--;
}
}
//湿度设置
else
{
if(hRowIndex>0)
{
hRowIndex--;
}
}
}
break;
case 13://上移
//设置模式才可以按
if(mode!=0)
{
//温度设置
if(mode==1)
{
if(tLineIndex>0)
{
tLineIndex--;
}
}
//湿度设置
else
{
if(hLineIndex>0)
{
hLineIndex--;
}
}
}
break;
case 14://下移
//设置模式才可以按
if(mode!=0)
{
//温度设置
if(mode==1)
{
if(tLineIndex<2)
{
tLineIndex++;
}
}
//湿度设置
else
{
if(hLineIndex<2)
{
hLineIndex++;
}
}
}
break;
case 15://确认
//设置模式才可以按确认
if(mode!=0)
{
mode=0;
}
break;
default://0-9:设定对应光标上的数值
//设置模式才可以按0-9
if(mode!=0)
{
//温度设置
if(mode==1)
{
if(tLineIndex==0)//设定settingTemp1
{
if(tRowIndex==0)//设置十位
{
unsigned char ge = settingTemp1%10;//旧的个位
settingTemp1=key*10+ge;
}
else
{
unsigned char shi = settingTemp1/10;//旧的十位
settingTemp1=shi*10+key;
}
}
else if(tLineIndex==1)//设定settingTemp2
{
if(tRowIndex==0)//设置十位
{
unsigned char ge = settingTemp2%10;//旧的个位
settingTemp2=key*10+ge;
}
else
{
unsigned char shi = settingTemp2/10;//旧的十位
settingTemp2=shi*10+key;
}
}
}
//湿度设置
else
{
if(hLineIndex==0)//设定settingHumi1
{
if(hRowIndex==0)//设置十位
{
unsigned char ge = settingHumi1%10;//旧的个位
settingHumi1=key*10+ge;
}
else
{
unsigned char shi = settingHumi1/10;//旧的十位
settingHumi1=shi*10+key;
}
}
else if(hLineIndex==1)//设定settingHumi2
{
if(hRowIndex==0)//设置十位
{
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);//发送温度
UART1_SendStr(humiDisBuf);//发送湿度
UART1_SendStr(tempAlertDisBuf);//发送温度报警
UART1_SendStr(humiAlertDisBuf);//发送湿度报警
}
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)
{
//根据当前模式显示不同的界面
switch(mode)
{
case 0:
displayNormal();
break;
case 1:
displaySetTemp();
break;
case 2:
displaySetHumi();
break;
default:
break;
}
//按键函数
KeyFun();
//处理串口数据
//协议:
//设置定时时间:"*S1100#",其中1100表示1100ms,最大为9999ms(只能为4位)
//设置温度阈值:"*T1:50#",其中1表示阈值1,可为1,2;50表示设定该值为50(只能为2位)
//设置湿度阈值:"*H1:50#",其中1表示阈值1,可为1,2;50表示设定该值为50(只能为2位)
//获取运行参数:"*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黑下载附件…………
复制代码
所有资料51hei提供下载:
3.rar
(113.75 KB, 下载次数: 50)
2020-1-8 23:15 上传
点击文件名下载附件
含程序原理图
下载积分: 黑币 -5
作者:
liyueyue222
时间:
2020-6-2 16:11
兄弟有仿真图吗
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1