基于51单片机倒计时器秒表定时器数码管显示设计
1 功能介绍
本设计基于STC89C52单片机,通过数码管进行时间显示,实现了秒表与定时器相结合的功能。该系统主要用于实现以下功能:
- 倒计时功能:用户可以通过按键设置倒计时的分钟数,范围在1到99分钟之间。系统启动后会按照设定时间进行倒计时。
- 蜂鸣器提示:在倒计时的最后5秒,蜂鸣器发出间歇性提示音,提醒用户时间即将结束。当倒计时归零时,蜂鸣器持续报警提示。
- 暂停与继续:用户在倒计时过程中可以随时通过按键暂停计时,再次按下时可以恢复计时,保证了操作的灵活性。
- 时间显示:通过4位共阳数码管进行分钟和秒的实时显示,显示效果清晰直观。
- 系统扩展性强:通过更换显示模块或增加功能按键,可以扩展为秒表模式、正计时模式等,具有良好的应用拓展性。
本系统广泛适用于学习51单片机课程设计、定时提醒、实验定时器以及日常生活中的厨房定时器等应用场景。
2 系统电路设计
系统由STC89C52单片机为核心,外围主要包括数码管显示电路、按键电路、蜂鸣器电路和电源电路。各模块的作用如下:
2.1 单片机核心电路
本设计采用STC89C52单片机作为核心控制器。其特点如下:
- 兼容标准8051内核,具有较高的运行速度和良好的稳定性。
- 内部集成8KB程序存储器和512字节数据存储器,满足本设计需求。
- 提供丰富的I/O端口,能够方便地驱动数码管和其他外设。
- 内置定时器/计数器,用于实现精确的时间计数。
单片机主要完成以下任务:时间运算、数码管扫描显示、按键输入检测以及蜂鸣器报警控制。
2.2 数码管显示电路
显示部分采用4位共阳极数码管,用于显示倒计时的分钟和秒数。例如“12:34”表示12分钟34秒。其特点如下:
- 采用动态扫描方式显示,减少了单片机I/O口的占用。
- 共阳数码管的段选由单片机控制,位选由位控制端口切换。
- 显示刷新周期通常为1ms~5ms,人眼能够感知到连续的数字显示。
2.3 按键电路
系统设置了多个按键,主要用于用户交互:
- 设置键:用于调整倒计时的分钟数。
- 启动/暂停键:用于控制倒计时的开始与暂停。
- 清零键:用于复位倒计时,回到初始状态。
按键电路采用上拉电阻方式连接单片机I/O口,单片机通过扫描检测按键状态变化。
2.4 蜂鸣器电路
蜂鸣器用于时间提示和报警。其特点如下:
- 采用有源蜂鸣器,只需单片机输出高低电平即可驱动。
- 在倒计时的最后5秒,蜂鸣器以间歇方式鸣响。
- 当倒计时结束,蜂鸣器持续鸣响,直到用户按下停止键。
2.5 电源电路
系统采用+5V直流电源供电,电源电路由以下部分构成:
- 电源适配器或USB接口供电。
- 稳压芯片7805将输入电压稳定在+5V。
- 电容滤波器用于减少电源干扰,保证系统稳定运行。
3 程序设计
程序设计是本系统的核心部分,主要分为主程序、按键检测子程序、数码管显示子程序、定时器中断服务程序和蜂鸣器控制子程序。
3.1 主程序设计
主程序负责系统初始化、循环检测按键、更新时间变量以及调用显示函数。程序框架如下:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit BEEP = P2^5; // 蜂鸣器
sbit KEY_SET = P3^0; // 设置键
sbit KEY_START = P3^1;// 启动/暂停键
sbit KEY_CLR = P3^2; // 清零键
uchar second = 0; // 秒
uchar minute = 0; // 分钟
bit run_flag = 0; // 运行标志
void delay(uint z);
void display();
void Timer0Init();
void KeyScan();
void main()
{
Timer0Init(); // 定时器初始化
while(1)
{
KeyScan(); // 扫描按键
display(); // 显示时间
}
}
3.2 按键扫描子程序
按键扫描用于检测用户的输入操作,包括设置倒计时、启动/暂停和清零。
void KeyScan()
{
if(KEY_SET == 0)
{
delay(10);
if(KEY_SET == 0)
{
minute++;
if(minute > 99) minute = 0;
while(!KEY_SET);
}
}
if(KEY_START == 0)
{
delay(10);
if(KEY_START == 0)
{
run_flag = ~run_flag; // 启动或暂停
while(!KEY_START);
}
}
if(KEY_CLR == 0)
{
delay(10);
if(KEY_CLR == 0)
{
minute = 0;
second = 0;
run_flag = 0;
while(!KEY_CLR);
}
}
}
3.3 定时器中断子程序
定时器用于1秒定时,倒计时逻辑在此实现。
void Timer0Init(void) //1ms@11.0592MHz
{
AUXR &= 0x7F;
TMOD &= 0xF0;
TMOD |= 0x01;
TL0 = 0x18;
TH0 = 0xFC;
TF0 = 0;
TR0 = 1;
ET0 = 1;
EA = 1;
}
uint count = 0;
void Timer0_ISR(void) interrupt 1
{
count++;
if(count >= 1000) // 1秒
{
count = 0;
if(run_flag)
{
if(second == 0)
{
if(minute == 0)
{
BEEP = 0; // 倒计时结束,蜂鸣器长鸣
}
else
{
minute--;
second = 59;
}
}
else
{
second--;
}
if(minute == 0 && second <= 5 && second > 0)
{
BEEP = ~BEEP; // 最后5秒间歇提示
}
}
}
}
3.4 数码管显示子程序
通过动态扫描方式实现分钟和秒的显示。
uchar code seg_code[10] = {
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void display()
{
uchar i;
uchar num[4];
num[0] = minute / 10;
num[1] = minute % 10;
num[2] = second / 10;
num[3] = second % 10;
for(i=0;i<4;i++)
{
P0 = seg_code[num[i]];
P2 = (1 << i); // 位选
delay(1);
P0 = 0x00;
}
}
3.5 延时函数
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
4 总结
本设计基于STC89C52单片机,结合数码管、蜂鸣器和按键,实现了一个简单实用的倒计时器秒表系统。其主要特点是:
- 功能实用,操作简单,适合课程设计和实验教学。
- 硬件电路简洁,数码管动态扫描节省了I/O资源。
- 软件程序模块化,具有良好的可扩展性,便于增加更多功能,如正计时、秒表功能等。
- 系统可应用于厨房烹饪、实验室定时等多种场景,具有一定的实用价值。
本设计不仅体现了单片机在定时器应用中的优势,也为后续扩展设计提供了良好的基础。