|
程序如下:
#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) //延遲函數(shù)
{
unsigned int a;
unsigned int b;
for (a = ms; a > 0; a--)
{
for (b = 121; b > 0; b--);
}
}
void dsnumber() //數(shù)碼二極管顯示函數(shù)
{
unsigned int b;
b = c;
P2 = 0xfe; //第一個(gè)數(shù)碼管亮
b = b/600%6; //計(jì)算十分位的數(shù)值
P0 = table[b]; //
delay(10); //延遲
b = c;
P2 = 0xfd; //第二個(gè)數(shù)碼管亮
b = b/60%10; //計(jì)算分位的數(shù)值
P0 = table[b]; //
delay(10); //延遲
b = c;
P2 = 0xfb; //第三個(gè)數(shù)碼管亮
b = b/10%6; //計(jì)算十秒位的數(shù)值
P0 = table[b]; //
delay(10); //延遲
b = c;
P2 = 0xf7; //第四個(gè)數(shù)碼管亮
b = b%10; //計(jì)算秒位的數(shù)值
P0 = table[b]; //
delay(10); //延遲
P0=0xff;
}
void InitTimer0(void)
{
TMOD = 0x01;//計(jì)數(shù)器狀態(tài)選擇
TH0 = 0x4C;//計(jì)數(shù)初值,11.0592M晶振
TL0 = 0x00;//計(jì)數(shù)初值
EA = 1;//EA為 中斷開(kāi)關(guān),不需硬件中斷時(shí)可以不寫(xiě)。
ET0 = 1;//ET0為0或不寫(xiě)默認(rèn)為0時(shí),計(jì)數(shù)器溢出TF0=1,不產(chǎn)生中斷,需要軟件清除。為1時(shí)引發(fā)中斷同時(shí)硬件清0標(biāo)志位。
TR0 = 1;//計(jì)數(shù)開(kāi)始
}
void main(void)
{
InitTimer0();//重復(fù)上面的中斷
while(1)
dsnumber();
}
void Timer0Interrupt(void) interrupt 1
{
i++;
TH0 = 0x4C;
TL0 = 0x00;
if (i==20) /* 50ms定時(shí)中斷,20次為1S */
{
c++;
i=0;
}
}
|
|