51单片机实现数字秒表,有开始,暂停,结束三个独立按键。
Proteus仿真图
代码
1.头文件,定义变量
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit a=P2^6; //段选端
sbit b=P2^7;//位选端
sbit start=P1^0;//开始
sbit pause=P1^1;//暂停
sbit end=P1^2;//复位
uint sec;
uchar count;
uchar Display[10]= {0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};//7段共阴极数码管
2.一般延时函数
void delay(uint rms)
{
uint i,j;
for(i=rms;i>0;i--)
for(j=110;j>0;j--);
}
3.显示函数
void show()
{
a=0;b=1;//位选端有效,秒个位
P0=0xdf;//选中第六个数码管
a=1;b=0;//段选端有效
P0=Display[sec%10];//显示相应数字
delay(5);
a=0;b=1;//秒十位
P0=0xef;
a=1;b=0;
P0=Display[sec/10%6];
delay(5);
a=0;b=1;//分个位
P0=0xf7;
a=1;b=0;
P0=Display[sec/60%10];
delay(5);
a=0;b=1;//分十位
P0=0xfb;
a=1;b=0;
P0=Display[sec/600%6];
delay(5);
a=0;b=1;//时个位
P0=0xfd;
a=1;b=0;
P0=Display[sec/3600%10];
delay(5);
a=0;b=1;//时十位
P0=0xfe;
a=1;b=0;
P0=Display[sec/3600];
delay(5);
}
4.中断函数
void int_T0() interrupt 1 {
TH0=0x3c;//50ms定时器T0初始化
TL0=0xb0;
count++;
if(count==20)
{
sec++;
count=0;
}
}
5.主函数
void main()
{
EA=1; //定时器T0初始化
ET0=1;
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
TR0=0;
while(1)
{
if(start==0)//按下start
{
delay(5);//延时消抖
if(start==0)//确认按下
{
TR0=1;//打开计时器
while(pause!=0&&end!=0)//如果没按下pause或end
{
show();//显示数字
}
if(end==0)//如果按下end
{
TR0=0;//定时器初始化
TH0=0x3c;
TL0=0xb0;
sec=0;
count=0;
while(start!=0)//当没按下srart
{
show();//显示000000
}
}
if(pulse==0)//按下pause
{
TR0=0;
while(start!=0)//如果没按下start
{
show();//显示当前数字
}
}
}
}
}
}