#include < AT89X51.H>
unsigned char code dispcode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,
0x82,0xF8,0x80,0x90}; //七段数码管译码表
unsigned char second; //定义秒变量
unsigned char keycnt; //按键次数变量
unsigned int tcnt; //中断次数变量
void main(void) //主函数
{
unsigned char i,j;
TMOD=0x02; //定时器0工作在模式2,GATE=0,C/T=0,自动装载模式
ET0=1; //允许定时器0中断
EA=1; //允许总中断
second=0; //置秒变量初值
P1=dispcode[second/10]; //显示定时值的十位
P0=dispcode[second%10]; //显示定时值的个位
while(1) //无限循环
{ if(P3_5==0) //与P3_5引脚连接的按键按下
{ for(i=20;i>0;i--) //循环语句延时
for(j=248;j>0;j--); //循环语句延时
if(P3_5==0) //如果按键确实按下
{ keycnt++; //次数变量加1
switch(keycnt) //根据次数变量的值分支选择
{ case 1: //若是次数变量等于1
TH0=0x06;
TL0=0x06; //定时器初值为6,所以溢出计数值为250μs,时钟为12MHz
TR0=1; //启动定时器0运行
break;
case 2: //若是次数变量等于2
TR0=0; //停止定时器0运行
break;
case 3: //若是次数变量等于3
keycnt=0; //次数变量清 0
second=0; //秒变量清0
break;
} //分支选择结束
while(P3_5==0); //等待按键抬起
} }
P1=dispcode[second/10]; //显示秒变量十位
P0=dispcode[second%10]; //显示秒变量个位
} }
void t0(void) interrupt 1 using 0 //定时器0中断服务程序
{
tcnt++; //每中断1次,tcnt加1
if(tcnt==400) //如果tcnt=400 ,则执行如下语句
{ //0.25ms*400=100ms
tcnt=0; //将tcnt清0
second++; //秒变量加1
if(second==100) //如果秒变量等于100
{ second=0; } //将秒变量清0
} }