3 软件设计
3.1 软件设计的总体思路
本课题采用的设计思路是:由DS18B20采集温度信号,直接输出数字信号;HS1101采集湿度信号并将湿度信号(模拟信号)送入NE555中,NE555将湿度信号转换为电压频率信号。然后将采集的温湿度信号送入单片机。设计中单片机将完成三项任务:将采集到的温湿度显示在液晶屏上;对采集的温湿度与预设值进行比较来判断是否启动报警电路;对引起的报警进行分析,并选择不同的处理方式。本设计包括:主程序、温度检测程序、湿度检测程序、报警程序、显示程序、温湿度控制程序。主流程图如3-1所示。
|
是 |
图3-1 主流程图
3.2 温度采集模块
在用程序编写温度采集模块时,DS18B20一般都是担当从机的角色,而单片机是主机,单片机通过单总线访问DS18B20需要经过以下几个步骤:
(1)DS18B20复位(初始化)信号,也就是一次访问DS18B20的开始信号。
(2)执行ROM指令,ROM指令也就是访问、搜索和匹配DS18B20的64位序列号的动作信号。在单点情况下,可以直接跳转到ROM指令,而跳转ROM指令的字节是0xCC。
(3)执行ROM功能指令,功能指令后跟随着需要交换的数据。
温度采集程序过程的流程图如图3-2所示,温度信息采集之前,先将DS18B20初始化,为温度采集做好准备。在跳过其地址序列码后,DS18B20采集温度信息。单片机读取数据,然后校验读取的温度数据是否正确,如果正确,则将温度显示出来,反之则重新对湿度进行采集。最后对温度进行显示,数据若超过或低于预设温度值,则会引起报警并产生相应引脚的高电平。
DS18B20与单片机之间的交流通过时序读写完成。DS18B20向单片机发送一个8bit的数据来告诉单片机温度的值。读时序的程序如下所示。
unsigned char read(void)
{
unsigned char i,dat=0;
for(i=8;i>0;i--)
{
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
yanshi(7) ;
}
return (dat);}
写时序的程序如下所示,单片机向DS18B20发出一条读时序的指令来完成对温度的采集过程。
void write(unsigned char dat)
{
unsigned char i;
for(i=8;i>0;i--)
{DQ=0;
DQ=dat&0x01;
yanshi(16);
DQ=1;
dat>>=1;
}}
图3-2 温度检测子程序流程图
3.3 湿度采集模块
湿度采集模块的程序流程图如图3-3所示。首先是HS1101对湿度进行采集,随后将采集到的湿度信号(模拟信号)送入NE555中进行数模转换,将其信号转换为电压频率信号,最后送入单片机中与预设的湿度上下阈值进行比较。如果超出或低于预设值则会引起报警,并触发相应引脚的高电平。
在程序设计中,一定要对NE555所产生的频率进行分类,不同段的频率代表着不同的湿度。还要注意在本次设计中采用的HS1101的测湿范围,据此去进行对程序的编写。根据湿度测量的公式计算频率湿度的程序如下所示。
频率计算出相应湿度程序:
if(ftequency<6033)
maxrange=1;
if(ftequency>7351)
minrange=1;
if(6330
RH=5880-0.8*ftequency;
if(6033<=ftequency<=6330)
RH=5860-0.8*ftequency;
|
图3-3 湿度检测子程序流程图
3.4 显示模块
本设计中的显示模块为液晶显示。开始时先对液晶显示器进行初始化,单片机对液晶显示器写数据,然后液晶显示器按照程序编写的格式显示出温湿度。这些都是在RS、RW、EN端控制下完成的。
显示模块写程序为:
void write_com(uchar com)
{
rs=0;
rw=0;
P1=com;
delay(5);
en=1;
en=0;
}
void write_shuju(uchar shuju)
{
rs=1;
rw=0;
P1=shuju;
delay(5);
en=1;
en=0;
}
这是模块的写指令和写数据程序。其中定义了引脚的高低电平并显示了延时的过程。
3.5 报警和控制模块
在设计中根据其温湿度所要求的阈值编写程序。当温湿度信号超过或者低于设定值时就会引起蜂鸣器所连的引脚低电平,并通过DS18B20电路中的电压使其导通。从而达到报警的效果。在警报响起的同时,单片机内部芯片根据不同的原因(如温度过高或过低、湿度过高或过低),在单片机4个不同高电平输出引脚出的对应的高电平,从而控制温湿度回复正常值。
4 调试
4.1 程序调试
本设计使用c语言进行编写,首先要设计大致的程序流程,然后对主程序进行编写。在编写温度传感器对应的读写程序时,多次将读写程序的延时弄错,后来通过对DS18B20时序图分析,发现把复位的时序延时和读的时序延时弄反了。还有编写显示模块程序时,没有将液晶显示初始化编写进去,导致显示屏幕的数据不发生变化。
在编写程序的时候出现的大量半全角的错误,程序完成后,放入keil软件后出现了大量的全角空格,最后仔细检查将这些空格删除。程序运行成功,并得到可以在protel中仿真的.hex文件。
4.2 仿真调试
在第一次仿真中,将程序送入单片机后,液晶显示屏幕中显示乱码,经检查发现是液晶显示器的引脚连接出现了错误,经过改正电路引脚后只能正常显示湿度,不能显示温度,经过电压表对温度传感器的电路进行检查,发现DS18B20的电压偏小,在加上一个上拉电阻拉高了电平后,屏幕上显示出DS18B20所对应的温度,仿真正常显示温湿度。然后检查控制电路,调节温度看是否达到预设值后会出现对应引脚的高电平,检查后并没有错误。
最后对温湿度检测程序做相应的调整,使单片机达到可以在不同的环境温湿度要求下合理调节监测值的目的。正常工作下的仿真电路图如图4-1所示。
在电容为175Pf时,液晶显示屏上分别显示温度4℃,湿度32.4%RH,此处显示的温度是DS18B20的温度,可以调节模拟温度来改变液晶显示屏的温度,其中DS18B20代表其外界的温度。
图4-1 仿真图
在电容为185时,温度传感器DS18B20为11℃,则在液晶显示屏上为相应的温湿度。通过公式计算湿度为正确值,同时也验证可电路的正确性。仿真图如4-2所示。
图4-2 仿真图
5 结论
随着农业的发展,蔬菜大棚越来越普遍,因此对温湿度的检测越来越受到重视。本文设计的是蔬菜大棚的温湿度检测、报警和控制系统,其温湿度测试范围分别为:测温范围-10℃~50℃,测湿范围0%~100%RH。通过温、湿度传感器实现对温湿度数据的采集,并使用单片机对数据进行处理,然后用液晶显示器显示即时温湿度值。当温湿度数据超出设定的温湿度值时,由单片机驱动报警装置,实现现场报警功能,并对温湿度进行控制,使不在设定范围内的温湿度恢复正常值。
本次设计采用HS1101与NE555的组合来进行湿度采集,同时使用温度传感器DS18B20对温度进行采集,由液晶显示屏LCDLM016L对温湿度的数值进行显示。分别设置P0-P3端口对温湿度控制,当超出预设温湿度时,对应的端口则输出高电平,并启动外部设备来进行控制温湿度,同时引起警报,此外还可以改变程序中的报警预设数值来适应外界不同的环境温湿度。这种设计使得本控制器更加多功能化。本次设计的遗憾是没有测量出湿度的误差范围。因为没有标准的湿度环境来提供湿度和没有标准的湿度计来进行湿度比较。