开始编写相关子函数主函数调用液晶初始化函数主函数调用温度采集函数主函数调用温度上下限函数否采集温度在设定范围是LCD显示温度LCD显示温度蜂鸣器报警
图4.1 主程序流程图
程序首先进行相关宏定义,定义变量和数组,编写所需要的子函数,然后在主函数中调用液晶初始化子函数对液晶进行初始化,并在液晶第一行显示‘温度
11
显示’四个汉字,调用温度采集函数对当前温度进行采集,调用温度上下限设定子函数设定适合现场的温度范围,然后将采集到的温度值同设定的温度上下限进行比较。若在设定范围内,则调用液晶显示函数显示当前温度并返回到温度采集子函数调用处;若不在设定范围内,则调用液晶显示函数显示当前温度,使蜂鸣器报警,程序返回温度采集子函数调用处。
4.2 键盘扫描程序设计
开始四行中只将第一行设为低电平否检测是否有键按下是延时5ms否检测是否有键按下是读IO口电平switch语句获取键值松手检测按上述方法扫描第二行按上述方法扫描第三行按上述方法扫描第四行结束
图4.2 键盘扫描程序流程图
该键盘扫描程序采用行扫描的方式,从第一行扫描到第四行,首先将第一行设为低电平,其余行为高电平,通过读取P1口高四位电平情况判断是否有键按下,若无键按下则扫描下一行,若有键按下,延时5ms消抖,再次判断是否有
12
键按下,若无键按下则扫描下一行,若有键按下则通过switch语句获取相应键值,松手检测后扫描下一行。
4.3 温度上下限设定子程序设计
开始调用键盘扫描函数否键值是否为10是for循环执行三次获得三个键值计算温度下限调用键盘扫描函数是 键值是否为11否for循环执行三次获得三个键值计算温度上限结束
图4.3 温度上下限设定子程序流程图
该程序功能是设定温度上下限,程序开始,调用键盘扫描函数获取一个键值,通过第一个if语句判断该键值是否为10,若是则通过for循环执行三次依次获取三个键值并赋给数组b[ ],从而计算出温度下限l,然后再次调用键盘扫描函数通
13
过第二个if语句进行所得键值是否为11的判断;在第一个if语句判断中若键值不为10,则通过第二个if语句进行所得键值是否为11的判断。在第二个if语句进行所得键值是否为11的判断中,若键值为11,则通过for循环执行三次依次获取三个键值并赋给数组c[ ],从而计算出温度上限h,然后程序结束;若不为11,则程序结束。
4.4 延时子程序设计
开始i=0是i 图4.4 延时子程序流程图 由于单片机采用的是12MHZ晶振,则执行一条空指令所用时间恰为1us,子函数中设定的参数x是空指令执行次数,所以这是一个us级的软件延时函数。 5 系统调试 由于实验室的仪器较老,有些损坏,为了更好地调试,最终采用了自己买的51开发板。首先利用Keil软件进行编程,反复调试无错后生成了一个Hex文件,然后将程序烧录进单片机里面,进行运行。单片机运行后采集到当时室内温度为11.6℃,如图5.1,用矩阵键盘将温度上下限设为10℃~15℃,用手捏住温度传感器DS18B20一段时间,当传感器采集到的温度大于15℃时,如图5.2,蜂鸣器成功报警,说明该单片机系统能够很好地完成预期的功能。 14 图5.1 采集室内温度显示 图5.2 加热后温度显示 15