引言
上一篇分享了分立元件逻辑门模块。今天分享的是另一个核心模块:可视化数制模块。但是,这个模块有点特殊。它由一颗 STC8G1K08 单片机和数码管、LED组成。它一方面用来做‘数制转换’的硬件演示;另一方面,它预留了完整的输入、输出、显示元件或模块以及烧录接口,可以作为一个单片机入门平台,由你自己写代码去定义它的功能。所以,我把它分为两部分发出来。
第一部分:很多初学者搞不懂二进制和16进制的转换,用几个LED加数码管,看一眼就明白了。
实验九:数制可视化教学模块
一、实验目的
1、理解二进制、十进制、十六进制、八进制四种数制的表示方法。
2、理解二进制、十进制、十六进制、八进制四种数制的计数规则。
3、掌握“逢十进一”、“逢二进一”、“逢十六进一”、“逢八进一”的实际含义。
4、观察“满2进1”、“满8进1”、“满10进1”、“满16进1”的进位过程。
5、掌握“位权”的概念——每一位的位权是多少。
6、学会不同进制之间的相互转换。
7、能够通过指示灯和数码管直观读出同一数值的不同进制表示。
8、了解单片机I/O口驱动LED和数码管的基本方法。进阶实验,不要求掌握。
二、硬件说明
1、元件清单
位号 名称 参数 数量 功能
U10 单片机 STC8G1K08A(TSSOP-20) 1 主控芯片
NUM1 两位共阴数码管 2281AS(0.28英寸) 1 显示数值
LED4~LED8 贴片LED(红色) 0805封装 5 二进制显示
LED9 贴片LED(蓝色) 0805封装 1 数制指示
LED10 贴片LED(绿色) 0805封装 1 数制指示
R35~41 贴片电阻 470Ω/0805 7 LED限流
R44、45 贴片电阻 470Ω/0805 2 LED限流
R42、43 贴片电阻 10kΩ/0805 2 按键上拉
AN4 轻触按键 6×6×5mm 1 +1 / 长按清零
AN5 轻触按键 6×6×5mm 1 -1 /长按3s设置数制
CN2 烧录接口 2.54mm 4P排针 1 程序烧录
J21 、22 跳线帽 2.54mm 2P 2 烧录隔离(烧录时断开)
J17、19 跳线帽 2.54mm 2P 2 选择是否使用LED
J18、20 跳线帽 2.54mm 2P 2 选择是否使用输出模块
2、引脚定义表
引脚号 引脚名 连接对象 功能说明
1 P1.2 LED4 二进制最低位(位权1)
2 P1.3 LED5 二进制位权2
3 P1.4 LED6 二进制位权4
4 P1.5 LED7 二进制位权8
5 P1.6 LED8 二进制最高位(位权16)
6 P1.7 LED9(蓝色) 数制指示(见模式表)
7 P5.4 LED10(绿色) 数制指示(见模式表)
8 VCC +5V 电源正
9 P5.5 AN4 +1 / 长按清零
10 GND 地 电源负
11 P3.0/RxD AN5 -1 / 长按3s进入设置
12 P3.1/TxD 数码管个位阴极 位选1(个位)
13 P3.2 数码管e段 段选
14 P3.3 数码管d段 段选
15 P3.4 数码管c段 段选
16 P3.5 数码管g段 段选
17 P3.6 数码管a段 段选
18 P3.7 数码管b段 段选
19 P1.0 数码管f段 段选
20 P1.1 数码管十位阴极 位选2(十位)
3、表示二进制的LED板面布局(丝印从上到下)
│ ● LED4 位权 1 (最上面,最低位) │
│ ● LED5 位权 2 │
│ ● LED6 位权 4 │
│ ● LED7 位权 8 │
│ ● LED8 位权 16 (最高位) │
│ │
│ ● LED9 蓝色 数制指示 │
│ ● LED10 绿色 数制指示 (最下面) │
4、数制模式指示表
模式 LED9(蓝) LED10(绿) 说明
十进制 亮 灭 数码管显示十进制(00~31)
十六进制 灭 亮 数码管显示十六进制(00~1F)
八进制 亮 亮 数码管显示八进制(00~37)
注: 正常显示时不存在“两者均灭”状态。进入设置模式时LED9/LED10状态会变化一次作为提示。
5、按键功能表
按键 短按 长按
AN4 数值 +1(0→1→2→...→31→0→1...循环) 清零(数值归0)
AN5 数值 -1(0→31→30→...→0→31...循环) 长按3s进入数制设置模式
6、设置模式说明
进入设置模式: 长按AN5约3秒,LED9/LED10状态变化一次(如绿亮蓝灭→蓝灭蓝绿亮),表示已进入数制设置状态。
设置操作: 在设置模式下,短按AN5 循环切换数制(十进制→十六进制→八进制→十进制...),LED9/LED10同步变化指示当前选择的数制。
退出设置模式(两种方式):
按一次AN4 → LED9/LED10同时闪烁两次 → 退出设置模式,返回正常显示
5秒内无任何按键操作 → 自动退出 → LED9/LED10同时闪烁两次
退出后: 数值保持不变,按新选择的数制显示。
7进位闪烁机制
当数值发生进位时(如二进制 01→10、十进制 09→10、十六进制 0F→10、八进制 07→10),进位位先闪烁3次,再常亮,以强化对“进位事件”的感知。
闪烁周期: 亮150ms → 灭150ms → 亮150ms → 灭150ms → 亮150ms → 灭150ms → 常亮
总时长: 约0.9秒
目的: 明确区分“进位事件发生”与“进位后的稳定状态”。
三、核心概念:满N进1
1、基数与进位
所有进制的本质都是“数到N就进位”,N就是这个进制的“基数”。
进制 基数 可用数字 进位条件
二进制 2 0, 1 满2进1
八进制 8 0~7 满8进1
十进制 10 0~9 满10进1
十六进制 16 0~9, A~F 满16进1
2、每一位的“位权”
从右往左数第 n 位(从0开始计数)的位权为 基数n-1。
位序 位权公式 二进制 十进制 八进制 十六进制
第0位 基数n-1 1 1 1 1
第1位 基数n-1 2 10 8 16
第2位 基数n-1 4 100 64 256
第3位 基数n-1 8 1000 512 4096
第4位 基数n-1 16 10000 4096 65536
3、2进制与10进制在本模块中“进位”的具体举例:
十进制显示用数码管显示数字,一个按键每按一次表示+1,可以看见每按
一次按键AN4即+1时显示的数字也跟着变化,当由9加到10时一位数变成了
两位数,显示10,此时是因为加到了十才进位变成10,也就是“逢十进一”,
本来是一位数,当加到10后产生了进位,个位数变成了0而十位数变成了1,也
就是10,此处的“10”读作“十”。二进制也同样,用5个指示灯且从上到下分
别代表最低位到最高位,灯灭表示0,亮表示1,同样按一次按键表示+1,当按下
第一次按键,即由0加到1时最低位指示灯亮,再按一次按键,即由1加到2时
类比于十进制的“逢十进一”,现在是二进制所以应该“逢二进一”,与十进制相
同此时应该由一位数变成两位数,数码管应该显示“10”,此处读作“一零”(2进制数码管不显示),当然,你也可以读作2,但通常不会这么读(在多位数时非常繁琐)。而指示灯也变成了最上的一位灭(0),从上到下第二位亮(1),与数码管应该显示的“10”一致。
四、实验步骤
确保J18、J20跳线帽已拔掉!J17、J19、J21、J22跳线帽已插上。
实验9-1:二进制进位观察
目的: 观察“满2进1”的进位过程。
操作:
上电后,按AN5将数制切换到十进制(LED9蓝亮、LED10灭),数值从0开始。
连续短按AN4,数值逐步增加,观察LED4~8的变化。
记录二进制LED状态。
记录表:
数值 LED4(1) LED5(2) LED6(4) LED7(8) LED8(16) 二进制表示
0 灭 灭 灭 灭 灭 00000
1 亮 灭 灭 灭 灭 00001
2 灭 亮 灭 灭 灭 00010(满2进1!)
3 亮 亮 灭 灭 灭 00011
4 灭 灭 亮 灭 灭 00100
...
31 亮 亮 亮 亮 亮 11111
思考: 从1→2时,哪个LED灭了?哪个LED亮了?这说明了什么?
实验9-2:十进制进位观察
目的: 观察“09→10”时十位的变化过程。
操作:
按AN5切换到十进制(LED9亮、LED10灭)。
从0开始逐次增加,观察数码管变化。
重点关注 9→10 的时刻。
观察记录:
数值 数码管显示 个位 十位 二进制LED
7 07 7 0 00111
8 08 8 0 01000
9 09 9 0 01001
10 10(满10进1!) 0 1 01010
11 11 1 1 01011
思考: 从9→10时,个位和十位分别发生了什么变化?进位位闪烁了几次?
实验9-3:十六进制进位观察
目的: 观察“0F→10”时十位的变化,理解十六进制的“A~F”表示。
10=A, 11=B, 12=C, 13=D, 14=E, 15=F。
操作:
按AN5切换到十六进制(LED9灭、LED10亮)。
从0开始逐次增加,观察数码管变化。
重点关注 9→A→B→C→D→E→F→10 的完整过程。
十六进制显示对照:
数值 数码管显示 数值 数码管显示
9 09 14(E) 0E
10(A) 0A 15(F) 0F
11(B) 0B 16(10) 10(满16进1!)
12(C) 0C 17(11) 11
13(D) 0D ... ...
思考: 为什么十六进制需要A~F这6个字母?
实验9-4:八进制进位观察
目的: 观察“07→10”时十位的变化,理解八进制的“满8进1”。
操作:
按AN5切换到八进制(LED9亮、LED10亮)。
从0开始逐次增加,观察 7→10 的进位过程。
记录表:
数值 数码管显示 二进制LED 说明
5 05 00101
6 06 00110
7 07 00111 个位最大
8 10 01000 满8进1!
9 11 01001
思考: 八进制中,个位最大能显示几?为什么没有8和9?
实验9-5:进制转换练习
目的: 同一个数值在不同进制下显示不同形式,理解“数值不变、表示方法不同”。
操作:
按AN4将数值调整到某个数(如15)。
多次按AN5,依次切换十进制→十六进制→八进制。
填写记录表。
记录表:
十进制数值 二进制(LED4~8) 十六进制显示 八进制显示
10 01010 0A 12
15 01111 0F 17
20 10100 14 24
25 11001 19 31
30 11110 1E 36
31 11111 1F 37
思考: 为什么 (15)10 = (0F)16 = (17)8 = (01111)2
实验9-6:位权理解练习
目的: 通过5个LED的亮灭,快速口算对应的十进制数值。
操作:
短按AN4随机产生一个数值。
不看数码管,只看LED4~8,口算当前数值。
再对照数码管验证。
练习方法: 从高位到低位累加位权。
LED状态(1→2→4→8→16) 计算过程 结果
00101 4 + 1 5
01010 8 + 2 10
10001 16 + 1 17
01110 8 + 4 + 2 14
11111 16 + 8 + 4 + 2 + 1 31
挑战: 你能在2秒内算出任意LED组合的数值吗?
五、思考
问题1: 为什么用5个LED表示二进制,如果只用4个LED那么能在16进制进位时
对应显示2进制的数吗?如果数值超过31,LED4~8会怎样显示?
问题2: 在十进制中,9→10时,个位从9变0,十位从0变1。在十六进制中,F→10时,个位从F变0,十位从0变1。这两个过程有什么共同点?
问题3: 二进制 10110? 等于十进制多少?等于十六进制多少?等于八进制多少?
问题4: LED9亮、LED10灭表示什么数制?此时数码管显示“12”,实际数值是多少?LED9灭、LED10亮表示什么数制?此时数码管显示“12”,实际数值是多少?LED9亮、LED10亮表示什么数制?此时数码管显示“12”,实际数值是多少?(提示:相同的显示“12”,在不同数制下含义不同。)
问题5: 为什么LED4~8的位权是“1 2 4 8 16”而不是“16 8 4 2 1”?
问题6: 为什么二进制在数字电路中如此重要?它与三极管的“饱和/截止”状态有什么关系?
问题7: LED9和LED10为什么采用“组合指示”方式(两种颜色组合表示三种数制),而不是每种数制单独用一个LED?
问题8: 你能否用二进制LED的亮灭状态,直接判断当前数值是奇数还是偶数?为什么?
问题9: 烧录程序时,为什么必须断开J21和J22?如果不断开直接烧录,可能发生什么?(进阶题,不要求掌握)
六、单片机进阶开发(选做)
1、本模块预留了烧录口(CN2),配合2个按键(AN4/AN5)、7个LED(4~10)、1个两位共阴数码管、两路输出模块(由跳线帽决定是否使用)这些硬件资源,学完数制基础后,可进行单片机编程实验。
2、烧录注意事项:
烧录前断开J21、J22跳线帽,使P3.0/P3.1与外设隔离
烧录完成后重新短接J21、J22,恢复按键和数码管个位控制
3、拓展实验建议:
编写程序控制LED4~8按二进制计数闪烁
用定时器实现精确延时
读取AN4/AN5状态实现按键控制
控制数码管显示自定义内容
逻辑门模拟,比如用2个按键作为输入,led中的两个作为输入显示,一个led作为输出显示等等。
输出模块可外接电机(可PWM调速),外接灯(可PWM调光),具体可根据外设控制要求写程序。
七、实验结论
1、本模块通过 5个二进制位权LED + 两位数码管 + 2个按键的硬件组合,实现了数制可视化教学功能:
二进制: 5个LED直接显示5位的0/1状态,位权:1、2、4、8、16
十进制: 数码管显示00~31,LED9(蓝)点亮指示
十六进制: 数码管显示00~1F(含A~F),LED10(绿)点亮指示
八进制: 数码管显示00~37,LED9(蓝)和LED10(绿)同时点亮指示
2、特点:
双LED数制指示 LED9(蓝)与LED10(绿)的组合状态,一目了然地指示当前数制
二进制LED与数码管同步 同一数值同时以二进制(LED)和数制(数码管)两种方式呈现
进位闪烁 进位发生时对应位闪烁3次,强化对“进位事件”的感知
按键复用 短按/长按区分不同功能
设置模式 长按AN5 3s进入数制设置,5s无操作或按AN4退出
通过本模块的学习,学生应能直观理解“同一个数值在不同进制下有不同的表示形式”这一核心概念,为后续数字电路、计算机组成原理等课程打下坚实基础。
实验九 完 附两张照片:同一个数值在不同数制下的显示
第二部分:完整实验指导书+原理图,有单片机基础的朋友可以直接烧录自己的代码玩。注意:数码管扫描千万别同时点亮多个段,会烧0805电阻,具体见实验指导书。
实验十一:单片机基础实验(开放平台),进阶实验,不作要求。
一、模块概述
1、本模块基于 STC8G1K08单片机(TSSOP-20封装),配合7个LED、2个按键、1个两位共阴数码管和2路输出模块,构成一个灵活的单片机入门实验平台。
2、本模块不提供具体实验步骤,而是作为一个开放平台,由学习者根据自身兴趣和目标自行设计实验内容,体验从“硬件使用者”到“硬件定义者”的转变。
二、硬件资源一览
资源类型 具体配置 说明
主控芯片 STC8G1K08A(TSSOP-20) 8位增强型51内核,8KB Flash,1KB RAM
烧录接口 CN2(4P排针,XH2.54) 通过USB转TTL工具下载程序
输出指示1 LED4~LED8(5个红色LED) 可做流水灯、状态指示、PWM输出观察等
输出指示2 LED9(蓝色)、LED10(绿色) 与两路输出模块共用I/O口,逻辑相反
数码管 两位共阴数码管 可显示数字、字母,需动态扫描驱动
输入按键 AN4、AN5(轻触按键) 可做按键检测、计数、模式切换等
外接输出 两路三极管输出(继电器+蜂鸣器接口) 通过跳线切换,可驱动5V负载(电机、LED灯带等)
三、I/O口分配表
引脚 I/O口 功能 备注
1 P1.2 LED4
2 P1.3 LED5
3 P1.4 LED6
4 P1.5 LED7
5 P1.6 LED8
6 P1.7 LED9(蓝色)/ 输出模块1 通过J19接LED9,通过J20接输出模块1
7 P5.4 LED10(绿色)/ 输出模块2 通过J17接LED10,通过J18接输出模块2
9 P5.5 AN4 按键1
11 P3.0/RxD AN5 按键2(同时也是烧录口)
12 P3.1/TxD 数码管个位阴极 同时也是烧录口
13 P3.2 数码管e段
14 P3.3 数码管d段
15 P3.4 数码管c段
16 P3.5 数码管g段
17 P3.6 数码管a段
18 P3.7 数码管b段
19 P1.0 数码管f段
20 P1.1 数码管十位阴极
四、输出模块与 LED9/LED10 的逻辑关系(重要)
P1.7 通过 J19 接 LED9(蓝色),通过 J20 接输出模块1。
P5.4 通过 J17 接 LED10(绿色),通过 J18 接输出模块2。
不建议两者同时使用,同时使用时LED的状态不一定正确。
如果只需要 LED 指示(不用输出模块),P1_7 = 0 点亮 LED9,P1_7 = 1 熄灭 LED9,与普通 LED 用法一致,无需特殊处理。
五、跳线帽配置说明
跳线帽 连接关系 功能
J19 P1.7 → LED9(蓝色) 插上后LED9受P1.7控制
J20 P1.7 → 输出模块1 插上后P1.7控制输出模块1
J17 P5.4 → LED10(绿色) 插上后LED10受P5.4控制
J18 P5.4 → 输出模块2 插上后P5.4控制输出模块2
六、数码管驱动电路说明(重要)
本模块的两位共阴数码管,每一位(个位/十位)的共阴极端仅串联了一个0805限流电阻(R44、R45),而非每一段(a~g)单独配置限流电阻。
这意味着: 在编写数码管显示程序时,必须采用 “动态扫描” 方式——即在任意时刻,只点亮一个数码管的一位(个位或十位),并且在该位的显示周期内,同一时刻只点亮一个段(a~g中的某一段),通过快速轮流扫描每一位的每一段,利用人眼的视觉暂留效应形成稳定的显示效果。
正确的驱动顺序(逐段扫描):
第1步:点亮个位 → 只点亮a段 → 延时 → 熄灭a段
第2步:点亮个位 → 只点亮b段 → 延时 → 熄灭b段
...
第7步:点亮个位 → 只点亮g段 → 延时 → 熄灭g段
第8步:点亮十位 → 只点亮a段 → 延时 → 熄灭a段
...
第14步:点亮十位 → 只点亮g段 → 延时 → 熄灭g段
循环
错误的做法(会导致段亮度不均或损坏):
同时点亮个位的多个段(a和b同时亮)→ 电流路径异常,亮度不均
同时点亮个位和十位 → 两个位同时导通,段电流不受控
为什么这样设计?
节省电阻降低故障率: 无需为每个段独立配置限流电阻
简化布线: 位选端串联一个电阻即可控制该位所有段的电流
设计要求: 编程时必须采用“逐位逐段”的动态扫描方式
七、限流电阻与功耗安全(非常重要!)
每一位数码管的共阴极端仅串联了一个 0805封装 470Ω 限流电阻(R44 为个位,R45 为十位)。0805 电阻的额定功率通常为 1/8W(0.125W)。
如果同时点亮一个位的多个段(例如同时点亮全部 7 个段显示数字“8”),电流会怎样?
假设红色 LED 的正向压降 VF ≈ 2.0V(不同颜色和批次可能有差异,此处按典型值估算):
单个段电流:I = (5V - 2.0V) / 470Ω ≈ 6.4mA
7 个段同时点亮:总电流 = 6.4mA × 7 ≈ 44.8mA
电阻功耗:P = I2 × R = (0.0448A)2 × 470Ω ≈ 0.94W
0.94W 远超过 0805 电阻的额定功率(0.125W),电阻会迅速发热,短时间内即可烧毁!
这是本模块最重要的安全注意事项:
严禁在程序中同时点亮一个数码管位的多个段!
每一位(个位或十位)在任意时刻只能点亮一个段。
任何“同时点亮多个段”的操作都可能导致限流电阻过载烧毁,造成永久性硬件损坏。
正确做法: 采用“逐段扫描”方式,确保每个时刻只有一个段被点亮。
错误示例(会导致电阻烧毁):
c
// 错误!同时点亮一个位的多个段
P3 = 0xFE; // 同时点亮a、b、c、d、e、f、g全部7个段
P1_1 =0; // 十位导通
// 此时R45承受约0.94W功率 → 烧毁
正确示例:
c
// 正确:逐段扫描,每次只点亮一个段
// 显示数字"8"的逐段扫描流程
P3_6 = 1; P1_1 = 0; delay(); P3_6 = 0; // a段
P3_7 =1; P1_1 = 0; delay(); P3_7 = 0; // b段
P1_0 = 1; P1_1 = 0; delay(); P1_0 = 0; // f段
P3_2 = 1; P1_1 = 0; delay(); P3_2 = 0; // e段
P3_3 = 1; P1_1 = 0; delay(); P3_3 = 0; // d段
P3_4 = 1; P1_1 = 0; delay(); P3_4 = 0; // c段
P3_5 = 1; P1_1 = 0; delay(); P3_5 = 0; // g段
如果因程序错误导致限流电阻烧毁怎么办?
本模块的电阻为 0805 贴片封装,有一定动手能力的使用者可自行更换(标配有替换电阻)
建议更换为同规格 470Ω 0805 电阻(或 1/4W 直插电阻临时替代)
但根本解决方案是修正程序逻辑,确保永远不出现“多位多段同时点亮”的情况
八、扫描频率与显示效果
当采用动态扫描方式驱动数码管时,扫描频率直接影响显示效果。
刷新率过低(如 < 30Hz): 人眼能察觉到闪烁,显示不稳定
刷新率适中(如 60Hz ~ 100Hz): 人眼感觉连续稳定
刷新率过高(如 > 500Hz): 每个段点亮时间过短,亮度下降
用手机摄像头观察数码管:
很多电器产品的数码管用手机摄像头观察时,会看到明显的滚动条纹或闪烁,这是因为其扫描频率与手机摄像头的采样频率(通常为 30fps 或 60fps)产生了差拍效应。
本模块的特别之处: 由于每一位只有一个限流电阻,每一段必须逐段点亮,因此本模块的扫描频率可以设置得远高于人眼和摄像头的感知极限。当扫描频率足够高(如 1kHz 以上)时,用手机摄像头观察本模块的数码管,显示同样非常稳定,无闪烁或条纹。这也从侧面证明:你的程序已经达到了足够高的扫描频率。
编程建议:
参数 推荐值 说明
每段点亮时间 50~200μs 太短亮度不足,太长闪烁
每段熄灭时间(换段间隔) 尽可能短 减少黑暗间隙
完整刷新周期 < 16ms(> 60Hz) 避免人眼可见闪烁
每位逐段扫描总时间 < 8ms 每位分时,保证整体刷新率
思考: 如果每段点亮时间为 100μs,共 2 位 × 7 段 = 14 段,完整刷新一次需要 1.4ms,刷新率约为 714Hz。这个频率下,人眼和手机摄像头都看不到闪烁。如果你的程序让数码管显示不稳定,请检查扫描频率是否足够高。
九、烧录说明
使用USB转TTL工具连接至 CN2(4P排针):VCC→VCC,GND→GND,TXD→RXD,RXD→TXD。
断开 J21、J22 跳线帽,使P3.0/P3.1与外设(AN5、数码管个位)隔离,避免烧录干扰。
使用 STC-ISP 软件选择芯片型号 STC8G1K08,加载.hex文件后点击“下载/编程”。
烧录完成后重新短接 J21、J22,恢复外设功能。
十、编程建议(由浅入深)
阶段 建议实验内容 涉及资源
入门 点亮单个LED、控制LED闪烁 I/O口输出
基础 流水灯(5个LED依次点亮) 多个I/O口输出
进阶 按键控制LED亮灭、按键计次 I/O口输入+输出
中级 数码管显示0~9循环、显示按键次数 数码管动态扫描
模拟各种逻辑门 led/数码管/按键等
提高 按键切换数码管显示模式(计数/倒计时等) 综合
深入 PWM控制LED呼吸灯、PWM控制电机转速 定时器/PWM
综合 用PWM调节LED亮度,数码管显示当前占空比 综合
拓展 通过输出模块控制继电器,实现“按键控制负载” 输出模块
提示: 以上仅为建议方向,具体实现方式(代码编写、调试过程)需要学习者自行查阅 STC8G1K08A 数据手册和 Keil C51 开发资料。
十一、给初学者的几点建议
从最简单的开始。 先点亮一个LED,再让它闪烁。不要一上来就写几十行的综合程序。
熟悉STC-ISP下载流程。 先把“点亮LED”的程序下载进去,确认硬件和工具链都正常。
多看数据手册。 STC8G系列的数据手册写得非常详细,包含了寄存器定义、定时器配置、PWM设置等所有信息。读手册是单片机开发的基本功。
善用现有工具。 本模块已经帮你完成了电路连接和焊接,你只需要专注于代码和逻辑。
学了马上做。 看到一个新功能(比如定时器、中断),写完代码立刻烧进去看效果。错了没关系,改完再烧。
数码管调试时先用单段点亮验证。 不要一开始就写完整的动态扫描程序。先逐个点亮每一段,确认段码正确,再组合成数字,最后才做动态扫描。
牢记限流电阻的功耗限制。 编写数码管程序时,必须确保任意时刻一个位最多只点亮一个段。这是保护硬件的底线。
十二、思考题
1、5个LED最多能表示多少种不同的状态?如果用这5个LED做二进制计数,最大能计数到多少?
2、数码管显示为什么需要“动态扫描”?如果扫描频率太慢会怎样?太快呢?
3、按键检测为什么需要“消抖”?软件消抖和硬件消抖各有什么优缺点?
4、如果要实现“长按按键3秒进入设置模式”,程序逻辑应该怎么设计?
5、PWM控制LED亮度的原理是什么?占空比和亮度之间是什么关系?
6、如果要用继电器控制220V交流电的灯泡,电路中需要额外增加哪些保护措施?
7、本模块的I/O口驱动能力有限(约20mA),如果要驱动大功率负载,应该怎么办?
8、当P1.7输出高电平时,LED9灭、输出模块动作;输出低电平时,LED9亮、输出模块释放。如果想实现“LED亮时输出模块也动作”,应该怎么办?
9、本模块的数码管每一位只有一个限流电阻。如果同时点亮一个位的多个段(比如同时亮a和b),限流电阻的功耗是多少?会不会烧毁?
10、已知本模块的数码管驱动方式为“逐位逐段扫描”,请估算:要让刷新率达到 500Hz 以上,每段的点亮时间最大不能超过多少微秒?
11、用手机摄像头观察本模块的数码管时,显示非常稳定。这说明了什么?如果观察
到闪烁,可能的原因是什么?
12、如果因程序错误导致限流电阻烧毁,应该如何排查和修复?
十三、实验结论
本模块为学习者提供了一个最小可用的单片机实验平台,包含:
1颗 STC8G1K08单片机(TSSOP-20)
7个独立LED(5个位权LED + 2个模式指示LED,后者与输出模块逻辑相反)
1个两位共阴数码管
2个独立按键
2路三极管输出(含继电器和蜂鸣器接口)
烧录接口(CN2)+ 烧录隔离跳线帽(J21/J22)
重要安全提示: 数码管每一位的共阴极端仅串联了一个470Ω限流电阻(0805封装,额定功率1/8W)。严禁在程序中同时点亮一个数码管位的多个段,否则限流电阻将因过载而烧毁。必须采用“逐位逐段”的动态扫描方式,确保任意时刻每个位只点亮一个段。
本模块的具体功能不是固定的——是由你的代码定义的。你可以让它成为:
一个电子计时器
一个数字电压表(需外接分压电路)
一个PWM信号发生器
一个简易温度显示器(需外接传感器)
或者任何一个你能想到的、用这些资源能实现的东西
硬件已经准备好了,剩下的,交给你的代码。
实验十一 完
结束语
两份指导书合起来看,你会发现:硬件是固定的,但思维是开放的。你可以只把它当成一个数制演示板来用,也可以把它当成一个最小单片机系统,自己写代码去点亮LED、驱动数码管、控制继电器。硬件已经准备好了,剩下的交给你的代码。如果有看不懂的步骤,或者想要做其它单片机功能,可以在下面留言交流。
|