程序如下:
#include<reg52.h>
unsigned char i=0;
unsigned int c = 0;
unsigned char code table[]={0xc0, 0xf9, 0xa4, 0xb0, 0x99,
0x92, 0x82, 0xf8, 0x80, 0x90};
void delay(unsigned int ms) //延迟函数
{
unsigned int a;
unsigned int b;
for (a = ms; a > 0; a--)
{
for (b = 121; b > 0; b--);
}
}
void dsnumber() //数码二极管显示函数
{
unsigned int b;
b = c;
P2 = 0xfe; //第一个数码管亮
b = b/600%6; //计算十分位的数值
P0 = table[b]; //
delay(10); //延迟
b = c;
P2 = 0xfd; //第二个数码管亮
b = b/60%10; //计算分位的数值
P0 = table[b]; //
delay(10); //延迟
b = c;
P2 = 0xfb; //第三个数码管亮
b = b/10%6; //计算十秒位的数值
P0 = table[b]; //
delay(10); //延迟
b = c;
P2 = 0xf7; //第四个数码管亮
b = b%10; //计算秒位的数值
P0 = table[b]; //
delay(10); //延迟
P0=0xff;
}
void InitTimer0(void)
{
TMOD = 0x01;//计数器状态选择
TH0 = 0x4C;//计数初值,11.0592M晶振
TL0 = 0x00;//计数初值
EA = 1;//EA为 中断开关,不需硬件中断时可以不写。
ET0 = 1;//ET0为0或不写默认为0时,计数器溢出TF0=1,不产生中断,需要软件清除。为1时引发中断同时硬件清0标志位。
TR0 = 1;//计数开始
}
void main(void)
{
InitTimer0();//重复上面的中断
while(1)
dsnumber();
}
void Timer0Interrupt(void) interrupt 1
{
i++;
TH0 = 0x4C;
TL0 = 0x00;
if (i==20) /* 50ms定时中断,20次为1S */
{
c++;
i=0;
}
}
|