#include<reg51.h> //头文件 定义单片机内部寄存器
#define uchar unsigned char //宏定义 缩写成uchar
#define uint unsigned int//宏定义 缩写成uint
//数码管位端口定义
sbit w1=P2^2;
sbit w2=P2^3;
sbit w3=P2^4;
sbit w4=P2^5;
sbit w5=P2^6;
sbit w6=P2^7;
sbit LED=P1^0;
////////////////////////////
sbit key1=P3^5;
sbit key2=P3^6;
sbit key3=P3^7;
/////共阴数码管段信号编码////////
uchar code table[10]=//0---9
{0xFC,0x60,0xDA,0xF2,0x66,
0xB6,0xBE,0xE0,0xFE,0xF6};//
uchar mm,miao,fen;//计时 时分秒变量
uchar d1,d2,d3,d4,d5,d6;//显示拆分数据
void delay(uint ms)//1ms 延时函数 数据保持用的 括号里面是几大概就延时多少ms
{
uchar x;
for(ms;ms>0;ms--)
for(x=110;x>0;x--);
}
void display()//显示函数
{
d1=fen/10;//
d2=fen%10;//分钟
d3=miao/10;//
d4=miao%10;//秒
d5=mm/10;//
d6=mm%10;//百分秒
w1=0;P0=table[d1];delay(10);//第1位显示数据
P0=0x00;w1=1;//关闭显示消除动态扫描阴影
w2=0;P0=table[d2]|0x01;delay(10);//第2位显示数据
P0=0x00;w2=1;//关闭显示消除动态扫描阴影
w3=0;P0=table[d3];delay(10);//第3位显示数据
P0=0x00;w3=1;//关闭显示消除动态扫描阴影
w4=0;P0=table[d4]|0x01;delay(10);//第4位显示数据
P0=0x00;w4=1;//关闭显示消除动态扫描阴影
w5=0;P0=table[d5];delay(10);//第5位显示数据
P0=0x00;w5=1;//关闭显示消除动态扫描阴影
w6=0;P0=table[d6];delay(10);//第6位显示数据
P0=0x00;w6=1;//关闭显示消除动态扫描阴影
}
void main()
{
TMOD=0x01;//定时器0 16位计时模式
TH0=(65536-50000)/256; //50ms定时
TL0=(65536-50000)%256; //50ms定时
EA=1;//开启总中断
ET0=1;//开启定时器中断
TR0=0;//关闭定时器
while(1)
{
if(key1==0)TR0=1; //开始
if(key2==0)TR0=0;//停止
if(key3==0){fen=miao=mm=0;}//数据清零
display();//显示函数
}
}
void T0_time() interrupt 1
{
TH0=(65536-10000)/256; //10ms定时
TL0=(65536-10000)%256; //10ms定时
mm++;//加一次10ms定时 0.01S
if(mm==100)//1S
{
mm=0;
miao++;
LED=0;
delay(1000);
LED=1;
delay(1000);
if(miao==60)
{
miao=0;
fen++;
}
}
}