按键程序设计思想:系统开始运行时,扫描键盘,单片机开始查询是否有键盘按下,没有按下,则操作别的,若有再检测是否是加按键按下,若是则水温加一,如果是减键按下,则水温减去一。程序框图如图11所示。
按键处理时,必定有一定的抖动,这可能引起单片机的误判,为了解决这样的问题有两种可靠的方法可以选择:
(1)硬件去抖动,在按键处加一个电容,通过硬件设计好电容的充放电时间常数,不能太大,不然按键不能灵敏。
(2)软件延时去抖动,先判断是否有键按下,再用5ms-10ms延时函数,然后再检测该键是否被按下,如若有按下就调用相关的子程序[8,9]。这种方法简单易行,只需加入一个延时子程序即可达到要求,所以本文主要采用这种方法。
3.2 温度采集程序设计
显示程序前必须进行初始化等处理,还有几个通用的子程序,在使用之前可以直接调用。
初始化过程:初始化—ROM的操作命令—存储器的操作命令—处理数据
① DS18B20数据线上所有操作均初始化。初始化框图如图12所示。
② ROM 操作命令
总线上检测出DS18B20时,就能够发出ROM操作指令[10]。这一过程如下表1所示。
表1 ROM操作命令
指令 代码
Read ROM(读ROM) [33H]
Skip ROM(跳过ROM) [CCH]
Match ROM(匹配ROM) [55H]
Search ROM(搜索ROM) [F0H]
Alarm search(告警搜索) [ECH]
③ 存储器操作命令,如表2所示。
表2 存储器操作命令
指令 代码
Write Scratchpad(写暂存存储器) [4EH]
Read Scratchpad(读暂存存储器) [BEH]
Copy Scratchpad(复制暂存存储器) [48H]
Convert Temperature(温度变换) [44H]
Recall EPROM(重新调出) [B8H]
Read Power supply(读电源) [B4H]
图12 DS18B20初始化框图
3.3 显示模块和报警程序设计
显示器为LCD1602,能显示两行字符,显示时第一行分别为当前、报警、设定字符,第二行是当前水温。当检测的温度送入显示之前,首先也需要初始化,然后再调用显示子程序来显示要显示的数字和字母。通过按键设定的温度也能在显示器上显示,如果当前温度大于报警温度,就启动报警,会一直响,直到温度低于报警温度。若按键输入的温度大于当前检测值时,就启动加热模块,设定温度低于当前温度,则不做处理。这样水温就可以保持在设定值范围。LCD显示流程图如图13所示。
图13 LCD显示流程图
3.4 主程序设计
单片机开始运行时,首先检测水温,如果没有其他操作时,就会一直显示水温,系统默认的设置温度是45℃,水温也会保持这个温度。若水温大于上限时,蜂鸣器一直响,直到水温降低。并通过处理,把结果显示在液晶显示器上,若正常时,则检测键盘是否有按下,通过程序延时,确认是否有按键按下,如果有则判别是加键还是减键按下,并进入相应的处理程序,当水温低于设定值时,电加热丝开始加热(由于条件有限,本次使用的是LED灯,灯亮代表加热电路),使其温度达到设定温度。按键设定并显示,KEY键第一次按键是选择功能键,再次按下时是报警温度、设定温度,第三次按下时是确认。按键设置采用的是查询方式,程序编写比较容易。 AT89S52单片机智能热水器控制系统的设计+源代码+电路图(4):http://www.751com.cn/zidonghua/lunwen_1498.html