设计报告
一、项目概述
本项目基于 8051 单片机设计了一个简单的秒数倒计时系统,通过按键可以对秒数进行调整,同时支持启动和停止倒计时功能。当倒计时结束时,蜂鸣器会发出声音提醒。
二、硬件设计
- 单片机:使用 8051 系列单片机作为主控芯片。
- 按键:使用 4 个按键(k1、k2、k3、k4),其中 k1 用于增加秒数,k2 用于减少秒数,k3 用于启动和停止倒计时。
- 数码管:使用 2 位数码管显示秒数。
- 蜂鸣器:当倒计时结束时,蜂鸣器发出声音提醒。
三、软件设计
1. 定时器初始化
使用定时器 0 工作在模式 1,定时时间为 1000ms,用于实现秒数的倒计时。
void Timer0Init(void) {
TMOD &= 0xF0;
TMOD |= 0x01;
TL0 = 0x66;
TH0 = 0xFC;
TF0 = 0;
TR0 = 0;
ET0 = 1;
EA = 1;
PT0 = 0;
}
2. 延时函数
使用软件延时函数 delay
实现消抖和数码管动态扫描的延时。
void delay(uint i) {
uint j;
for(j = 0; j < i; j++);
}
3. 按键扫描函数
使用 key_scan
函数进行按键消抖处理,提高按键检测的稳定性。
bit key_scan(sbit key) {
if(key == 0) {
delay(20);
if(key == 0) {
while(key == 0);
return 1;
}
}
return 0;
}
4. 显示时间函数
show_time
函数通过数码管动态扫描的方式显示秒数。
void show_time() {
uint i;
for (i = 0; i < 2; i++) {
switch (i) {
case 0:
key3 = 0;
key2 = 0;
key1 = 0;
P0 = table[second % 10];
break;
case 1:
key3 = 0;
key2 = 0;
key1 = 1;
P0 = table[second / 10];
break;
}
delay(5);
P0 = 0x00;
}
}
5. 定时器中断服务函数
在定时器 0 中断服务函数 Timer0_Routine
中,每秒对秒数进行减 1 操作,当秒数为 0 时,蜂鸣器发声。
void Timer0_Routine() interrupt 1 {
static uint T0count;
TL0 = 0x66;
TH0 = 0xFC;
T0count++;
if (T0count == 1000) {
T0count = 0;
if (second > 0) {
second--;
} else {
beep = ~beep;
}
}
}
6. 主函数
主函数中初始化定时器和秒数,然后进入循环,不断扫描按键并更新显示。
void main() {
Timer0Init();
second = 60;
while(1) {
show_time();
if(key_scan(k1)) {
if (second < 255) {
second++;
}
}
if(key_scan(k2)) {
if (second > 0) {
second--;
}
}
if(key_scan(k3)) {
TR0 = ~TR0;
if(second == 0) {
beep = 1;
}
}
}
}
四、改进点说明
- 按键消抖:添加了
key_scan
函数,对按键进行消抖处理,提高了按键检测的稳定性。 - 数码管显示优化:减少了不必要的数码管位扫描,只显示 2 位秒数,提高了显示效率。
- 蜂鸣器控制:在启动或停止定时器时,对蜂鸣器进行控制,避免蜂鸣器误发声。
五、测试与调试
在硬件平台上进行测试,通过按键对秒数进行调整,启动和停止倒计时功能正常。当倒计时结束时,蜂鸣器能够正常发声提醒。
六、总结
本项目通过 8051 单片机实现了一个简单的秒数倒计时系统,通过软件编程和硬件设计的结合,完成了按键控制、数码管显示和蜂鸣器发声等功能。在设计过程中,对按键消抖、数码管显示和蜂鸣器控制等方面进行了优化,提高了系统的稳定性和可靠性