#include<reg52.h> // 包含51 单片机寄存器定义的头文件
#define uchar unsigned char
#define uint unsigned int  
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar int_time ; //中断次数计数变量
uchar second; //秒计数变量
minute; //分钟计数变量
uchar hour; //小时计数变量
void delay(uint z) //延时函数,延时约1ms
{
 uchar x,y;    
 for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}
/******************************************************************
函数功能:显示秒的子程序
入口参数:s
********************************************************************/
void DisplaySecond(uchar s)
{
 wela=1;
 P0=0xef; //DS5点亮
 wela=0;
 P0=0xff; //消隐 
 dula=1;
 P0=table[s/10]; //显示十位
 dula=0;
 delay(1);
 wela=1;
 P0=0xdf; //DS6点亮
 wela=0;
 P0=0xff; //消隐 
 dula=1;
 P0=table[s%10]; //显示个位
 dula=0;
 delay(1);
}
/******************************************************************
函数功能:显示分钟的子程序
入口参数:m
********************************************************************/
void DisplayMinute(uchar m)
{
 wela=1;
 P0=0xfb; //DS3点亮
 wela=0;
 P0=0xff; //消隐 
 dula=1;
 P0=table[m/10]; //显示十位
 dula=0;
 delay(1);
 wela=1;
 P0=0xf7; //DS4点亮
 wela=0;
 P0=0xff; //消隐 
 dula=1;
 P0=table[m%10]; //显示个位
 dula=0;
 delay(1);
}
/******************************************************************
函数功能:显示小时的子程序
入口参数:h
********************************************************************/
void DisplayHour(uchar h)
{
 wela=1;
 P0=0xfe; //DS1点亮
 wela=0;
 P0=0xff; //消隐 
 dula=1;
 P0=table[h/10]; //显示十位
 dula=0;
 delay(1);
 wela=1;
 P0=0xfd; //DS2点亮
 wela=0;
 P0=0xff; //消隐 
 dula=1;
 P0=table[h%10]; //显示个位
 dula=0;
 delay(1);  
}
/************初始化************/ 
void init()
{
 TMOD=0x01; //使用定时器T0
 EA=1; //开中断总允许
 ET0=1; //允许T0 中断
 TH0=(65536-50000)/256; //定时器高八位赋初值
 TL0=(65536-50000)%256; //定时器低八位赋初值
 TR0=1;
 int_time=0; //中断计数变量初始化
 second=0; //秒计数变量初始化
 minute=0; //分钟计数变量初始化
 hour=0; //小时计数变量初始化
}   
/******************************************************************
函数功能:主函数
********************************************************************/
void main()
{ 
 init();
 while(1)
 {
  DisplaySecond(second); //调用秒显示子程序
  delay(1);
  DisplayMinute(minute); //调用分钟显示子程序
  delay(1);
  DisplayHour(hour);     //调用小时显示子程序
  delay(1);
  
 }
}
/******************************************************************
函数功能:定时器T0的中断服务子程序
********************************************************************/
void interserve() interrupt 1 //using Time0
{
 int_time++;
 if(int_time==20)//控制速度
 {
  int_time=0; //中断计数变量清0
  second++; //秒计数变量加1
 }
 if(second==60)
 {
  second=0; //如果秒计满60,将秒计数变量清0
  minute++; //分钟计数变量加1
 }
 if(minute==60)
 {
  minute=0; //如果分钟计满60,将分钟计数变量清0
  hour++; //小时计数变量加1
 }
 if(hour==24)
 {
     hour=0; //如果小时计满24,将小时计数变量清0 
 }
 TH0=(65536-50000)/256; //定时器重新赋初值
 TL0=(65536-50000)%256;
 
}