用STM32F103C8T6和红外遥控DIY一个篮球记分器(附完整代码和PCB)
基于STM32F103C8T6的红外遥控篮球记分器开发实战篮球比赛中的记分工作看似简单但传统手动翻牌记分方式存在操作繁琐、易出错等问题。本文将带你从零开始用STM32F103C8T6单片机和红外遥控技术打造一个智能篮球记分系统。不同于市面上现成的解决方案这个DIY项目不仅能满足基础记分需求还具备比赛时间控制、24秒违例判定等专业功能全部成本控制在百元以内。1. 硬件选型与设计思路1.1 核心控制器选择STM32F103C8T6作为本项目的核心控制器其优势主要体现在三个方面性价比突出Cortex-M3内核72MHz主频20KB SRAM64KB Flash的存储配置完全满足记分器需求开发便捷丰富的GPIO接口和内置定时器简化了红外解码和计时功能实现生态完善STM32CubeMX工具可快速生成初始化代码降低开发门槛提示市面上常见的蓝板核心板通常已内置稳压电路和基础外设建议优先选用可节省PCB设计工作量。1.2 显示方案对比我们测试了三种常见显示方案显示类型分辨率接口方式功耗可视角度成本LCD160216x2字符并行/4线中窄低0.96寸OLED128x64像素I2C低广中TFT彩屏240x320像素SPI高广高最终选择0.96寸OLED的原因在于I2C接口仅需2个IO口SCL/SDA自发光特性在室外仍有较好可视性支持自定义图形显示可绘制比分牌等专业界面1.3 输入方案设计传统矩阵键盘需要占用多个IO口而红外遥控方案具有明显优势// 红外接收硬件连接示例 #define IR_RECEIVE_PIN GPIO_Pin_9 #define IR_PORT GPIOB仅需1个IO口即可实现21个按键功能典型电路连接如下红外接收模块VCC接3.3VGND接地OUT接PB9TIM4_CH4用于输入捕获2. 关键功能实现2.1 精准计时系统比赛计时需要同时处理三个时间维度全场时间12分钟/节24秒进攻时限0.01秒精度的显示更新// 定时器3配置10ms中断 void TIM3_Int_Init(u16 arr, u16 psc) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); TIM_TimeBaseStructure.TIM_Period arr; TIM_TimeBaseStructure.TIM_Prescaler psc; TIM_TimeBaseStructure.TIM_CounterMode TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, TIM_TimeBaseStructure); TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); TIM_Cmd(TIM3, ENABLE); }中断服务程序中实现的多级计时逻辑void TIM3_IRQHandler(void) { if (TIM_GetITStatus(TIM3, TIM_IT_Update) ! RESET) { ms--; // 10ms计数 if(ms 1) { ms 100; second--; if(second 0) { second 59; minute--; } } // 24秒计时独立处理 mss--; if(mss 1) { mss 100; count--; if(count 0) count 0; } TIM_ClearITPendingBit(TIM3, TIM_IT_Update); } }2.2 红外遥控解码优化常见红外协议解码存在按键连发问题我们通过状态机机制改进u8 Remote_Scan(void) { u8 sta 0; if(RmtSta (16)) { // 完整帧接收标志 // 校验地址码和反码 if((RmtRec24) (u8)~(RmtRec16) (RmtRec24)REMOTE_ID) { u8 key_code RmtRec8; if(key_code (u8)~RmtRec) sta key_code; } // 防止重复触发 if((sta0) || ((RmtSta0X80)0)) { RmtSta ~(16); RmtCnt 0; } } return sta; }典型按键处理逻辑case 194: // 开始/暂停键 ID; if(ID 3) ID 1; if(ID 1) { // 开始 TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); TIM_Cmd(TIM3, ENABLE); } else { // 暂停 TIM_ITConfig(TIM3,TIM_IT_Update,DISABLE); TIM_Cmd(TIM3, DISABLE); } break;2.3 OLED动态显示实现显示层采用模块化设计各功能区域独立刷新void LCD_Display_Update(void) { OLED_ClearBuffer(); // 1. 球队名称显示 if(change 0) Show_Team_A_First(); else Show_Team_B_First(); // 2. 比分显示 OLED_ShowNum(8, 18, score1, 3, 24, 1); OLED_ShowNum(87, 18, score2, 3, 24, 1); // 3. 时间显示 OLED_ShowNum(20, 40, minute, 2, 24, 1); OLED_ShowString(43, 39, :, 24, 1); OLED_ShowNum(56, 40, second, 2, 24, 1); // 4. 24秒倒计时 OLED_DrawCircle(64, 28, 12); OLED_ShowNum(56, 20, count, 2, 16, 1); OLED_Refresh(); }3. PCB设计与焊接要点3.1 电路设计规范采用双层板设计时需注意电源走线主电源线宽≥0.5mm过孔数量≤3个信号隔离红外接收信号线远离时钟线去耦电容每个IC的VCC附近放置100nF陶瓷电容典型原理图节点STM32F103C8T6 OLED PB6 ------ SCL PB7 ------ SDA PB9 ------ IR_OUT3.2 焊接工艺建议针对常见焊接问题我们总结以下经验温度控制无铅焊锡300-320℃含铅焊锡280-300℃焊接顺序先焊高度最低的元件电阻、电容再焊连接器、晶振等最后焊接STM32芯片检查要点用放大镜检查QFN封装芯片的焊盘测量3.3V对地电阻正常应100Ω红外接收器引脚间不得有桥接4. 系统调试与优化4.1 常见问题排查开发过程中遇到的典型问题及解决方案现象可能原因解决方法OLED不显示I2C地址错误确认0x3C或0x3D按键无响应红外接收器极性接反检查VCC/GND时间不准定时器分频计算错误重新计算TIM_Prescaler显示残影未清显存直接刷新增加OLED_ClearBuffer()4.2 性能优化技巧通过以下改进可提升系统响应速度中断优化NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 0; // 定时器中断最高优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority 0;显示刷新策略仅更新变化区域比分、时间等使用局部刷新函数替代全屏刷新电源管理// 进入低功耗模式 void Enter_LowPower(void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI); }5. 功能扩展思路基础功能实现后可考虑以下增强功能无线数据传输通过HC-05蓝牙模块同步比分到手机使用ESP8266实现网络直播功能语音播报结合SYN6288芯片实现得分语音提示24秒违例倒计时提醒数据记录利用STM32内部Flash存储历史比赛数据通过USB导出CSV格式比赛记录// Flash写入示例 void FLASH_WriteData(uint32_t addr, uint16_t *data, uint16_t len) { FLASH_Unlock(); FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR); FLASH_ErasePage(addr); for(uint16_t i0; ilen; i) { FLASH_ProgramHalfWord(addri*2, data[i]); } FLASH_Lock(); }实际开发中发现红外遥控在强光环境下可能出现响应延迟这时可考虑改用2.4G无线方案但会相应增加成本和复杂度。对于校园联赛等应用场景当前的红外方案已经能够满足绝大多数使用需求。