图14 写操作时序
3.4 光声报警系统与温湿度控制系统设计
3.4.1光声报警系统
本系统采用红绿LED灯作为光报警提示,当系统检测到的数据符合给定的要求时,现场始终绿灯显示;当系统检测到的数据不符合给定的要求时,现场转化为红灯报警提示;本系统采用蜂鸣器作为声报警提示,当系统检测到的数据符合给定的要求时,现场没有蜂鸣器报警提示;当系统检测到的数据不符合给定的要求时,现场蜂鸣器报警提示[9]。如图 15
图15 光声报警系统电路图
4 软件系统设计
本系统软件系统设计包过:系统初始化模块,温湿度检测模块,1602LCD显示模块,报警模块,温湿度判断控制模块。系统软件总体流程图如图17 开始初始化温湿度检测单片机处理LCD显示范围判断YESNO光声报警温湿度控制终止 图17 系统流程图
4.1初始化模块
系统初始化模块的主要功能是完成系统的初始化以及设定系统的工作状态,初始化部分包括以下方面的内容:
4.1.1 单片机初始化以及各种引脚定义。 4.1.2 1602液晶初始化及工作方式。 4.1.3 系统进入正常工作状态。
4.2温湿度检测模块
温湿度检测模块是本系统中的核心模块之一,它负责完成温度和湿度的测量及模拟量转换为数字量的全过程,这也是它为什么重要的原因。数字式温湿度传感器AM2301直接把检测到的模拟量转化为数字量送给单片机,在经过单片机的处理,把温湿度值显示在1602液晶上。温湿度传感器的精确度值直接影响到整个系统的检测与控制,所以本系统采用数字式温湿度传感器AM2301采集温室内的温湿度[10]。
4.3 温湿度判断控制模块
温湿度判断控制模块也是系统的核心模块之一,所谓判断控制模块,就是对当前温室内的实际温湿度与给定的温湿度范围进行比较,先进行判断,然后再进行控制,控制模块是决
定系统将要进行什么工作的。如温度高于上限时需要降温,低于下限时需要升温,如湿度高于上限时需要降湿,低于下限时需要増湿,同时还要启动警报等等。
温湿度判断控制部分的程序整体思路如图18
实际值与给定值比较调用控制声光报警是否在给定范围内返回
图18 温湿度判断控制程序整体思路
4.4 1602液晶显示模块
本系统采用1602液晶显示温湿度值,当系统刚开始上电时1602液晶不显示任何数据,等待AM2301的监测数据,双行显示在1602液晶上。第一行显示:Temperature:--。C,第二行显示:Humidity: --%
4.5报警模块
报警模块具备两项功能,即为报警灯和声音报警。报警灯模块是完成LED有规律的转换,以便从视觉上提醒用户。LED是由单片机控制2个双色LED灯组成的,其转换规律为:
1 系统温湿度值在给定的范围时,绿色LED亮。 2 系统温湿度值超出给定的范围时,红色LED亮。
在LED灯转换的同时,声音报警也会同时启动,可采用延时的方式来延长声音报警的声音。
警报灯由2个双色的LED灯组成,一共需要2根数据线,使用单片机控制。要实现的功能是使2个双色LED灯有规律的转换,当系统上电后,系统进行实时的采样,并判断出当前温湿度与给定温湿度之间的差异,如果当前温湿度低于用户给定的下限温湿度值,则说明当前温湿度过低,系统自动启动红色警报灯,通知加温増湿,直至加到所需温湿度值时警报灯
熄灭。反之,如果当前温湿度高于用户设定的上限温湿度值,则说明当前温湿度过高,系统也会自动启动警报灯,通知降温减湿,直至降到所需温湿度值时警报灯熄灭。
4.6 系统整体软件程序
本系统采用C语言编程,使用单片机编程软件:Keil软件[11]。
#include
typedef unsigned char uint8; #define uchar unsigned char #define uint unsigned int
sbit RS = P1^0 ; sbit RW = P1^1 ; sbit EN = P1^5 ; sbit BUSY = P0^7;
sbit dht=P2^0;
sbit fine=P2^1; sbit hot=P1^2; sbit pwq=P1^3; sbit ccq=P1^4; sbit beef=P1^6; sbit redled=P2^6; sbit greedled=P2^4;
uint hum,temp; //定义湿度、温度(全局)
uchar hum_h,hum_l,temp_h,temp_l,check; //湿度高、低8位,温度高、低8位,校验位 uchar num,num1, bai,shi,ge,bai1,shi1,ge1,cnt=0; //
uchar code table[]= %uchar code table1[]=\//unsigned char code word1[]={\//unsigned char code word2[]={\
void delay_us(uint i);
/********************************************** * 等待繁忙标志
*********************************************/ void wait(void) { } /** * 写数据 */
void write_data(uint8 dat) { } /** * 写命令
wait(); EN = 0; P0 = dat; RS = 1; RW = 0; EN = 1; delay_us(1); EN = 0; P0 = 0xFF; do {
RS = 0; RW = 1; EN = 0; delay_us(1); EN = 1;
}while (BUSY == 1); EN = 0;