硬件平台及其选择
DS18B20芯片封装结构: DS18B20引脚功能:
GND 电压地 ·DQ 单数据总线 ·VDD 电源电压·NC 空引脚DS18B20的温度测与数字数据输出全集成于一个芯片之上,从而抗干扰力更强。其一个工作周期可分为两个部分,即温度检测和数据处理。
图5 DS18B20温度储存位
RAM 数据暂存器,用于内部计算和数据存取,数据在掉电后丢失,DS18B20共9个字节RAM,每个字节为8位。第1、2个字节是温度转换后的数据值信息,第3、4个字节是用户EEPROM(常用于温度报警值储存)的镜像。在上电复位时其值将被刷新。第5个字节则是用户第3个EEPROM的镜像。第6、7、8个字节为计数寄存器,是为了让用户得到更高的温度分辨率而设计的,同样也是内部温度转换、计算的暂存单元。EEPROM 非易失性记忆体,用于存放长期需要保存的数据,上下限温度报警值和校验数据,DS18B20共3位EEPROM,并在RAM都存在镜像,以方便用户操作【1】。
我们在每一次读温度之前都必须进行复杂的且精准时序的处理,因为DS18B20的硬件简单结果就会导致软件的巨大开消,也是尽力减少有形资产转化为无形资产的投入,是一种较好的节约之道。
3.4 电路设计方案
综上各方案所述,对此次作品的方案选定: 采用AT89C51作为主控制系统; 数字式温度DS18B20传感器; LCD1602作为显示,键盘采用4x4用P3口(系统共设定有15个按钮,确定键占2个)。晶振12MHZ,选定用中断来控制报警声音。利用红色发光二极管作为错误、报警温度过高报警指示灯,用绿色发光二极管作为进入系统指示灯。
第 11 页 (共 77 页)
智能防火防盗系统
4 系统软件的设计与实现
4.1 软件设计思想
由于采用12M,处理速度本来不够快,在一个while里面尽量减少调用实现的次数,如果调用过多,就会倒是系统资源占用严重,系统运行反应慢,比如在温度有所改变的时候,我们可以不必这么准确地更新到十分位,本系统采用当温度改变1°C的时候,才去更新数据(当然也可以精确到0.5°C)。
添加按键声音,虽然对整个系统没多少影响,但是对用户这是一个很好提示效果。在温度或密码报警的时候,将不会”normal”,而会显示”waring”的警号词语,在进入系统后,管理员修改密码作2个输入密码,前后比较2次输入的密码,正确后提示“success”, 错误提示“error”,用户看以此来判断修改密码错误的原因。
还有在输入密码那块,在输入密码那段将LCD1602重新设置一下,使其出现光标闪烁效果,这让人第一眼就知道输入的密码将在哪一块出现。这对程序检错也是很大的帮助。
最后就是如果对返回键的实现,这应该是本系统一处亮点,因为本系统只提供用3次输入机会(当然进入了系统后,错误次数将重新计数),所以返回键尤为重要,对返回键的设置思想,就是重复调用字符串并显示,这无疑对12MHZ的CPU一个打击,但是这是必须要的。在本章的一些函数将配合实现返回键的用法,这里只说总体思想,代码下面有介绍。
4.2 系统软件原理流程图
第 12 页 (共 77 页)
系统软件的设计与实现
DS18B20得到温度ReadFrmDS18B20(),
其中此函数里面包含初始化器件,并得到温度
数据,同时在此第一次检测温度是否达标。 P3端口初始化(用于键盘扫描)
进入while无限循环中
调用报警 错误次数和温度标志 是 声音函数 是否达标
否
扫描键盘和温度
是 显示新的 温度是否改变1℃ 否 字符串
否 错误次数加1
显示新的 是 否 删除标识 字符串
判断密码 否 是 是 键盘上启用可以 确定键是否 修改密码功能 否 ?
第 13 页 (共 77 页)
main开始 中断初始化(用于报警声音) LCD1602初始化程序Inital_LCD1602() 智能防火防盗系统
4.3 必要的参数说明
sbit DQ=P1^0; //温度使能 sbit SPK=P1^1; sbit RL=P1^2;
//喇叭 //红灯
sbit GL=P1^3; //绿灯
uchar code TempText[2][8]={\
此字符串于WarnSign有关,当WarnSign =1 即在屏幕上提示Warning标志温度过高可能着火了,同时报警声。 uchar ClientCode[7]={%uchar CodeStr[7];
//初始密码
//登陆状态下临时密码
uchar NewCode1[7]; uchar NewCode2[7]; uchar FloatTempt[8];
//新的密码1
//新的密码2 2次新的密码将会对比。
//存放温度的数组;
uchar Int_Tempt,Flot_Tempt; //温度高位,和小数位 uchar ERTimes[3]={'2','1','0'}; //密码错误的次数;
uchar code Message[2][12]={\提示密码修改成功错误提示语 //登陆状态下管理员身份验证提示。
uchar code ASucess[2][16]={\……
uchar EroTimes=0; uchar frq;
//错误的次数 对应着ERTimes[3]; //声音的频率
//声音Stop/Start的标志
//管理员进去之后,管理员标志 //温度太高标志
//修改密码标志,2次修改密码
uchar Voice=1;
uchar AmditKey=0; uchar WarnSign=0; uchar NCSign=0; uchar Size=0;
//CodeStr的大小,有此标志可以使用Back按键功能
uchar NCSize=0,ACSize=0; //NewCode2[7],NewCode2[7]的大小, uchar BackFlag=0; uchar Ensure=0;
//Back按键可以使用标志 //确定键按下的标志
第 14 页 (共 77 页)
系统软件的设计与实现
uchar OverFull=0;
//Back键 此标志来确定是那一种back 6个的情况和未满6的情况; 此段为按下键盘发声数据。 uchar code SONG_TONE[]={255,0}; uchar code SONG_LONG[]={1,0}; uchar EvetInf; ??
键盘扫描变量
4.4 主函数模块
学过C语言的都知道主函数是干什么的,是运行整个系统的入口,在主函数首先初始化各模块,(温度模块、中断初始化、显示模块初始化),然后程序进入while不停调用各种功能模块。
??
uchar flag=0; TMOD = 0x01;
frq = 0x00; TH0 = 0xfe; TL0 = 0xff; TR0 = 1; IE = 0x82;
P1=0xff;
//初始化p1口,全设为1,设为输入
以上关于定时中断,后节将会介绍。
Inital_LCD1602(); ReadFrmDS18B20(); if(Int_Tempt>60)
WarnSign=1;
//初始化LCD1602
//先给初始化掉 得出正确的时间
//当温度达到大于50的时候,WarnSign就会置1启动
//当WarnSign = 1,报警就会随之响起。
//这里面的时候程序执行的时候,只会运行一次,
ScreenMyInfo();
开机显示任意字符串 ,这里为读取时间起到缓冲作用。 SetComLCD1602(0xca); while(1)
第 15 页 (共 77 页)