今天为大家带来一个基于单片机的简易秒表,该秒表拥有两个功能键,一个是控制秒表启动计时和暂停功效的(开始/暂停)键,1.当第一次按下该键,秒表开始计时。2.当第二次按下功能键时,秒表暂停工作。第二个按键是(清除)键,用来清除之前的计时数据,使秒表计数器归零。该秒表的精确度是0.1秒。
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit le1=P2^0;//用来控制第一个锁存器
sbit le2=P2^4;//用来控制第二个锁存器
sbit we3=P2^5;//用来控制第三个数码管的公共端
sbit we1=P2^6;//用来控制第一个数码管的公共端
sbit we2=P2^7;//用来控制第二个数码管的公共端
sbit key1=P3^0;//用来检测 开始/暂停 按键
sbit key2=P3^1;//用来检测 清楚 按键
uint num,num1,shi,ge,xiao;
uchar code tabl[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//延时函数
void delayms(uint xms){
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--)
;
}
//按键扫描函数
void keyscan(){
if(key1==0){ //开始/暂停键扫描
delayms(10);
if(key1==0){
TR0=~TR0;
while(!key1);
}
}
if(key2==0){ //清除键扫描
delayms(10);
if(key2==0){
num=0;
TR0=0;
while(!key2);
}
}
}
void display(uint num2){ //显示函数
shi=num2/100;//获取秒表十位显示数字
ge=num2%100/10;//获取秒表各位显示数字
xiao=num2%100%10;//获取秒表十分位的数字。
we1=0;//把第一个数码管公共端接低电平 (打开)
le1=1;//打开第一个锁存器
P0=tabl[shi];//向第一个锁存器发送秒表要显示的十位数字
delayms(2);//延时2ms
le1=0;//关闭锁存器
P0=0xff;//消影
we1=1;//把把第一个数码管公共端接高电平(关闭)
we2=0;
le1=1;
P0=tabl[ge];
delayms(2);
le1=0;
P0=0xff;
we2=1;
we3=0;
le2=1;
P0=tabl[xiao];
delayms(2);
le2=0;
P0=0xff;
we3=1;
}
void main(){
TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
while(1){
keyscan();
if(num==600)num=0;//当num 计数满600,表示时间增加六十秒
display(num);
}
}
void T0_time()interrupt 1//中断函数(用来产生时间)
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num1++;
if(num1==2){//当num1计数满2,表示时间增加0.1秒
num1=0;
num++;
}
}
Protues仿真演示截图
|