本程序代码为《手把手教你学51单片机》5.4的课后练习题5,并且已经在KST-51 v1.3.2开发板验证通过。
#include <reg52.h>
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
//数码管真值表
unsigned char code LedChar[16] = {
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};
unsigned int cnt = 0; //记录进入Timer0中断次数
unsigned char sec = 15; //记录经过的秒数,倒计时初值15,也可以写成十六进制的形式(0x0F)
bit flag1s = 0; //定义一个bit形的变量,作为1秒的标志位
void main(){
EA = 1; //使能总中断
ENLED = 0;
ADDR3 = 1;
ADDR2 = 0;
ADDR1 = 0;
ADDR0 = 0;
TMOD &= 0xF0; //设置Timer0为工作模式1
TMOD |= 0x01;
TH0 = 0xDC; //为Timer0赋初值,定时10ms
TL0 = 0x00;
ET0 = 1; //使能Timer0中断
TR0 = 1; //启动Timer0
while(1){
P0 = LedChar[sec]; //当前秒数对应的真值表中的值送到P0口
if(flag1s){
flag1s = 0;
if(sec > 0){
sec--; //当秒数大于0时,减1
}
else{
sec = 15; //当秒数等于0时,重新赋初值0x0F(十进制的15)
}
}
}
}
void interruptTimer0() interrupt 1{
TH0 = 0xDC; //进入Timer0赋初值
TL0 = 0x00;
cnt++; //每进入1次中断,中断次数加1
if(cnt >= 100){ //当进入了100次中断,即计时了10ms*100 = 1s时
cnt = 0; //记录进入中断次数清零
flag1s = 1; //定时1s标志位赋1
}
}