ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

篮球比赛计时器课设:从24秒倒计时到双时钟状态机设计

篮球比赛计时器课设:从24秒倒计时到双时钟状态机设计 简介篮球比赛计时器课程设计PDF文档围绕数字电路课程设计场景提供从总体思路到单元电路的完整方案。设计涵盖秒脉冲发生器、计数器、译码显示电路、控制电路和报警电路五大模块基于555定时器与74LS192芯片实现12分钟和24秒倒计时、暂停、清零及蜂鸣器报警功能。压缩包内仅含1个PDF文件容量756KB内容包含设计思路、基本原理、具体电路参数与设计图、总装调试及总结附录可直接作为课程报告或答辩参考。已有354人学习下载适合需要快速理解并复现篮球计时器设计的同学参考使用。1. 篮球比赛计时器把 24 秒和 12 分钟分开才算读懂了题目拿到“篮球比赛计时器课程设计”这个题目最容易犯的错是把“24 秒倒计时”当成全部内容写一个递减循环、响一声铃就交差结果漏掉了比赛时钟和暂停逻辑。按 FIBA 规则一套完整的课设至少覆盖两套独立计时每节 10 分钟NBA 为 12 分钟的比赛时钟以及一次进攻 24 秒的进攻时钟。两者共享启动和暂停操作复位逻辑却完全不同——比赛时钟只在节间或裁判停表时归位进攻时钟每次球权转换都要回到 24。硬件上用 555 加 74LS192 计数器软件上用单片机定时器中断是两条都能过验收的路线。这篇把两种方案的接线、状态机、精度参数和验收用例逐一拆开适合正在做课设的人也适合帮别人审电路和程序的人。2. 硬件路线用 555 与 74LS192 搭 24 秒倒计时的接线与级联2.1 为什么课设参考电路里默认是 74LS192 而不是单片机74LS192 是同步双时钟可逆十进制计数器向上用 CPU 引脚向下用 CPD 引脚BCD 输出直接送给 74LS48 译码驱动数码管。课程设计偏爱它的原因很实际每个引脚都有明确的高低电平实验报告里能逐级写出置数、计数、借位的时序老师验收时也容易按图索骥。它的短板同样明显——没有时钟使能端暂停只能靠门控时钟实现这在工程上会带来毛刺问题。如果不想在“暂停”这个功能上跟 555 的输出边沿较劲常见做法是把 74LS192 换成同系列的 74HC190它带 CTEN 计数使能端低电平允许计数高电平保持当前值暂停时不切断时钟通路也就没有边沿被削掉的风险。下面先按 74LS192 讲标准接法因为大多数参考图和实验箱都是这一套。2.2 24 秒置数个位和十位的 BCD 电平怎么接倒计时从 24 开始十位数是 2个位数是 4对应 BCD 码 0010 和 0100。把数据引脚直接接 VCC 或 GND等于在硬件里写死了初始值这也是课设最常见的做法——不需要按键输入预置值上电载入即完成初始化。置数引脚时序PL 低电平载入MR 低电平才允许正常计数二者必须先满足再送时钟。具体顺序是先把 PL 拉低保持 MR 为低数据引脚按表接入后把 PL 拉高之后每个 CPD 上升沿减一。位十进制D3D2D1D0接线十位20010D1 接 VCC其余接地个位40100D2 接 VCC其余接地两片 74LS192 级联时个位的 TCD借位输出低有效接十位的 CPD1Hz 方波从个位 CPD 注入。个位从 0 再减一次时TCD 输出一个低脉冲驱动十位减一于是显示从 24、23、22……一路走到 00。从 24 到 00 共 24 个 1Hz 脉冲这个关系可以直接作为验收时数脉冲的判据。连板子之前我一般会先用脚本把级联逻辑跑一遍对照每个时刻的 BCD 电平避免在面包板上反复拆线def bcd_down_24(preset24, seconds30, holdFalse): ones preset % 10 tens preset // 10 for t in range(seconds): if hold: # 模拟 CTEN 暂停时钟继续走计数器不动 yield t, tens, ones continue if ones 0: ones - 1 else: ones 9 # 个位借位回 9同时十位减 1 tens tens - 1 if tens 0 else 0 yield t, tens, ones for t, ten, one in bcd_down_24(holdFalse): if t 20: print(f{t:02d}s 十位BCD{ten:04b} 个位BCD{one:04b})这段脚本模拟的是“个位减到 0 后从 9 重新计数同时向十位借位”的波形和 74LS192 的 TCD 级联行为一致。hold 参数对应 74HC190 的 CTEN 暂停改动后可以在没拿到芯片前先验证控制逻辑是否正确。2.3 暂停、复位和到时响铃的三条支路暂停的教科书接法是用一个与门把 1Hz 时钟和 RUN 信号相与按键按下 RUN0时钟被挡住。这个接法在低速时钟下能用但存在边沿不完整的问题——与门在任意相位切断时钟可能切出半个高电平计数器在上升沿触发的边界上有时会误动作。更稳的替代方案就是前面说的 74HC190CTEN 内部是同步逻辑只在时钟上升沿采样使能不产生毛刺这也是答辩时能讲清楚“同步使能 vs 门控时钟”的加分点。复位到 24 有两种做法一是 MR 拉高清零后再做一次 PL 载入二是直接再次拉低 PL 重新装载 24。注意 MR 清零的优先级高于 PL 载入两个动作要分开不能同时有效否则数据引脚的电平状态会被清零逻辑覆盖。到零响铃不能直接接 TCD。TCD 是一个周期宽度的低脉冲蜂鸣器只会“嘟”一下。需要响到人工复位的话把两片的 8 个输出端送入 74HC308 输入与非门做零值检测全 0 时输出高电平锁存后驱动蜂鸣器。锁存器要留一个手动清除端否则响铃停不下来。3. 单片机路线用 STM32 定时器实现比赛时钟与进攻时钟双倒计时3.1 状态机为什么 game 和 shot 不能合用一个变量很多人写单片机版本时只做一个down_seconds--按下暂停就一起停松开一起走。实际比赛逻辑里进攻时钟和比赛时钟的生命周期不同一次传球失误、抢到前场篮板、投篮碰筐进攻时钟都要立刻回到 24而比赛时钟只有在裁判吹停、节间休息或进球后的特定时段才停。把两个变量混在一个计数器里后面调度逻辑会越改越乱。我用一个四态枚举状态机来管理两个独立计数器状态进入条件比赛时钟进攻时钟RESET上电 / 按复位键显示 10:00不走显示 24不走RUN按启动键每秒减一每秒减一PAUSE暂停键 / 24 秒违例冻结冻结GAME_END比赛时钟到 0显示 0:00长鸣保持当前值状态迁移集中在按键处理函数里中断里只做“递减”这一件事不在中断里改状态这是避免按键响应丢失的关键。3.2 在 SysTick 里递减阈值取 1000 而不是 999STM32 上我用 SysTick 产生 1ms 中断SysTick_Config(SystemCoreClock / 1000)在 72MHz 主频下等价于 71999 个时钟周期中断一次。两个计数器各维护一个cnt_game和cnt_shot累加到 1000 才减一秒。注意判断用 1000而不是 1000防止极端情况下漏掉一次重装导致倒计时卡住。typedef enum { SYS_RESET 0, SYS_RUN, SYS_PAUSE, SYS_GAME_END } sys_state_t; volatile sys_state_t state SYS_RESET; volatile uint16_t game_min 10, game_sec 0; /* 比赛时钟 */ volatile uint8_t shot_sec 24; /* 进攻时钟 */ volatile uint8_t shot_fault 0; /* 24 秒违例标志 */ void SysTick_Handler(void) { static uint16_t cnt_game 0, cnt_shot 0; if (state ! SYS_RUN) return; /* PAUSE 状态下两个时钟同时冻结 */ if (cnt_game 1000) { cnt_game 0; if (game_sec 0) { if (game_min 0) { state SYS_GAME_END; /* 全场结束只允许复位键 */ buzzer_on(3); return; } game_min--; game_sec 59; } else { game_sec--; } } if (cnt_shot 1000) { cnt_shot 0; if (shot_sec 0) shot_sec--; if (shot_sec 0) { /* 24 秒违例停表并响一声 */ state SYS_PAUSE; shot_fault 1; buzzer_on(1); } } }这段代码里两个计数器各自独立累加一秒时刻到达点由各自的阈值决定即使中断函数体的执行时间略有抖动也不会互相牵制。return放在状态判断之后保证 PAUSE 时cnt挂起、恢复 RUN 时从暂停前的余数继续不会出现恢复后跳一秒的现象。3.3 按键采样和 2ms 位扫描防抖不能放中断里按键我放在主循环里做用一个两比特的移位寄存器记录最近两次 5ms 采样结果连续两次读到低电平才认为是有效按下再配合下降沿判断保证按一次只触发一次动作。uint8_t key_debounce(GPIO_TypeDef *port, uint16_t pin, uint8_t *hist) { uint8_t cur (HAL_GPIO_ReadPin(port, pin) GPIO_PIN_RESET) ? 1 : 0; *hist (*hist 1) | cur; return (*hist 0x03); /* 连续两次 5ms 采样均为按下 */ }HAL_Delay 会阻塞 CPU所以 5ms 的时间基准不靠延时循环而是读ms_tick做差值判断主循环空闲时再执行显示扫描。显示扫描的推荐顺序是“先关所有段再切位选最后送段码”这个顺序能避免换位瞬间旧位残影串到新一位上。参数STM32F103 配置说明SysTick 周期1msSysTick_Config(71999)位扫描周期2ms/位4 位循环为 8ms刷新率 125Hz按键采样间隔5ms移位寄存器连续确认 2 次如果换成 51 单片机T0 工作在模式 1 的 16 位定时器时初值是向上计数的差值。12MHz 晶振下 50ms 中断对应初值 0x3CB065536 - 5000011.0592MHz 下是 0x4C0065536 - 46080各累计 20 次得到 1 秒。两个值我都用过直接贴进 TH0/TL0 即可不用自己再换算一次。4. 倒计时精度、动态扫描与按键防抖的三个必调参数4.1 时基误差555 的 RC 计算和晶体分频怎么选555 多谐振荡器的频率公式是 f 1.44 / ((R1 2R2) × C)。要得到 1Hz取 R1 1kΩ、C 10µF则 R1 2R2 144kΩR2 约 71.5kΩ。这个计算值很理想但课程设计里常见的坑是电解电容容差高达 ±20%加上 5% 精度的电阻周期误差轻松超过 5%一场 10 分钟的比赛对表误差能到 30 秒以上。所以 555 方案必须留出微调R2 用 100kΩ 电位器串联 10kΩ 固定电阻频率计接 CPD 引脚调电位器直到周期显示 1.000s。方案器件10 分钟理论误差适合场景RC 振荡555 电容电阻±1% 起温漂明显课设验收允许手动微调晶体分频32.768kHz CD406020ppm 约 12ms想讲“为什么更准”的加分项MCU 定时器SysTick/T0晶振 20~50ppm软件方案标配CD4060 是 14 级二进制分频器32768 / 2^15 1Hz输出直接替代 555。它的优势是误差来源只有晶振本身不需要电位器缺点是晶振起振电路在面包板上偶尔不稳定布线时晶振两根引脚要短接细线这在答辩里也能解释得通。4.2 动态扫描刷新率必须压过视觉残留阈值四位数码管动态扫描每位停留 2ms一轮就是 8ms等效刷新率 125Hz。人眼对 50Hz 以下的闪烁敏感125Hz 绰绰有余但这个指标在课设里被反复扣分的原因是段选电流不够。位选是 1/4 占空比要保持和静态显示一样的平均亮度峰值段电流需要提高到静态的 4 倍。用 74HC573 驱动段码时限流电阻我一般取 220~330Ω取值偏大则后两位明显偏暗。参数推荐值判断依据每位停留1~2ms4 位循环 4~8ms刷新率≥ 100Hz低于 50Hz 可用肉眼看到闪烁段限流电阻220~330Ω补偿 1/4 占空比下平均电流不足验证方法很直接用手机慢动作视频对着数码管录如果看到每位数轮流暗一下说明刷新率不够或停留时间不均匀。注意不能用延时函数做扫描停靠否则按键采样会被拖慢两个功能会互相干扰。4.3 按键防抖5ms 采样、连续两次确认机械按键抖动集中在按下和释放的瞬间典型抖动宽度 5~20ms。我的参数组合是 5ms 采样一次、连续两次相同电平才判定有效等效消抖窗口 10ms实测误触发率很低。如果换用 20ms 单次延时消抖会带来两个问题按键响应变迟钝且 HAL_Delay 期间扫描和显示全部停摆。在这个设计里24 秒复位键我特意不处理长按连击。有些键盘矩阵需要连发但篮球计时器的复位键一旦长按连发会出现“复位后立刻又走了一秒”的观感评委如果手快连点反而暴露状态机漏洞。只保留下降沿触发一次是最稳的。4.4 蜂鸣器驱动与响铃时长控制单片机 IO 直接推有源蜂鸣器通常不够课设里常见加一个 9013 三极管基极串 1kΩ 电阻蜂鸣器接在集电极。若是电磁式蜂鸣器线圈两端要反向并联 1N4148 吸收关断时的反电动势否则每次响铃都可能把引脚打坏。响铃时长我在 1ms 中断里用递减计数器控制短鸣 300ms、长鸣 900ms互不阻塞uint8_t beep_left 0; /* 剩余响声次数 */ uint16_t beep_ms 0; /* 当前响声计时 */ void buzzer_on(uint8_t times) { beep_left times; beep_ms 0; HAL_GPIO_WritePin(BUZZ_PORT, BUZZ_PIN, GPIO_PIN_SET); } /* 在 SysTick_Handler 尾部追加 */ if (beep_left 0 beep_ms 300) { beep_ms 0; HAL_GPIO_TogglePin(BUZZ_PORT, BUZZ_PIN); if (HAL_GPIO_ReadPin(BUZZ_PORT, BUZZ_PIN) GPIO_PIN_RESET) { beep_left--; } }这里 300ms 到点就取反响 300ms、停 300ms直到次数耗尽。把时长阈值拆成全局宏答辩时调整参数只看一个地方比散落在中断里好维护得多。5. 课程设计验收用边界用例和“对表”把计时器交出去5.1 五条用例覆盖双时钟联动验收前先按下面这张表跑一遍任何一条不通过都说明状态机或接线有漏洞编号操作预期结果失败时先查1上电显示 10:00 和 24不走表复位电平、PL 载入时序2按启动等 90 秒比赛 9:58进攻 22同步递减两路计数阈值是否独立3进攻到 0短鸣一次比赛时钟冻结shot_fault 后的状态切换4暂停 10 秒恢复秒数无跳变不丢秒cnt 是否在 PAUSE 时挂起5比赛到 0长鸣三声按启动无效GAME_END 分支优先级第 3 条最容易出问题。24 秒违例后如果代码把状态直接切回 RUN比赛时钟会立即继续走和规则不符。正确行为是违例后进入 PAUSE等裁判确认球权后再按启动恢复进攻时钟同时回到 24。5.2 对表方法频率计加手机秒表硬件方案用频率计或示波器测 CPD 引脚周期应为 1.000s允许 ±5ms 摆动。软件方案直接用手机秒表做整场对比从比赛时钟 10:00 走到 0:00全程应耗时 600 秒误差控制在 ±1 秒内。注意暂停时间要排除在外——先按暂停 10 秒再恢复最终总耗时应为 590 秒这是验证“暂停不丢秒”最直观的量化手段。5.3 答辩三问准备三个高频问题提前想好答案。第一问“为什么用 74HC190 而参考图是 74LS192”答同步 CTEN 使能、门控时钟会产生边沿毛刺。第二问“555 误差多少”直接报数据RC 容差导致周期偏差 5%10 分钟偏 30 秒所以加了电位器微调。第三问“掉电后时间要不要保存”课设范围不需要但可以答用 STM32 内部 RTC 或外接 EEPROM 扩展这是最有讨论空间的功能延伸。最后留一个可做的进阶点进攻时钟最后 5 秒按 0.1 秒精度显示是职业比赛的真实需求把cnt_shot的阈值从 1000 改成 100单独给个位增加一个只在高位扫描结束后再扫一次的 0.1 秒位段码亮度保持一致用的是第 4 节里 2ms 位停留时间的同一套参数。本文还有配套的精品资源点击获取
返回列表