蓝桥杯单片机——定时器实现秒表(9)

一、编程实现秒表

实现功能:利用定时器T0、数码管模块和2个独立按键(J5的2-3短接),设计一个秒表,具有清零、暂停、启动功能。

1.显示格式为:分-秒-0.05秒(即50ms)

08-26-18表示:8分26秒900毫秒

独立按键S4为:暂停/启动

独立按键S5为:清零

按键均为按下有效

#include <reg51.h>
sbit S4=P3^3;
sbit S5=P3^2;

unsigned char fen=0;//分
unsigned char s=0;//秒
unsigned char ms=0;//毫秒
unsigned	char code duanma[18]=
{	0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0x7f};
//用数组保存0~F的16个数值的编码,方便通过调用数组使用其值
void SMG_dispay(unsigned char i,unsigned char dat)
{
  P2=0xC0;P0=0x01<<i;
  P2=0xE0;P0=dat;
}
void delaysmg(unsigned int t)
{
	while(t--);
}
void InitT0()
{
	TMOD=0x01;
	TH0=(65536-50000)/256;//定时50ms
	TL0=(65536-50000)%256;
	
	EA=1;
	ET0=1;
	TR0=1;
}
void service_T0() interrupt 1
{
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
	ms++;
	if(ms==20)//1秒=1000ms
	{
		s++;
		ms=0;
		if(s==60)
		{
			fen++;
			s=0;
		}
		if(fen==99)
		{
		 	fen=0;
		}
	}
}
void timeshow()
{
  SMG_dispay(7,duanma[ms%10]);//显示毫秒
  delaysmg(500);
  SMG_dispay(6,duanma[ms/10]);
  delaysmg(500);
  SMG_dispay(5,duanma[16]);//分隔符
  delaysmg(500);

  SMG_dispay(4,duanma[s%10]);//显示秒
  delaysmg(500);
  SMG_dispay(3,duanma[s/10]);
  delaysmg(500);
  SMG_dispay(2,duanma[16]);
  delaysmg(500);

  SMG_dispay(1,duanma[fen%10]);//显示分
  delaysmg(500);
  SMG_dispay(0,duanma[fen/10]);
  delaysmg(500);
}
void delaykey(unsigned char t)
{
	while(t--);
}
void key()
{
	if(S4==0)//秒表启动/暂停
	{
	  delaykey(100);
	  if(S4==0)
	  {
	  		TR0=~TR0;
			while(S4==0)//避免误操作
			{
			 timeshow();
			}
	  }
	}
	if(S5==0)//秒表清零
	{
	  delaykey(100);
	  if(S5==0)
	  {
	  	 fen=0;
		 s=0;
		 ms=0;
		while(S4==0)
		{
			timeshow();
		}
	  }
	}

}
void main()
{
	P2=0xA0;P0=0x00;P2=0x80;P0=0xFF;//关闭外设
	InitT0();
	while(1)
	{
		 timeshow();
		 key();
	}

}

猜你喜欢

转载自blog.csdn.net/m0_57263863/article/details/122846463