用51单片机和Proteus仿真,我给自己做了个篮球比赛计分器(附完整代码和电路图)

张开发
2026/5/31 6:00:35 15 分钟阅读
用51单片机和Proteus仿真,我给自己做了个篮球比赛计分器(附完整代码和电路图)
从零打造篮球计分器51单片机实战全记录项目缘起一场业余篮球赛的灵感闪现去年夏天参加社区篮球赛时我发现计分员总是手忙脚乱——既要操作老旧的机械计分牌又要兼顾24秒计时器几次争议判罚都源于计时误差。作为电子工程专业学生我萌生了自己制作智能计分器的想法。这个项目完美结合了我的两大爱好篮球和电子制作。经过两周的密集开发最终完成的设备不仅具备专业级功能成本还不到200元。下面将完整分享我的开发历程特别会重点讲解那些让我熬夜调试的坑点。1. 硬件架构设计与元件选型1.1 核心控制器选择在微控制器选型上我对比了三种方案型号价格开发难度外设支持最终选择STM32F103¥35较高丰富×Arduino Uno¥65简单一般×STC89C52¥12中等够用√选择STC89C52主要基于三点考虑完全满足计时、显示控制需求学校实验室有大量现成开发资源成本优势明显烧写器也只需¥151.2 显示模块的取舍LCD1602虽然分辨率有限但优势非常明显对比度高阳光下可视性好接口简单4位模式只需6个IO社区驱动资料丰富实际测试时发现一个重要细节普通1602视角较窄最终选用了宽视角型号额外花费¥5确保裁判席和观众都能看清。1.3 蜂鸣器报警方案考虑到比赛环境噪音我采用了两种提示方式组合无源蜂鸣器频率2KHz用于常规提示高分贝有源蜂鸣器85dB用于终场报警// 蜂鸣器控制引脚定义 sbit Buzzer P3^0; // 无源蜂鸣器 sbit Alarm P3^1; // 有源报警器2. Proteus仿真中的关键调试2.1 计时精度校准初始仿真发现计时误差达每分钟快3秒问题出在未考虑代码执行时间定时器中断配置不当修正方案void Timer0_Init() { TMOD 0xF0; // 设置定时器模式 TMOD | 0x01; // 16位定时器 TH0 0x3C; // 50ms定时初值 TL0 0xB0; ET0 1; // 允许定时器中断 TR0 1; // 启动定时器 } void Timer0_ISR() interrupt 1 { static unsigned int count 0; TH0 0x3C; // 重装初值 TL0 0xB0; if(count 20) { // 1秒到达 count 0; if(Start_flag) second--; } }2.2 按键防抖的实战方案原始代码使用简单延时防抖在实际测试中发现会导致系统响应迟钝。改进后的混合防抖策略硬件层面所有按键并联104电容上拉电阻改用4.7KΩ软件优化unsigned char Key_Scan() { static unsigned char key_state 0; unsigned char key_press P1 0x0F; switch(key_state) { case 0: // 等待按下 if(key_press ! 0x0F) { DelayMs(10); // 延时去抖 key_state 1; } break; case 1: // 确认按下 if(key_press ! 0x0F) { key_state 2; return key_press; } else { key_state 0; } break; case 2: // 等待释放 if(key_press 0x0F) { DelayMs(10); key_state 0; } break; } return 0; }3. 核心功能代码解析3.1 比分交换逻辑实现比赛半场需要交换比分显示位置我采用标志位控制法unsigned char T_biy 0; // 0-未交换 1-已交换 void Display_Score() { if(T_biy 0) { LCD_Write_Str(1,0,HOM); LCD_Write_Char(5,0,Score_A[0]); //...A队分数显示代码 } else { LCD_Write_Str(1,0,AWY); LCD_Write_Char(5,0,Score_B[0]); //...B队分数显示代码 } }3.2 24秒违例处理流程这是最复杂的逻辑模块需要处理独立倒计时违例报警比赛暂停/继续void Handle_24Sec() { if(rule_time 0 rule_flag) { TR0 0; // 暂停主计时 Beep_flag_24 1; while(Beep_flag_24) { Alarm ~Alarm; // 触发报警 DelayMs(200); if(Key_Scan() RESET_24_KEY) { Beep_flag_24 0; rule_time 24; } } TR0 1; // 恢复比赛 } }4. 实物制作与现场测试4.1 PCB布局经验第一版电路出现显示干扰总结出以下布线原则蜂鸣器驱动线远离LCD数据线晶振尽量靠近单片机电源入口加装100μF电解电容最终采用的元件布局单片机居中放置LCD接口位于板子上缘按键集中右侧蜂鸣器单独左下角4.2 现场遇到的意外问题首次实战使用时发现两个关键问题阳光直射导致LCD对比度下降解决方案增加遮光罩误触导致比分被修改增加管理员锁定模式if(Key_Scan() LOCK_KEY press_time 2) { Lock_flag ~Lock_flag; Beep 0; DelayMs(50); Beep 1; }这个项目最大的收获不是做出了可用的设备而是在解决实际问题过程中将课本知识转化为了实战能力。特别是计时精度调试过程让我对单片机时序控制有了更深理解。下一步计划增加无线模块实现远程计分控制。

更多文章