太阳能热水器控制器的设计 27
void main() { }
if(up_key==0) //有按键按下吗 {
delay(10); //延时10ms temp=temp+10; //执行操作
while(!up_key); //按键放开了吗 delay(10); //延时10ms
if(up_key==0) //确认有按键按下吗
while(!up_key); //确认按键放开
}
else if(down_key==0)
delay(10); if(down_key==0)
{
temp--;
delay(10);
while(!down_key);
while(!down_key);
4.4 LED数码管显示程序设计
将所得到的结果用LED数码管显示出来,给人直观的了解当前系统的状态,数码管要显示当前系统的值,就要有一定的端口往数码管送入数据,还要有点亮数码管的信号为,我们要将0~9这十个数字的码字定义成一个数组[14],通过检验输出的数据查断码表,就能显示相应的数字。
表4-4 7段LED的字型码
显示字符 0 1 2 3 4 共阳极字型码 3FH 06H 5BH 4FH 66H 共阴极字型码 C0H F9H A4H B0H 99H 5 6 7 8 9 显示字符 共阳极字型码 6DH 7DH 07H 7FH 6FH 共阴极字型码 92H 82H F8H 80H 90H 陕西科技大学毕业论文(设计说明书) 28
由于在硬件电路中,是将P0口和数码管的段码位相连,位选信号P2口与数码管亮灭有关,掌握着是哪个数码管亮,接下来程序就要定义相关端口:
(1)定义字位和字型口
#define sled_dm_port P0 /*定义数码管段码的控制脚*/ #define sled_wm_port P2 /*定义数码管位码的控制脚*/ (2)定义字型编码表(数字0~9)
uchar code du_char[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,}; (3)显示:得到字型和字位口的地址后,向不同的字位送数据,进行显示。 (4)动态扫描:由于使用动态显示法,在LED显示程序中,需要不停地进行扫描字位口,从而实现不同字位的数据的动态扫描结果。
开始显示缓冲区初始化指定字型口查表得到字型码送指定字位码延时10ms
图4-11 LED显示程序流程图
(5)数码管显示主程序 /*1MS为单位的延时程序*/ void delay_1ms(uchar z) {
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--); } main() {
uint temp_buff; uchar i; sled_dm_port=0; while(1)
太阳能热水器控制器的设计 29
{ temp_buff=ReadTemperature(); /*读取当前温度*/ sled_data[5] = du_char[temp_buff/100]; sled_data[6] = du_char[temp_buff0/10]; sled_data[7] = du_char[temp_buff]; for(i=0;i<8;i++) {
}
sled_wm_port = 0x00; /*关闭显示*/
sled_dm_port = sled_data[i]; /*输出段码数据到数码管*/ if(i==6) sled_dm_port = sled_dm_port&0x7f; /*显示小数点*/ sled_wm_port = we_table[i]; /*输出位码数据到数码管*/ delay_1ms(1);
}
} 陕西科技大学毕业论文(设计说明书) 30
5 硬件电路仿真结果
5.1 温度仿真
通过硬件电路和软件的结合,测试程序的正确性,需要仿真温度的显示和可控制加热方面是否达到要求,需要通过proteus软件做以下仿真: 5.1.1 温度显示仿真
仿真结果表明,显示的温度和数字温度传感器DS18B20上显示的数据相同,表明程序将温度传感器DS18B20中的温度数据正确的读出,达到了读取温度和显示温度的目的。
图5-1 温度显示仿真图
5.1.2 温度控制仿真
温度控制就是当温度低于某个温度值是闭合开关,而闭合开关一阵时间后温度达到合适温度后开关就会自动断开,停止加热。设定温度值为40度,以下是温度控制的仿真结果:温度没有低于设定温度时开关在右侧,当温度低于设定值时开关就会向左边闭合,启动加热。
太阳能热水器控制器的设计 31
图5-2 温度高于设定温度
图5-3 温度低于设定温度