
答案仅供参考,未必正确,请如需使用请核实。
第六部分 数码管显示
填空题
-
数码管显示通常基于______原理,通过控制各段电极的通断来显示不同的数字或字符。
答案:电致发光(或LED点亮) -
在静态显示中,每一个数码管位都是______控制的,即同时点亮显示所需的所有段。
答案:独立 -
动态显示通过______扫描的方式,依次点亮每个数码管位,利用人眼的视觉暂留效应形成完整的显示。
答案:时间 -
数码管的共阳极接法意味着所有阳极连接在一起,通过控制______来实现显示。
答案:阴极(或段电极) -
在Arduino Mega 2560上,控制数码管显示通常需要用到______输出端口。
答案:数字I/O -
静态显示中,如果显示4位数字,则需要______个独立的I/O口来控制段电极。
答案:4×(数码管段数,如7段则为28) -
动态显示中,为了减少闪烁,扫描速度应足够______。
答案:快 -
数码管的______决定了其能够显示的颜色和亮度。
答案:LED类型 -
在Arduino程序中,通常使用______函数来控制数码管的段电极。
答案:digitalWrite -
动态显示中,为了避免显示错误,需要确保每次扫描时只点亮______个数码管位。
答案:一 -
数码管的共阴极接法意味着所有阴极连接在一起,通过控制______来实现显示。
答案:阳极(或段电极) -
静态显示相比动态显示,需要更多的______资源。
答案:I/O口(或硬件资源) -
在动态显示中,每个数码管位的显示时间是由______决定的。
答案:扫描速度 -
数码管的______决定了其能够显示的最大字符数或数字数。
答案:段数 -
为了在Arduino Mega 2560上实现数码管的动态显示,通常需要用到______等定时器相关功能。
答案:中断或延时函数
单选题
-
下列哪种接法属于数码管的一种常见接法?
A. 共阳极接法
B. 共阴极接法
C. 串联接法
D. 并联接法(指电源并联,非段或位并联)
答案:A(和B也是正确答案,但单选通常选其一) -
静态显示中,控制一个7段数码管显示数字“8”,需要点亮______个段。
A. 3
B. 5
C. 6
D. 7
答案:D -
动态显示中,为了形成稳定的显示效果,扫描速度应控制在人眼视觉暂留时间之内,大约为______毫秒以内。
A. 1
B. 10
C. 20
D. 100
答案:C(实际值可能因人而异,但通常小于20毫秒) -
在Arduino程序中,控制数码管段电极的高电平或低电平,通常使用______函数。
A. analogWrite
B. digitalRead
C. digitalWrite
D. delay
答案:C -
下列哪种情况更适合使用动态显示?
A. 需要同时显示很多位数字
B. 只需要显示一位数字
C. 对显示亮度有极高要求
D. 对硬件资源有严格限制
答案:A -
数码管的共阳极接法中,为了显示数字,需要控制______为低电平。
A. 所有阳极
B. 所有阴极
C. 选定段电极
D. 未选定段电极
答案:C -
静态显示相比动态显示,其优点是______。
A. 节省I/O口资源
B. 显示更稳定无闪烁
C. 编程更简单
D. 功耗更低
答案:B -
在动态显示中,如果扫描速度过慢,可能会导致______。
A. 数码管损坏
B. 显示亮度增加
C. 显示不稳定或闪烁
D. 功耗增加
答案:C -
数码管的亮度主要由______决定。
A. 供电电压
B. LED类型
C. 扫描速度
D. 控制方式(静态或动态)
答案:A(和B也有影响,但单选通常选最直接因素) -
下列哪个不是实现数码管动态显示所必需的?
A. 定时器中断
B. 足够的I/O口资源
C. 延时函数
D. 数码管段数
答案:D -
在Arduino Mega 2560上,如果采用共阴极接法,为了点亮数码管的某一段,应该将该段的电极设置为______。
A. 高电平
B. 低电平
C. 悬空
D. 接地
答案:A -
静态显示中,如果每个数码管位都需要独立的I/O口来控制,那么显示4位数字需要至少______个I/O口(假设数码管为7段)。
A. 4
B. 7
C. 28
D. 32
答案:C -
动态显示中,为了减少闪烁,通常采用的策略是______。
A. 增加扫描速度
B. 减少扫描速度
C. 增加数码管段数
D. 减少数码管位数
答案:A -
数码管的______决定了其能够显示的最大字符集。
A. 段数
B. 尺寸
C. 颜色
D. 功耗
答案:A -
在Arduino程序中,为了实现数码管的动态显示,通常需要用到______等循环控制结构。
A. if语句
B. for循环
C. while循环
D. switch语句
答案:B(或C,但for循环更常见用于扫描)
判断题
-
数码管的静态显示比动态显示更节省硬件资源。()
答案:错 -
在动态显示中,为了提高显示稳定性,应尽可能减慢扫描速度。()
答案:错(应控制在人眼视觉暂留时间之内,但并非越慢越好) -
数码管的共阳极接法中,所有阳极连接在一起,通过控制阴极来实现显示。()
答案:对 -
静态显示中,每个数码管位都是独立控制的,因此不存在闪烁问题。()
答案:对(但需注意电源和电流限制) -
动态显示中,每次扫描时所有数码管位都是同时点亮的。()
答案:错(每次只点亮一个数码管位) -
数码管的亮度完全由供电电压决定,与LED类型无关。()
答案:错(LED类型也影响亮度) -
在Arduino程序中,控制数码管显示通常使用analogWrite函数。()
答案:错(应使用digitalWrite函数) -
静态显示中,如果显示4位数字,则需要4个独立的I/O口来控制位电极。()
答案:错(是控制段电极,且数量取决于数码管段数) -
动态显示中,扫描速度过快可能导致数码管无法正常显示。()
答案:对(因为可能超出人眼视觉暂留时间) -
数码管的段数决定了其能够显示的最大字符数或数字数。()
答案:对 -
在Arduino Mega 2560上实现数码管的动态显示时,必须使用定时器中断。()
答案:错(可以使用延时函数或其他方法实现) -
数码管的共阴极接法中,为了显示数字,需要控制所有阴极为高电平。()
答案:错(应控制选定段电极为高电平) -
静态显示相比动态显示,其编程复杂度更高。()
答案:错(通常静态显示编程更简单) -
动态显示中,为了减少闪烁和功耗,应合理选择扫描速度和占空比。()
答案:对 -
数码管的显示颜色由供电电压决定。()
答案:错(由LED类型决定)
//数码管实验,1624221,1624222,单片机原理与接口技术
//教材P304页,习题2演示案例
#include "SevSeg.h"
// 实例化一个七段数码管控制器对象
SevSeg sevseg;
int deciSeconds = 0;
void setup() {
// 定义数码管的数量
byte numDigits = 4;
// 定义控制每个数码管的引脚
byte digitPins[] = {2, 3, 4, 5};
// 定义控制七段中每一段的引脚
byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 13};
// 如果电阻在段引脚上,则设置为false;如果在数码管引脚上,则设置为true
bool resistorsOnSegments = false;
// 硬件配置,COMMON_ANODE表示公共阳极,COMMON_CATHODE表示公共阴极
byte hardwareConfig = COMMON_ANODE;
// 是否使用延迟来更新显示,通常设置为false以提高性能
bool updateWithDelays = false;
// 是否保留前导零,true表示保留,false表示不保留
bool leadingZeros = false;
// 如果小数点不存在或未连接,则设置为true
bool disableDecPoint = false;
// 初始化七段数码管控制器
sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments,
updateWithDelays, leadingZeros, disableDecPoint);
// 设置数码管的亮度,学号后两位
sevseg.setBrightness(66);
Serial.begin(9600);
}
void loop() {
// 使用静态变量来保持计时器和计数值在循环之间的状态
static unsigned long timer = millis();
// 检查是否已经过去了一毫秒(或更多)
if (millis() - timer >= 10) {
// 更新计时器
timer += 10;
// 每过一毫秒,计数值增加1(这里实际上是每秒增加1000,因为千分之一秒计数)
// 注意:原注释中的"100 milliSeconds is equal to 1 deciSecond"可能有误,
// 因为这里实际上是每次循环增加1,每秒大约增加1000(取决于循环速度)
deciSeconds++;
// 更新数码管显示的数字
if(deciSeconds%100==0)
{
Serial.print("学号162422199: ");
Serial.print(deciSeconds/100);
Serial.println("秒");
}
if (deciSeconds <= 10000)
{
sevseg.setNumber(deciSeconds, 2); // -1表示不显示小数点
}
// 当计数值达到10000时,更改为学号后四位,并等待10秒
else if(deciSeconds > 10000 && deciSeconds <= 19999) {
// 学号后四位
sevseg.setNumber(2199, 0); // -1表示不显示小数点
}
else if(deciSeconds > 19999) {
deciSeconds = 0;
sevseg.setNumber(0, 0); // -1表示不显示小数点
}
}
// 刷新数码管显示,这一步必须反复执行以保持显示更新
sevseg.refreshDisplay();
}
这段代码是一个Arduino程序,用于控制一个四位的七段数码管显示。程序使用了SevSeg库来简化数码管的控制。下面是对代码的详细解释:
包含库
cpp复制代码
#include "SevSeg.h" |
首先,包含了SevSeg库,这个库提供了控制七段数码管的函数和类。
实例化对象
cpp复制代码
SevSeg sevseg; |
实例化了一个SevSeg类的对象sevseg,用于后续控制数码管。
全局变量
cpp复制代码
int deciSeconds = 0; |
定义了一个全局变量deciSeconds,用于记录经过的时间(这里以千分之一秒为单位,但命名可能有误导性)。
setup() 函数
cpp复制代码
void setup() { | |
// ... | |
} |
setup()函数在Arduino启动或重置时运行一次,用于初始化设置。
- 定义数码管数量和引脚:
numDigits定义了数码管的数量,这里是4位。digitPins[]和segmentPins[]分别定义了控制数码管位和段的引脚。
- 配置数码管:
resistorsOnSegments指定了限流电阻是在段引脚上还是在数码管引脚上。hardwareConfig指定了数码管的硬件配置,这里是公共阳极。updateWithDelays决定了是否使用延迟来更新显示,这里设置为false以提高性能。leadingZeros决定了是否保留前导零,这里设置为false。disableDecPoint决定了是否禁用小数点,这里设置为false(即启用小数点,但如果未连接则设置为true)。
- 初始化数码管控制器:
- 使用
sevseg.begin()函数初始化数码管控制器。
- 使用
- 设置数码管亮度:
- 使用
sevseg.setBrightness()函数设置数码管的亮度,这里设置为66(可能是根据学号后两位来定的)。
- 使用
- 初始化串口通信:
- 使用
Serial.begin(9600)初始化串口通信,波特率为9600。
- 使用
loop() 函数
cpp复制代码
void loop() { | |
// ... | |
} |
loop()函数在setup()函数之后反复执行,是Arduino程序的主循环。
- 计时和计数:
- 使用
millis()函数获取当前时间(以毫秒为单位)。 - 通过比较当前时间和上一次记录的时间,判断是否已经过去了至少10毫秒。
- 如果是,则更新计时器,并将
deciSeconds增加1(这里实际上是以毫秒为单位计数,每秒大约增加1000)。
- 使用
- 更新数码管显示:
- 当
deciSeconds是100的倍数时,通过串口打印出经过的秒数(但这里的计算方式有误,应该是deciSeconds/1000才是秒数)。 - 如果
deciSeconds小于等于10000,则在数码管上显示deciSeconds的值(但这里是以毫秒为单位,可能需要调整)。 - 当
deciSeconds大于10000且小于等于19999时,显示学号后四位(2199)。 - 当
deciSeconds大于19999时,重置为0并清空数码管显示。
- 当
- 刷新数码管显示:
- 使用
sevseg.refreshDisplay()函数刷新数码管显示,这一步必须反复执行以保持显示更新。
- 使用
注意事项
- 计时和显示单位:代码中
deciSeconds的命名和计算方式可能导致混淆。它实际上是以毫秒为单位计数的,而不是千分之一秒(或“deciSecond”)。因此,相关的显示和计算可能需要调整。 - 串口打印:串口打印部分用于调试或展示经过的秒数,但计算方式有误(应该是
deciSeconds/1000)。 - 亮度设置:亮度设置为66,这可能是根据某个特定要求或学号后两位来定的。实际使用时可以根据需要调整。
- 库的使用:
SevSeg库简化了数码管的控制,但用户需要确保正确连接硬件并配置库函数。
1215

被折叠的 条评论
为什么被折叠?



