#include <reg52.h>        //包含52系列单片机头文件
#define uchar unsigned char    //为宏定义，把unsigned char用uchar表示，方便书写
#define uint unsigned int      //为宏定义，把unsigned int用uint表示，方便书写
sbit dula=P2^6;             //U1锁存器的锁存端位定义
sbit wela=P2^7;            //U2锁存器的锁存端位定义
uchar num,dunum,wenum;   //变量num,dunum,wenum声明
uchar code table_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
                       0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};   //数码管段选编码
uchar code table_we[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};  //数码管位选编码
display();   //函数声明
void main()
{
	EA=1;         //开总中断
	ET0=1;        //开定时器0分开关
	TMOD=0X01;  //设置为方式1
	TH0=(65536-50000)/256;   //给定时器0装初值，12M晶振定时时间为50ms
	TL0=(65536-50000)%256;   
	TR0=1;   //启动定时器0
	while(1)
	{
		if(num==20)  //如果到了20次，说明1秒时间到了
		{
			num=0;         //然后把num的值清0，重新再计20次
			if(dunum==6)   //如果dunnum等于6，让它等于0
			dunum=0;
			if(wenum==6)   //如果wennum等于6，让它等于0
			wenum=0;
			display();  //数码管显示
			dunum++;  
			wenum++;
		}
	}
}

void time0() interrupt 1    //中断服务程序，其中“1”是定时器0入口序号
{
	TH0=(65536-50000)/256;    //重装初值，12M晶振隔间50ms重装一次
	TL0=(65536-50000)%256;
	num++;    //每中断一次，num的值加1
}

display()   //数码管显示函数
{
	P0=0xff;  //关闭所有数码管显示，防止有交替重影，专业名称叫（消隐）
	wela=1;
	wela=0;
	P0=table_du[dunum+1];   //向数码管送入段选值
	dula=1;
	dula=0;
	P0=table_we[wenum];     //向数码管送入位选值
	wela=1;
	wela=0;
}