到地线上。当无键按下时P1.0-P1.3口输入为高电平,有键按下时P2口所对应I/O口会被拉低,P1.0-P1.3中有低电平输入。报警模块由2个发光二极管组成,当前温度超过设定温度上限时红灯亮,低于设定温度下限时黄灯亮,两灯分别接在单片机的P2.4和P2.2口上。键盘模块和报警模块分别如图2-8和2-9所示。
图2-8 按键电路
图2-9 报警电路
13
第三章 软件设计
软件设计是单片机系统设计的核心部分,也是能否实现预定功能的关键。单片机编程常用的语言是C语言和汇编语言,最终都要转为Intel HEX格式或二进制格式(Binary)文件拷入单片机芯片内。这里我们使用的是C语言进行编程设计[3],[4],[10]。
3.1应用软件设计原则
应用系统中的应用软件是根据系统功能要求设计的,应可靠实现系统的各种功能。在本设计中,软件设计要力求做到以下几点:
1.软件结构清晰,简捷,流程合理。
2.各功能程序实现模块化,子程序化。这样,即便于调试、链接,又便于移植、修改。 3.程序存储区,数据存储区要合理规划,既能节约内存容量,又使操作方便。
4.运行状态实现标志化管理。各个功能程序运行状态,运行结果以及运行要求都要设置状态标志以便查询,程序的转移、运行、控制都可通过状态标志条件来控制。
5.经过调试修改后的程序应进行规范化,除去修改的痕迹,以便于交流和借鉴,也为以后的软件模块化、标准化打下基础。
6.实现全面软件抗干扰设计。软件抗干扰是单片机应用系统提高可靠性的有利措施。
3.2软件的总体设计
系统整机工作是由STC89C51单片机控制,所以系统软件应该完成的工作应该分为系统初始化部分和主体循环部分2个部分。
系统初始化部分主要是对系统的按键值、时钟芯片、液晶显示器进行设置,本系统的时间是通过时钟芯片DS1302来取得,并将值送入主控芯,通过液晶显示器来显示,时间、日期的修改通过按键来控制。所以要对按键、时钟芯片、液晶显示器进行初始化。而其他模块的初始化在各模块函数中初始化。系统初始化还对一些变量进行定义、赋初值。
3.3系统程序流程总框图
主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次,这样可以在一秒之内测量一次被测温度[5],[6]。其程序流程见图3-1所示。
14
初始化
调用显示子程序 1S到? N Y Y 初次上电 N 读出温度值、 时间数据,显 示数据刷新 发温度转换开始命令 图3-1 主程序流程图
3.3.1温度读取函数
温度检测相关函数包括:DS18B20的初始化函数,DS18B20的温度读取函数,DS18B20的温度转换函数等,通过在函数中调用温度读取函数将一次循环内的温度值存入全局变量tvalue中。
1 .DS18B20的初始化函数
由于DS18B20是单总线的时序工作方式,所以每次工作前都需要初始化。首先由总线拉低480-960us,而后释放总线60-120us,此后会有DS18B20自己拉地60-240us,然后释放总线。这样就完成了DS18B20的初始化过程。
2.DS18B20的温度读取函数
读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。其程序流程图如图3-2所示。
15
发DS18B20复位命令 发跳过ROM命令 发读取温度命令 读取操作,CRC校验 Y N 9字节完? Y CRC校验正?N 移入温度暂存器 结束 图3-2 读出温度子程序流程图
3.DS18B20的温度转换函数
通过写字节函数向DS18B20写命令字采集并转换温度值,然后通过读字节函数从DS18B20读取转换后的数字两温度值并保存于全局变量tvalue中。当DS18B20接收到温度转换命令后,开始启动转换。转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的第1、2字节。单片机可以通过单线接口读出该数据,读数据时低位在先,高位在后,数据格式以0.0625℃/LSB形式表示。
3.3.2显示程序
1602字符型LCD流程设计如下:
16
1602初始化 延时15ms 显示模式设置 延时5ms 显示关闭 延时5ms 显示清屏 延时5ms 显示光标移动设置 延时5ms 显示开及光标设置 显示位置设置 延时 显示温度各位数值
图4-3 1602液晶驱动程序流程图
显示器1602初始化后延时15ms,显示模式设置,再延时5ms,显示关闭,延时5ms显示清屏,再延时5ms显示光标移动设置延时5ms显示开及光标设置,然后显示位置设置,延时,显示温度各位数值。此部分主要程序过长,参见附录二。
17