代码如下:
#include<reg52.h>
#define uchar unsigned char
sbit s0=P1^0;
sbit s1=P1^1;
sbit s2=P1^2;
sbit s3=P1^3; //数码管的位选
uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0~9的数码管段码
uchar count=0;
uchar second=0;
uchar minite=0;
uchar number=200;
void delay(void)
{ 
uchar a,b; 
for(b=1;b>0;b--) 
for(a=90;a>0;a--);
}
void delay_LED()
{  uchar a,b;  
 for(b=38;b>0;b--) 
 for(a=80;a>0;a--);
}
void ini_display() //初始化数码管 显示“ help” 字样
{  uchar x=1000; 
 while(x--) 
{ 
s0=0; 
 s1=1; 
 s2=1; 
s3=1; 
P0=0x89;
 delay(); 
P0=0xff; 
s0=1;  s1=0;  s2=1;  s3=1;P0=0x86;  delay();  P0=0xff;
s0=1;  s1=1;  s2=0;  s3=1;  P0=0xc7;  delay();  P0=0xff;  
s0=1;  s1=1;  s2=1;  s3=0;  P0=0x8c;  delay();P0=0xff; 
}
}
void display() // 显示 XX(分):XX(秒) 四个数码管共阳极
{  
if(second<=9) 
 {   
s0=1; s1=1; s2=1; s3=0;  P0=table[second]; delay_LED(); P0=0xff;  
s0=1; s1=1; s2=0; s3=1;  P0=table[0]; delay_LED(); P0=0xff;  
s0=1; s1=0; s2=1; s3=1;  P0=table[minite%10];  delay_LED();  P0=0xff;  
s0=0; s1=1; s2=1; s3=1;  P0=table[minite/10]; delay_LED(); P0=0xff;  
}  
if(second>=10&&second<60) 
{      
s0=1; s1=1; s2=0; s3=1;P0=table[second/10];  delay_LED();  delay_LED(); P0=0xff;  
s0=1; s1=1;s2=1;s3=0;P0=table[second%10];  delay_LED(); P0=0xff;  
s0=1; s1=0; s2=1; s3=1; P0=table[minite%10];  delay_LED(); P0=0xff;  
s0=0; s1=1; s2=1; s3=1; P0=table[minite/10]; delay_LED(); P0=0xff;  
} 
 if(second==60) 
 {  
 minite++; 
 second=0; 
} 
 if(minite==60) 
 { 
 minite=0;
 }    
 }
void main()
{  uchar flag=0; 
 EA=1;
 ET1=0; 
 ET0=1;
 TMOD = 0x21; //定时器0作定时50ms
 TH0 = 0x3c; 
 TL0 = 0xb0; 
 TR0 = 1;  
 TH1 = 0xfd; 
 TL1 = 0xfd;//定时器1做波特率发生器
 TR1 = 1;
 EX1 = 1; 
 IT1 = 1;  
 ES = 1; 
SM0 = 0; 
 SM1 = 1; 
 REN = 1; //设置串口方式
 SBUF=temp; //触发串口处的中断
 while(1) 
{   
if(flag==0) 
{ 
ini_display(); 
 flag = 1; 
} 
else
{ 
display(); 
 } 
}
}
void timezhongduan( ) interrupt 1 //定时50ms后,计数20次,就是一秒----->秒表计时器
{ 
TH0 = 0x3c; 
TL0 = 0xb0; 
count++; 
if(count==20)
{ 
count=0; 
SBUF=table[minite/10]; 
SBUF=table[minite%10];
SBUF=table[second/10];
SBUF=table[second%10];
second++; 
}
}
void waibuint()interrupt 2 //外部中断1,会清零从头开始计数
{ 
EX1=0; 
second=0;
minite=0;
EX1=1;
}
void series()interrupt 4 //置零TI
{ 
 if(TI) 
{  
TI=0; 
 }
}