针对你的蓝桥杯 51 单片机大模板,我将分三个层次为你深度拆解这些变量的作用、时间的意义以及中断的底层逻辑。
1. 按键三剑客:Key_Val, Key_Down, Key_Old
这三个变量构成了**“状态机按键扫描”**的核心,它们的作用是让单片机能够精准捕捉你“按下”的那一瞬间。
-
Key_Val(当前值):-
作用:实时记录按键被扫描到的状态。
-
比喻:就像照相机的“快门实时画面”,记录这一刻谁按下了。
-
-
Key_Old(旧值):-
作用:存储“上一次”扫描时的按键状态。
-
比喻:就像相册里的“上一张照片”。
-
-
Key_Down(下降沿/动作触发):-
作用:这是最重要的变量。通过公式
Key_Val & (Key_Val ^ Key_Old)计算得出。 -
逻辑拆解:
-
Key_Val ^ Key_Old:找出当前和上次“不一样”的按键(只要状态变了,无论是按下还是松开,这里都会变成 1)。 -
& Key_Val:进一步筛选,只有“现在是按下状态”且“刚才不是”的情况才成立。
-
-
意义:它只在按键**按下的那一秒(那一毫秒)**有效。这防止了你按住按键不动时,程序疯狂执行加号或切换功能。
-
2. 减速变量:为什么是 10ms、500ms 和 6ms?
在单片机世界里,CPU 跑得极快,而人类的肉眼和手指动作极慢。这些变量是用来**“对齐”**人和机器的速度。
-
Key_Slow_Down == 10(10ms 扫描一次):-
意义:消抖(Debounce)。
-
逻辑:机械按键在按下时会有几毫秒的金属弹跳震动。如果 1ms 扫描一次,单片机会以为你按了十几次。每 10ms 扫描一次,刚好跨过了震动期,确保读取的数据是稳定的。
-
-
Sey_Slow_Down == 500(500ms 刷新一次逻辑):-
意义:控制人类观察速度。
-
逻辑:如果你的数码管数值变化(比如时钟秒数)每 1ms 就变一次,你的眼睛根本看不清。500ms(半秒)是常用的逻辑刷新周期,比如让闹钟的小数点半秒闪烁一次,符合人类视觉习惯。
-
-
Seg_Pos == 6(每 1ms 换一位,6ms 一个循环):-
意义:利用视觉暂留(Persistence of Vision)。
-
逻辑:数码管是“动态扫描”的,同一时间其实只有一位在亮。如果你扫描太慢(比如每 100ms 换一位),你会看到数码管在“跳动”;如果你扫描太快(低于 1ms),数码管亮度会不足。每 1ms 换一位,6 位数码管在 6ms 内全部轮流亮一遍,人类肉眼会觉得 6 位数码管是“常亮”的。
-
3. 中断的底层逻辑:到底发生了什么?
“中断”是单片机最高级、最霸道的机制。依照你的 Timer0Server 模板,我们可以这样理解:
A. 它是“闹钟”而不是“死循环”
在 main 函数的 while(1) 里,CPU 像个勤劳的工人在跑圈(按键、数码管逻辑、LED)。
但是,while(1) 里面的代码跑一圈的时间是不确定的。如果你在里面写了复杂的计算,时间就会变慢。
B. 强制剥夺权(底层运行步骤):
-
计时启动:你设置了
TH0和TL0,定时器 0 就像一个自动计数的漏斗。 -
溢出触发:当漏斗滴满 1ms 时,硬件会直接向 CPU 发出信号:“时间到了,停下你手里的活!”
-
保护现场:CPU 立即保存当前
main函数运行到哪一行了,把数据存进堆栈。 -
执行中断:CPU 跳到
Timer0Server() interrupt 1这段代码里。-
它重新装填漏斗(
TH0,TL0)。 -
它处理最紧急的活:刷新数码管位码(
Seg_Disp)。注意:这就是为什么数码管不闪烁的原因,因为无论主程序多卡,刷新数码管永远是每 1ms 准时发生。 -
它给各个减速计数器加 1(
Key_Slow_Down++等)。
-
-
恢复现场:执行完中断里的代码,CPU 回到刚才
main函数被打断的地方继续跑。
C. 为什么你的模板要这么写?
在蓝桥杯比赛中,主程序处理“逻辑”,中断处理“节拍”。
-
中断(心跳):负责最准时、最机械的工作(刷新数码管、计时)。
-
主程序(大脑):负责思考(按键按下了该怎么办?闹钟时间到了吗?)。
这种写法保证了:即便你的主程序因为写了复杂的逻辑变得有点卡顿,你的时间显示依然是准的,数码管依然是亮的。这就是这个“大模板”能够拿高分的底层精髓。
共阴极晶体管段选的顺序
1. 硬件物理顺序:ABCDEFG-DP
数码管由 8 个 LED 组成,它们在硬件内部的排列是固定的。当你观察一个 8 字数码管时,段的分布如下:
-
a段:最上面那一横。
-
b段:右上角那一竖。
-
c段:右下角那一竖。
-
d段:最下面那一横。
-
e段:左下角那一竖。
-
f段:左上角那一竖。
-
g段:中间那一横。
-
dp段:右下角的小圆点。