基于51单片机秒表设计,独立按键实现启动、复位、暂停功能

基于51单片机秒表设计,独立按键实现启动、复位、暂停功能

功能说明:

按键 功能
K1 开始
K2 暂停
K3 复位
#include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器

typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

sbit K1=P3^1;  //开始
sbit K2=P3^0;  //停止
sbit K3=P3^2;  //使用中断  清零  

//数码表
u8 code smgduan[17]={0x3f,0x06,0x5b,
	                 0x4f,0x66,0x6d,
	                 0x7d,0x07,0x7f,
                     0x6f,0x77,0x7c,
                     0x39,0x5e,0x79,
                     0x71};

u8 ssec,sec,min; //毫秒,秒,分
u8 DisplayData[8];

										 
void delay(u16 i)
{
	while(i--);	
}


void Timer0Init()
{
	TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
	TH0=0Xd8;	//给定时器赋初值,定时10ms
	TL0=0Xf0;	
	ET0=1;//打开定时器0中断允许
	
	//注:稍后用K2控制总中断,实现暂停功能
	EA=1;//打开总中断
	
	TR0=1;//打开定时器			
}


void DigDisplay()
{
	u8 i;
	for(i=0;i<8;i++)
	{
		switch(i)	 //位选,选择点亮的数码管,
		{
			case(0):
				LSA=1;LSB=1;LSC=1; break;//显示第7位
			case(1):
				LSA=0;LSB=1;LSC=1; break;//显示第6位
			case(2):
				LSA=1;LSB=0;LSC=1; break;//显示第5位
			case(3):
				LSA=0;LSB=0;LSC=1; break;//显示第4位
			case(4):
				LSA=1;LSB=1;LSC=0; break;//显示第3位 
			case(5):
				LSA=0;LSB=1;LSC=0; break;//显示第2位 
			case(6):
				LSA=1;LSB=0;LSC=0; break;//显示第1位 
			case(7):
				LSA=0;LSB=0;LSC=0; break;//显示第0位	
		}
		P0=DisplayData[i];//发送段码
		delay(100); //间隔一段时间扫描	
		P0=0x00;//消隐
	}
}

//处理时间,拆分数位
void datapros()
{
	DisplayData[0]=smgduan[min/10];
	DisplayData[1]=smgduan[min%10];
	DisplayData[2]=0x40;	
	DisplayData[3]=smgduan[sec/10];
	DisplayData[4]=smgduan[sec%10];
	DisplayData[5]=0x40;
	DisplayData[6]=smgduan[ssec/10];
	DisplayData[7]=smgduan[ssec%10];
}

//设置外部中断1 (K3)
void Int0Init()
{
      IT1=1;
	  EX1=1;
	  EA=1; 
}

//中断服务函数(按键)
void Int0()  interrupt 0
{
    //消抖
	delay(1000);
	if(K3==0)
	{
	//清零
	   min=0;
	   sec=0;
      ssec=0;
	}
}

//开始计时函数
void start()
{
      datapros();
	  DigDisplay();	
}

//主函数
void main()
{	
	Timer0Init(); //设置外部中断
    Int0Init();
	while(1)
	{
		if(K1==0)
		{
			delay(1000);//消抖
			while(1)
			{
				if(K2==0)
				{
				  EA=0;      //总中断关闭
				}
				
				  start();   //开始计时
				  
				  //退出
				 if(K3==0)
				 {
					 break;
				 }
			}
		}
	     //跳出循环 
		if(K3==0)
		{
		  break;
		}
	}		
}


void Timer0() interrupt 1
{
	TH0=0Xd8;	//给定时器赋初值,定时10ms
	TL0=0Xf0;
	ssec++;
	if(ssec>=100)  //1s
	{
		ssec=0;
		sec++;
		if(sec>=60)
		{
			sec=0;
			min++;
			if(min>=60)
			{
				min=0;
			}
		}	
	}	
}


猜你喜欢

转载自blog.csdn.net/wang2395/article/details/107476368