1. 项目概述
这个51单片机羽毛球计分器项目是我去年为一个业余羽毛球俱乐部设计的实用小工具。作为一个经常参加业余比赛的羽毛球爱好者,我发现很多小型比赛还在使用纸质记分牌,不仅容易出错,而且缺乏时间记录功能。于是决定用最经典的51单片机开发一套简单实用的电子计分系统。
整套系统由STC89C52单片机作为主控,搭配LCD1602液晶显示屏和7个功能按键组成。系统可以实时显示双方选手的小分和大比分,同时记录比赛用时。相比市面上动辄上千元的专业计分设备,这个方案成本不到50元,但功能完全满足业余比赛需求。
2. 硬件设计详解
2.1 核心器件选型
选择STC89C52RC单片机主要基于以下考虑:
- 完全兼容传统51架构,开发资料丰富
- 内置8K Flash存储器,足够存储程序代码
- 价格仅5-8元,性价比极高
- 工作电压范围宽(3.3V-5V),适合电池供电
LCD1602液晶屏的选型要点:
- 2行16字符显示,足够显示比分和时间
- 5V供电,与单片机电平匹配
- 带背光,室内外都清晰可见
- 并行接口,编程简单
2.2 电路设计要点
电源部分采用USB 5V供电,通过AMS1117-3.3稳压芯片产生3.3V备用电源。实际测试中,整套系统工作电流约80mA,使用2000mAh的锂电池可连续工作24小时以上。
按键电路设计特别注意防抖处理:
- 硬件防抖:每个按键并联104瓷片电容
- 软件防抖:检测到按键按下后延时20ms再次检测
c复制// 按键检测代码示例
if(KEY1 == 0) {
delay_ms(20); // 延时去抖
if(KEY1 == 0) {
// 确认按键按下
score_A++; // A队加分
}
}
3. 软件实现解析
3.1 主程序框架
程序采用前后台系统架构,主循环处理显示刷新,定时器中断处理时间计数:
c复制void Timer0_ISR() interrupt 1 {
static uint16_t ms_count = 0;
TH0 = 0xFC; TL0 = 0x66; // 1ms定时
if(run_flag) {
if(++ms_count >= 1000) {
ms_count = 0;
seconds++; // 秒计数增加
}
}
}
void main() {
EA = 1; // 开总中断
ConfigTimer0(1); // 配置T0定时1ms
InitLcd1602(); // 初始化液晶
while(1) {
KeyDriver(); // 按键扫描
DisplayUpdate(); // 显示刷新
}
}
3.2 比分处理逻辑
羽毛球比赛采用21分制,当双方都达到20分时需领先2分才能获胜,最高到30分。实现代码如下:
c复制void UpdateScore() {
if(score_A >= 21 || score_B >= 21) {
if(abs(score_A - score_B) >= 2) {
// 比赛结束
if(score_A > score_B) {
total_A++; // A队大比分+1
} else {
total_B++; // B队大比分+1
}
ResetGame(); // 重置小比分
}
}
}
4. 关键功能实现
4.1 时间显示处理
比赛时间显示格式为"MM:SS",通过秒计数器转换实现:
c复制void DisplayTime() {
uint8_t minutes = seconds / 60;
uint8_t secs = seconds % 60;
LcdWriteData(minutes/10 + '0');
LcdWriteData(minutes%10 + '0');
LcdWriteData(':');
LcdWriteData(secs/10 + '0');
LcdWriteData(secs%10 + '0');
}
4.2 按键功能分配
7个独立按键功能分配如下:
| 按键 | 功能 | 说明 |
|---|---|---|
| K1 | 启动 | 开始比赛计时 |
| K2 | 暂停 | 暂停比赛计时 |
| K3 | A队+1 | A队得分增加 |
| K4 | A队-1 | A队得分修正 |
| K5 | B队+1 | B队得分增加 |
| K6 | B队-1 | B队得分修正 |
| K7 | 重置 | 清零比分和时间 |
5. 制作注意事项
5.1 硬件组装要点
- 单片机最小系统:确保晶振(11.0592MHz)和复位电路正常工作
- LCD1602连接:建议使用排针+杜邦线,方便调试
- 按键布局:按照使用频率从高到低排列,+1键放在最顺手位置
5.2 常见问题排查
-
LCD显示乱码:
- 检查对比度电位器调节
- 确认初始化时序正确
- 测试总线连接是否牢固
-
按键不灵敏:
- 检查上拉电阻(10KΩ)是否接好
- 确认软件去抖参数合适
- 测试按键本身是否接触良好
-
计时不准:
- 校准定时器初值
- 检查晶振频率是否准确
- 避免在中断中执行耗时操作
6. 功能扩展建议
在实际使用中,我收集到几个有用的改进建议:
- 增加比分记忆功能:使用EEPROM存储最后比分,断电不丢失
- 添加声音提示:比赛结束、按键操作时给出蜂鸣提示
- 支持多场比赛统计:记录历史比赛数据
- 无线遥控功能:增加红外或蓝牙遥控支持
c复制// EEPROM存储示例(使用STC单片机内置EEPROM)
void SaveScore() {
IAP_CONTR = 0x80; // 开启EEPROM功能
IAP_CMD = 0x01; // 写命令
IAP_ADDRH = 0x00; // 地址高字节
IAP_ADDRL = 0x00; // 地址低字节
IAP_DATA = score_A; // 存储数据
IAP_TRIG = 0x5A; // 触发写入
IAP_TRIG = 0xA5;
IAP_CONTR = 0x00; // 关闭EEPROM
}
这个项目最让我满意的是它的实用性。在本地羽毛球馆已经连续使用了半年多,仅更换过一次电池。很多球友看到后都想要一套,这也促使我不断完善设计。对于想学习单片机实际应用的朋友,这个项目涵盖了GPIO控制、定时器、中断、LCD驱动等基础知识点,是非常好的练手项目。