|
本次设计采用的单片机AT89C52和DHT11的温度湿度的检测系统。分为硬件电路设计和单片机程序设计。硬件电路包括单片机、温湿度传感器、显示模块、报警模块以及按键。之所以采用AT89C52和DHT11温湿度传感器及OLED显示模块,是要保证工作稳定、集成度高、测量精度高、成本低,其中测温湿度控制电路由温湿度传感器和预设温度限制以及报警电路组成,根据需要通过按键预先输入温湿度的上下限,当实际测量的温湿度大于或小于预设的限制时,蜂鸣器发出报警信号并报警灯亮红。单片机程序主要包括主程序、显示子程序、测量温湿度和设置温湿度上下限子程序。 原理图:
protues仿真图:
proteus仿真结果
- #include<reg52.h> //头文件
- #include<LCD1602.h>
- #include<AT24C02.h>
- #include<DHT11.h>
- #include<oled.h>
- /*****************灯、蜂鸣器、按键引脚定义*******************/
- sbit led = P3^7; //超限指示灯
- sbit led1 = P3^2; //正常指示灯
- sbit buzz = P2^3; //蜂鸣器
- sbit key_set = P1^5; //设置键
- sbit key_jia = P1^6; //加键
- sbit key_jian= P1^7; //减键
- /************************变量定义***********************/
- uchar temp_old,humi_old;//存储上一次的温度、湿度
- uchar temp_up,temp_down;//存储温度上、下限值
- uchar humi_up,humi_down;//存储湿度上、下限值
- uchar set_f; //设置选择标记,=0非设置,=1设置湿度上限,=2设置湿度下限
- // =3设置温度上限,=4设置温度下限。
- void jiexianw();
- void Delay_1ms(uint i);
- /********************************************************
- 函数名称:void display(void)
- 函数作用:oled显示固定作用
- 参数说明:
- ********************************************************/
- void fixed_display(void)
- {
- OLED_ShowString(0,0,"Temp:"); //固定位置显示“Temp:”
- OLED_ShowString(56,0,"."); //固定位置显示“.”
- OLED_ShowString(80,0,"C"); //固定位置显示“C”
- OLED_ShowString(0,1,"Humi:"); //固定位置显示“Humi:”
- OLED_ShowString(56,1,"."); //固定位置显示“.”
- OLED_ShowString(80,1,"%"); //固定位置显示“%”
- if(set_f==0) //设置键没按下,非设置模式
- {
- OLED_ShowString(80,4," "); //不显示
- }
- if(set_f==1) //设置键按了1次
- {
- OLED_ShowString(80,4," HU"); //显示“HU”
- }
- if(set_f==2) //设置键按了2次
- {
- OLED_ShowString(80,4," HD"); //显示“HD”
- }
- if(set_f==3) //设置键按了3次
- {
- OLED_ShowString(80,4," TU"); //显示“TU”
- }
- if(set_f==4) //设置键按了4次
- {
- OLED_ShowString(80,4," TD"); //显示“TD”
- }
- }
- /********************************************************
- 函数名称:void display1(void)
- 函数作用:显示当前实际温湿度
- 参数说明:
- /********************************************************/
- void display1(void)
- {
-
- if(DHT11_Check()==1) //判断校验和是否正确
- {
- if(humi_old<Humi_H) //判断湿度是否上升
- {
-
- OLED_ShowString(88,1,"up"); //上升则显示‘up’
-
- Delay_ms(50); //延时
- humi_old=Humi_H; //记录当前湿度
- }
- else
- if(humi_old>Humi_H) //判断湿度是否下降
- {
- OLED_ShowString(88,1,"down"); //下降则显示‘down’
- Delay_ms(50); //延时
- humi_old=Humi_H; //记录当前湿度
- }
- if(temp_old<Temp_H) //判断温度是否上升
- {
- OLED_ShowString(88,0,"up"); //上升则显示‘up’
- Delay_ms(50); //延时
- temp_old=Temp_H; //记录当前温度
- }
- else
- if(temp_old>Temp_H) //判断温度是否下降
- {
- OLED_ShowString(88,0,"down"); //下降显示‘down’
- Delay_ms(50); //延时
- temp_old=Temp_H; //记录当前温度
- }
- //显示实测湿度值
- OLED_ShowChar(40,1,ASCII[Humi_H/10]);//显示湿度十位的数值
- OLED_ShowChar(48,1,ASCII[Humi_H%10]);//显示湿度个位的数值
- OLED_ShowChar(64,1,ASCII[Humi_L/10]);//显示湿度十分位的数值
- OLED_ShowChar(70,1,ASCII[Humi_L%10]);//显示湿度百分位的数值
-
-
- OLED_ShowChar(40,0,ASCII[Temp_H/10]);//显示温度十位的数值
- OLED_ShowChar(48,0,ASCII[Temp_H%10]);//显示温度个位的数值
- OLED_ShowChar(64,0,ASCII[Temp_L/10]);//显示温度十分位的数值
- OLED_ShowChar(70,0,ASCII[Temp_L%10]);//显示温度百分位的数值
-
- if(temp_up<=Temp_H||temp_down>Temp_H||humi_up<=Humi_H||humi_down>Humi_H) //判断是否超出设置的温湿度上下限
- {
- buzz=0; //超出的话蜂鸣器响起
- led=0; //点亮报警灯
- led1=1;
- }
- else //否者温湿度都处于限值范围内
- {
- buzz=1; //关闭蜂鸣器
- led=1;
- led1=0; //点亮正常灯
- }
- jiexianw();
- }
- }
- /***************温度上下限限制*******************/
- void jiexianw()
- {
- fixed_display(); //显示固定内容
- OLED_ShowString(0,4,"T&H limit"); //设置区域显示"T&H limit"
- OLED_ShowString(0,5,"T:UP"); //设置区域显示"T:UP"
- OLED_ShowChar(32,5,ASCII[temp_up/10]); //设置区域显示温度上限十位的数值
- OLED_ShowChar(40,5,ASCII[temp_up%10]); //设置区域显示温度上限个位的数值
- OLED_ShowString(56,5,"DOWN"); //设置区域显示"DOWN"
- OLED_ShowChar(88,5,ASCII[temp_down/10]);//设置区域显示温度下限十位的数值
- OLED_ShowChar(94,5,ASCII[temp_down%10]);//设置区域显示温度下限个位的数值
-
- OLED_ShowString(0,6,"H:UP"); //设置区域显示"H:UP"
- OLED_ShowChar(32,6,ASCII[humi_up/10]); //设置区域显示湿度上限十位的数值
- OLED_ShowChar(40,6,ASCII[humi_up%10]); //设置区域显示湿度上限十位的数值
- OLED_ShowString(56,6,"DOWN"); //设置区域显示"DOWN"
- OLED_ShowChar(88,6,ASCII[humi_down/10]);//设置区域显示湿度下限十位的数值
- OLED_ShowChar(94,6,ASCII[humi_down%10]);//设置区域显示湿度下限个位的数值
-
- }
- /********************************************************
- 函数名称:void delayms(uint ms)
- 函数作用:毫秒延时函数
- 参数说明:
- ********************************************************/
- void delayms(uint ms)
- {
- unsigned char i=100,j;
- for(;ms;ms--)
- {
- while(--i)
- {
- j=10;
- while(--j);
- }
- }
- }
- /********************************************************
- 函数名称:void scan(void)
- 函数作用:按键检测函数
- 参数说明:
- ********************************************************/
- void scan(void)
- {
- //设置键,不支持连按
- if(key_set==0) //按键按下
- {
- delayms(7); //延时消抖
- if(key_set==0) //再次确认按键按下
- {
- led=1; //关闭报警灯
- led1=1; //关闭正常灯
- buzz=1; //关闭蜂鸣器
- if(set_f==0) //进入设置先清除屏幕,显示设置部分
- {
- OLED_Clear(); //清除屏幕显示
- delay_n40us(100); //延时等待全部清除完毕
- }
- set_f++; //设置变量+1
- if(set_f==5) //全部设置完成,退出设置
- {
- set_f=0; //重置设置变量
- AT24C02_write_date(0,humi_up); //写入【湿度上限】数据保存
- AT24C02_write_date(1,humi_down);//写入【湿度下限】数据保存
- AT24C02_write_date(2,temp_up); //写入【温度上限】数据保存
- AT24C02_write_date(3,temp_down);//写入【温度下限】数据保存
-
- OLED_Clear(); //清除屏幕显示
- delay_n40us(100); //延时等待全部清除完毕
- fixed_display(); //清除显示后显示固定部分
- }
- }
- while(!key_set); //检测按键松开
- }
- //加值键,支持连按
- if(key_jia==0&&set_f!=0||key_jian==0&&set_f!=0)//进入设置模式,按下加键或减键
- {
- delayms(7); //延时消抖
- if(set_f==1) //设置湿度上限
- {
- if(key_jia==0)
- {
- if(humi_up<99) //湿度最大值不可大于99%RH
- humi_up++; //湿度上限+1%RH
- }
- if(key_jian==0)
- {
- if(humi_up!=0&&humi_up>humi_down+1)//湿度上限最小不可为0%RH,并且上限得比下限大
- humi_up--; //湿度上限值-1%RH
-
- }
- }
- if(set_f==2) //设置湿度下限
- {
- if(key_jia==0)
- {
- if(humi_down<99&&humi_down+1<humi_up)//湿度下限最大值小于99%RH,并且下限不可超过上限
- humi_down++; //湿度下限+1%RH
- }
- if(key_jian==0)
- {
- if(humi_down!=0) //湿度下限最小值不可为0%RH
- humi_down--; //湿度下限值-1%RH
- }
- }
- if(set_f==3) //设置温度上限
- {
- if(key_jia==0)
- {
- if(temp_up<99) //温度上限最大值不可大于99℃
- temp_up++; //湿度上限+1℃
- }
- if(key_jian==0)
- {
- if(temp_up!=0&&temp_up>temp_down+1)//温度上限最小值不可为0℃,并且上限得比下限大
- temp_up--; //温度上限值-1℃
-
- }
- }
- if(set_f==4) //设置温度下限
- {
- if(key_jia==0)
- {
- if(temp_down<99&&temp_down+1<temp_up)//温度下限最大值不可大于99℃,并且下限不可超过上限
- temp_down++; //温度下限+1℃
- }
- if(key_jian==0)
- {
- if(temp_down!=0) //温度下限最小值不可为0℃
- temp_down--; //温度下限值-1℃
-
- }
- }
- }
- }
- /********************************************************
- 函数名称:void main()
- 函数作用:主函数
- 参数说明:
- ********************************************************/
- void main()
- {
- if(key_jian==0) //按键按下
- {
- delayms(100); //延时消抖
- if(key_jian==0) //按键按下
- {
- AT24C02_write_date(0,75);//写入【湿度上限值】数据保存
- AT24C02_write_date(1,45);//写入【湿度下限值】数据保存
- AT24C02_write_date(2,30);//写入【温度上限值】数据保存
- AT24C02_write_date(3,16);//写入【温度下限值】数据保存
- }
- }
- humi_up=AT24C02_read_date(0); //读取存储的【湿度上限值】数据
- humi_down=AT24C02_read_date(1);//读取存储的【湿度下限值】数据
- temp_up=AT24C02_read_date(2); //读取存储的【温度上限值】数据
- temp_down=AT24C02_read_date(3);//读取存储的【温度下限值】数据
- OLED_Init(); //显示屏初始化
- fixed_display(); //显示固定内容
- while(1)
- {
- scan(); //按键检测处理
- DHT11_read(); //读取DHT11温湿度
- display1(); //显示当前温、湿度
- }
- }
复制代码
|
评分
-
查看全部评分
|