程序如下:
#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;//計數器狀態(tài)選擇
TH0 = 0x4C;//計數初值,11.0592M晶振
TL0 = 0x00;//計數初值
EA = 1;//EA為 中斷開關,不需硬件中斷時可以不寫。
ET0 = 1;//ET0為0或不寫默認為0時,計數器溢出TF0=1,不產生中斷,需要軟件清除。為1時引發(fā)中斷同時硬件清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;
}
}
|