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();
}
}