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)
|