keil uVision4界面:
#include<reg51.h> //包含8051单片机寄存器定义的头文件
//共阴极数码管段码 0-9,不带小数点
unsigned char code discode1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char timer=0; //记录中断次数
unsigned char second; //存储秒
unsigned char key=0; //记录按键次数
void main() //主函数
{
TMOD=0x01; //定时器T0方式1为定时
ET0=1; //允许定时器T0中断
EA=1; //总中断允许
second=0; //设初始值
P0=discode1[second/10]; //显示秒位0
P2=discode1[second%10]; //显示1S位0
while(1) //循环
{
if((P3&0x80)==0x00) //当按键被按下时
{
key++; //当按键次数加1
switch(key) //根据按键次数分3种情况
{
case 1: //第一次按下为启动秒表计时
TH0=0xee; //向TH0写入初值的高8位
TL0=0x00; //向TL0写入初值的低8位
TR0=1; //启动定时器T0
break;
case 2: //第二次按下为暂停秒表计时
TR0=0; //关闭定时器T0
break;
case 3: //第三次按下为清零秒表
key=0; //按键次数清零
second=0; //秒表清零
P0=discode1[second/10]; //显示秒位0
P2=discode1[second%10]; //显示1S位0
break;
}
while((P3&0x80)==0x00); //如果按键时间过长在此循环
}
}
}
void int_T0() interrupt 1 using 0 //定时器T0中断函数
{
TR0=0; //停止计时,执行以下操作
TH0=0Xee;
TL0=0X00;
timer++; //记录中断次数
if (timer==20) //中断20次,0.1S
{
timer=0; //中断次数清零
second++; //加1S
P0=discode1[second/10]; //显示秒位
P2=discode1[second%10]; //显示1S位
}
if(second==49) //当计时到49S
{
TR0=0; //停止计时
second=0; //秒数清零
key=2; //按键数置2,当再次按下,key++,相当于key=3,秒表清零复原
}
else //当计时不到49S
{
TR0=1; //启动定时器继续计时
}
}
proteus仿真界面: