1、基于定时器设计一个最大范围10s的秒表。 2、按键有三重功能,包含开始/暂停/清零。第一次按下,秒表开始计时,SEG72显示毫秒,SEG71显示秒。第二次按下,暂停计时。第三次按下,两个数码管数据显示为0.
时间: 2024-05-09 11:15:08 浏览: 217
简易计时器,含开始、暂停、清零三个功能按钮
1.秒表设计:
可以使用定时器来实现秒表功能。我们可以使用定时器来计算经过的时间,并将其转换为秒和毫秒。以下是基于定时器设计的秒表代码:
```c
#include <reg52.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit KEY_START = P3^0; // 开始/暂停/清零按键
u8 flag_start = 0; // 计时开始标志位
u8 flag_pause = 0; // 计时暂停标志位
u8 flag_clear = 0; // 清零标志位
u16 ms_count = 0; // 毫秒计数器
u16 sec_count = 0; // 秒计数器
void Timer0Init()
{
TMOD |= 0x01; // 定时器0工作在模式1
TH0 = 0xFC; // 65536-50000=15536
TL0 = 0x00;
ET0 = 1; // 允许定时器0中断
TR0 = 1; // 启动定时器0
}
void main()
{
Timer0Init();
while(1)
{
if(!KEY_START) // 如果按键被按下
{
delay(10); // 延时去抖
if(!KEY_START) // 再次检测按键状态
{
if(!flag_start) // 第一次按下
{
flag_start = 1;
flag_clear = 0;
}
else if(flag_start && !flag_pause) // 第二次按下
{
flag_pause = 1;
}
else if(flag_start && flag_pause) // 第三次按下
{
flag_start = 0;
flag_pause = 0;
flag_clear = 1;
ms_count = 0;
sec_count = 0;
}
}
while(!KEY_START); // 等待按键释放
}
if(flag_clear) // 如果需要清零
{
// 清空数码管显示
P0 = P2 = 0xFF;
}
else // 否则更新数码管显示
{
// 显示毫秒部分
P0 = ms_count % 10;
P2 = ms_count / 10;
// 显示秒部分
P0 <<= 4;
P0 |= sec_count % 10;
P2 <<= 4;
P2 |= sec_count / 10;
}
}
}
void Timer0() interrupt 1
{
static u16 count = 0;
TH0 = 0xFC;
TL0 = 0x00;
count++;
if(count == 20) // 50ms
{
count = 0;
if(flag_start && !flag_pause) // 如果计时开始并且未被暂停
{
ms_count += 50; // 每50ms增加1
if(ms_count == 1000) // 如果满1000ms,秒数增加1
{
ms_count = 0;
sec_count++;
if(sec_count == 10) // 如果满10s,自动停止计时
{
flag_start = 0;
flag_pause = 0;
flag_clear = 1;
}
}
}
}
}
void delay(u16 i)
{
while(i--);
}
```
2.按键功能设计:
可以使用计数器来记录按键的状态,从而实现三重功能的按键。以下是按键功能设计的代码:
```c
#include <reg52.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit KEY_START = P3^0; // 开始/暂停/清零按键
u8 flag_start = 0; // 计时开始标志位
u8 flag_pause = 0; // 计时暂停标志位
u8 flag_clear = 0; // 清零标志位
u8 key_count = 0; // 按键计数器
u16 ms_count = 0; // 毫秒计数器
u16 sec_count = 0; // 秒计数器
void Timer0Init()
{
TMOD |= 0x01; // 定时器0工作在模式1
TH0 = 0xFC; // 65536-50000=15536
TL0 = 0x00;
ET0 = 1; // 允许定时器0中断
TR0 = 1; // 启动定时器0
}
void main()
{
Timer0Init();
while(1)
{
if(!KEY_START) // 如果按键被按下
{
key_count++;
if(key_count == 10) // 延时去抖
{
if(!flag_start) // 第一次按下
{
flag_start = 1;
flag_clear = 0;
}
else if(flag_start && !flag_pause) // 第二次按下
{
flag_pause = 1;
}
else if(flag_start && flag_pause) // 第三次按下
{
flag_start = 0;
flag_pause = 0;
flag_clear = 1;
ms_count = 0;
sec_count = 0;
}
key_count = 0;
}
while(!KEY_START); // 等待按键释放
}
if(flag_clear) // 如果需要清零
{
// 清空数码管显示
P0 = P2 = 0xFF;
}
else // 否则更新数码管显示
{
// 显示毫秒部分
P0 = ms_count % 10;
P2 = ms_count / 10;
// 显示秒部分
P0 <<= 4;
P0 |= sec_count % 10;
P2 <<= 4;
P2 |= sec_count / 10;
}
}
}
void Timer0() interrupt 1
{
static u16 count = 0;
TH0 = 0xFC;
TL0 = 0x00;
count++;
if(count == 20) // 50ms
{
count = 0;
if(flag_start && !flag_pause) // 如果计时开始并且未被暂停
{
ms_count += 50; // 每50ms增加1
if(ms_count == 1000) // 如果满1000ms,秒数增加1
{
ms_count = 0;
sec_count++;
if(sec_count == 10) // 如果满10s,自动停止计时
{
flag_start = 0;
flag_pause = 0;
flag_clear = 1;
}
}
}
}
}
```
阅读全文