基于小蜜蜂蓝桥杯单片机定时器的实现秒闪功能

2.10 【基础 10】定时器实现秒表功能 新建工程,以 I/O 模式编写代码,在 CT107D 单片机综合训练平台上,利用定时器 T0、 数码管和 2 个独立按键,设计并实现一个秒表,具有启动、暂停和清零功能。

1、秒表的显示格式: 分-秒-0.05 秒(即 50ms) 如 8 分 26 秒 900 毫秒,显示为: 08-26-18

2、独立按键 S4 定义为:启动/暂停,即第 1 次按下启动秒表,再次按下暂停秒表。

3、独立按键 S5 定义为:清零。 4、按键均为按下有效。

【训练要点】: 精准定时、显示模块、独立按键多模块综合应用。

【参考资源】: B 站视频教程

【基础技能 10】定时器的进阶综合案例解析 

限于个人水平,难于做到尽善尽美,且本专栏主要起练习笔记作用。如有前辈发现代码错误或可以优化的地方,还请不吝赐教,学生感激不尽。

#include<STC15F2K60S2.h>

sbit S5=P3^2;
sbit S4=P3^3;

unsigned char minute=0;
unsigned char second=0;
unsigned char msecond=0;

unsigned char  code SMG_duanma[18]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};

void SelectHc573(unsigned char num1,num2)
{
	P2=(P2&0x1f)|0x00;
	P0=num2;
	switch(num1)
	{
		case 0:
			P2=(P2&0x1f)|0x00;
		break;
		case 4:
			P2=(P2&0x1f)|0x80;
		break;
		case 5:
			P2=(P2&0x1f)|0xa0;
		break;
		case 6:
			P2=(P2&0x1f)|0xc0;
		break;
		case 7:
			P2=(P2&0x1f)|0xe0;
		break;
	}
	P2=(P2&0x1f)|0x00;
}


void InitTimer0()
{
	TMOD=0x01;
	TH0=(65535-50000)/256;
	TL0=(65535-50000)%256;
	EA=1;
	ET0=1;
	TR0=1;
}

void ServiceTimer0() interrupt 1
{
	TH0=(65535-50000)/256;
	TL0=(65535-50000)%256;
	msecond++;
	if(msecond==20)
	{
		second++;
		msecond=0;
		if(second==60)
		{
			minute++;
			second=0;
		}
		if(minute==99)
		{
			minute=0;
		}
	}
}

void Delay2ms()		//@11.0592MHz
{
	unsigned char i, j;
	i = 22;
	j = 128;
	do
	{
		while (--j);
	} while (--i);
}


void DisplaySMG(unsigned char pos,value)
{
	SelectHc573(7,value);
	SelectHc573(6,0x01<<pos);
}

void Display()
{
	SelectHc573(6,0x00);
	DisplaySMG(0,SMG_duanma[minute/10]);
	Delay2ms();
	DisplaySMG(1,SMG_duanma[minute%10]);
	Delay2ms();
	DisplaySMG(2,SMG_duanma[16]);
	Delay2ms();
	DisplaySMG(3,SMG_duanma[second/10]);
	Delay2ms();
	DisplaySMG(4,SMG_duanma[second%10]);
	Delay2ms();
	DisplaySMG(5,SMG_duanma[16]);
	Delay2ms();
	DisplaySMG(6,SMG_duanma[msecond/10]);
	Delay2ms();
	DisplaySMG(7,SMG_duanma[msecond%10]);
	Delay2ms();

}

void Delayk(unsigned char t)
{
	while(t--);
}

void ScanKeys()
{
	if(S4==0)
	{
		Delayk(200);
		if(S4==0)
		{
			TR0=~TR0;
		}
		while(S5==0)
		{
			Display();
		}
	}
	if(S5==0)
	{
		Delayk(200);
		if(S5==0)
		{
			minute=0;
			second=0;
			msecond=0;
		}
		while(S5==0)
		{
			Display();
		}	
	}
}

void main()
{
	SelectHc573(4,0xff);
	InitTimer0();
	while(1)
	{
		ScanKeys();
		Display();
	}
}
	
	

  • 15
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值