今天为大家带来一个基于单片机的简易秒表,该秒表拥有两个功能键,一个是控制秒表启动计时和暂停功效的(开始/暂停)键,1.当第一次按下该键,秒表开始计时。2.当第二次按下功能键时,秒表暂停工作。第二个按键是(清除)键,用来清除之前的计时数据,使秒表计数器归零。该秒表的精确度是0.1秒。
#include#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仿真演示截图



