截图:


超过100s

链接:
https://wokwi.com/projects/415690255079386113
代码:
//数码管实验,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();
}
Wokwi Arduino Mega 2560 - 定时器与数码管显示实验报告
实验目的
本实验旨在通过Arduino Mega 2560微控制器驱动七段数码管,实现一个简单的定时器功能。通过编程控制数码管显示从0开始递增的计数值,并在特定条件下显示特定的数字(如学号后四位),以演示定时器和数码管显示的基本原理。
实验器材
- Arduino Mega 2560 微控制器
- 4位七段数码管显示器
- 电阻(如220Ω,用于限流)
- 连接线
- Wokwi在线仿真平台(用于代码测试和仿真)
实验原理
-
七段数码管:七段数码管由7个LED段(a, b, c, d, e, f, g)组成,可以显示0-9的数字。通过控制这些段的亮灭,可以显示不同的数字。
-
定时器:在Arduino中,可以使用
millis()函数来实现简单的定时器功能。millis()函数返回自Arduino板开始运行当前程序以来的毫秒数。 -
SevSeg库:SevSeg库是一个用于驱动七段数码管的Arduino库,它简化了控制数码管的过程,包括硬件配置、数字显示和亮度调节等。
实验步骤
- 硬件连接:
- 将4位七段数码管的每一位的引脚连接到Arduino Mega 2560的数字引脚(如2, 3, 4, 5)。
- 将七段数码管的每一段(a, b, c, d, e, f, g)的引脚连接到Arduino的其他数字引脚(如6, 7, 8, 9, 10, 11, 12, 13,其中13可能用于小数点,但本实验未使用)。
- 如果使用共阳极数码管,确保在SevSeg库中配置为
COMMON_ANODE。
- 软件编程:
- 导入SevSeg库。
- 初始化SevSeg对象,配置数码管的数量、引脚、硬件配置等。
- 在
setup()函数中设置数码管的亮度和其他参数。 - 在
loop()函数中使用millis()函数实现定时器功能,更新计数值并显示在数码管上。 - 当计数值达到特定条件时,显示特定的数字(如学号后四位)。
- 仿真测试:
- 在Wokwi在线仿真平台上上传并运行代码。
- 观察数码管的显示情况,验证定时器功能和特定条件下的数字显示是否正确。
实验代码
cpp复制代码
#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}; | |
bool resistorsOnSegments = false; | |
byte hardwareConfig = COMMON_ANODE; | |
bool updateWithDelays = false; | |
bool leadingZeros = false; | |
bool disableDecPoint = true; | |
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; | |
deciSeconds++; | |
if (deciSeconds % 100 == 0) { | |
Serial.print("学号162422199: "); | |
Serial.print(deciSeconds / 100); | |
Serial.println("秒"); | |
} | |
if (deciSeconds <= 10000) { | |
sevseg.setNumber(deciSeconds, -1); // 不显示小数点 | |
} else if (deciSeconds > 10000 && deciSeconds <= 19999) { | |
sevseg.setNumber(2199, -1); // 显示学号后四位,不显示小数点 | |
} else if (deciSeconds > 19999) { | |
deciSeconds = 0; | |
sevseg.setNumber(0, -1); // 重置并显示0,不显示小数点 | |
} | |
} | |
sevseg.refreshDisplay(); | |
} |
实验结果
- 数码管从0开始递增显示计数值,每秒增加约100(由于
millis()的精度和循环速度,实际增加速度可能略有差异)。 - 当计数值达到10000时,数码管显示学号后四位(2199)。
- 当计数值超过19999时,数码管重置为0,并继续递增显示。
- 串口监视器输出计数值的秒数,用于验证定时器的准确性。
实验结论
本实验成功实现了通过Arduino Mega 2560微控制器驱动七段数码管显示定时器的功能。通过编程控制数码管的显示内容,验证了定时器和数码管显示的基本原理。同时,实验也展示了如何使用SevSeg库简化数码管的控制过程。
Wokwi Arduino Mega 2560 定时器详细课程教程
一、课程简介
本课程将详细介绍 Arduino Mega 2560 的定时器功能,包括定时器的基本概念、定时器配置、定时中断的使用,以及如何在 Wokwi 平台上进行定时器的仿真和调试。通过本课程的学习,学员将掌握如何利用定时器实现精确的时间控制和周期性任务调度。
二、课程内容
1. 定时器基础
- 定时器概念:定时器是单片机中的一种计数装置,用于测量时间间隔或产生精确的时间延迟。
- Arduino Mega 2560 定时器资源:Mega 2560 提供了多个定时器,包括 time0(8位)、time1(16位)、time2(8位)、time3(16位)、time4(16位)、time5(16位)。
2. 定时器配置
- 定时器控制寄存器:如 TCCRnA 和 TCCRnB,用于设置定时器的工作模式和预分频系数。
- 预分频系数:决定定时器的计数频率,通过配置 CS 位来实现。
- 工作模式:定时器支持多种工作模式,如普通模式、CTC 模式、快速 PWM 模式等。
3. 定时中断
- 定时中断概念:当定时器计数达到预设值时,会触发定时中断,执行中断服务程序(ISR)。
- 定时中断配置:
- 使用第三方库,如
FlexiTimer2或MsTimer2,来简化定时中断的配置。 - 设置定时中断周期和中断服务程序。
- 使用第三方库,如
- 中断服务程序(ISR):ISR 是定时中断发生时执行的特定代码段,用于处理定时事件。
4. 定时器应用实例
- LED 闪烁:使用定时中断控制 LED 以固定频率闪烁。
- PWM 输出:利用定时器的 PWM 模式生成特定频率和占空比的波形,用于控制电机速度或调节 LED 亮度。
- 事件触发:在定时中断中执行特定任务,如数据采集、状态更新等。
5. Wokwi 平台定时器仿真
- 创建项目:在 Wokwi 平台上选择 Arduino Mega 2560 型号,创建新的项目。
- 编写代码:配置定时器并编写中断服务程序。
- 仿真运行:观察定时器计数和中断触发的情况。
- 调试工具:使用串口监视器查看定时中断触发时的调试信息。
6. 高级定时器功能
- 输入捕捉:测量外部信号的周期或频率。
- 输出比较:在定时器计数达到特定值时输出特定信号。
- 相位修正 PWM:生成相位修正的 PWM 波形,提高波形质量。
三、课程实践
- 项目一:使用定时中断控制 LED 以不同频率闪烁。
- 项目二:利用定时器生成 PWM 信号,控制电机速度变化。
- 项目三:结合输入捕捉功能,测量外部信号的周期并显示在串口监视器上。
四、学习建议
- 理解原理:深入理解定时器的工作原理和配置方法。
- 动手实践:在 Wokwi 平台上进行定时器的仿真和调试,通过实例项目加深对定时器功能的理解。
- 参考文档:查阅 Arduino 官方文档和第三方库文档,获取更多关于定时器的信息和示例代码。
五、学习资源
- 官方文档:Arduino 官方网站提供的定时器相关文档。
- 在线教程:Wokwi 平台的教程和 Arduino 中文社区的教程,特别是关于定时器和中断的章节。
- 书籍推荐:《Arduino 编程从入门到实践》、《Arduino 高级编程》等,这些书籍中通常包含关于定时器和中断的详细讲解和实例代码。
通过本课程的学习,学员将掌握 Arduino Mega 2560 定时器的配置和使用方法,能够利用定时器实现精确的时间控制和周期性任务调度,为后续的复杂项目开发打下坚实的基础。
Wokwi Arduino Mega 2560 - 数码管显示详细课程教程
一、课程简介
本课程将详细介绍如何在 Wokwi 平台上使用 Arduino Mega 2560 控制数码管进行数字显示。通过本课程的学习,你将掌握数码管的基本工作原理、硬件连接方法、编程技巧以及实际项目应用。
二、课程内容
1. 数码管基础
- 数码管类型:
- 七段数码管:由七个发光二极管组成,用于显示数字 0-9。
- 八段数码管:比七段数码管多一个发光二极管,用于显示小数点。
- 共阳极与共阴极数码管:
- 共阳极数码管:所有发光二极管的阳极连接在一起。
- 共阴极数码管:所有发光二极管的阴极连接在一起。
2. 硬件连接
- 准备材料:
- Arduino Mega 2560 开发板
- 数码管(本教程以八段共阴极数码管为例)
- 电阻(用于限流,保护发光二极管)
- 面包板及跳线
- 连接方法:
- 将数码管的公共阴极连接到 Arduino 的 GND 引脚。
- 将数码管的各段(a-g 和小数点 dp)分别连接到 Arduino 的数字输出引脚(如 2-9)。
- 在每个段与 Arduino 引脚之间串联一个电阻(推荐 220Ω)。
3. 编程基础
- Arduino IDE:
- 安装并打开 Arduino IDE。
- 选择正确的开发板(Arduino Mega 2560)和端口。
- 编程思路:
- 初始化数码管各段对应的引脚为输出模式。
- 根据要显示的数字,点亮相应的段。
- 使用延时函数控制显示时间。
4. 示例代码
#define D_a 2 // 数码管 a 段连接引脚
#define D_b 3 // 数码管 b 段连接引脚
#define D_c 4 // 数码管 c 段连接引脚
#define D_d 5 // 数码管 d 段连接引脚
#define D_e 6 // 数码管 e 段连接引脚
#define D_f 7 // 数码管 f 段连接引脚
#define D_g 8 // 数码管 g 段连接引脚
#define D_dp 9 // 数码管小数点 dp 段连接引脚
// 数码管段码表,0-9 对应的段点亮状态(1 为点亮,0 为熄灭)
unsigned char num[10][8] = {
{1, 1, 1, 1, 1, 1, 0, 0}, // 0
{0, 1, 1, 0, 0, 0, 0, 0}, // 1
{1, 1, 0, 1, 1, 0, 1, 0}, // 2
{1, 1, 1, 1, 0, 0, 1, 0}, // 3
{0, 1, 1, 0, 0, 1, 1, 0}, // 4
{1, 0, 1, 1, 0, 1, 1, 0}, // 5
{1, 0, 1, 1, 1, 1, 1, 0}, // 6
{1, 1, 1, 0, 0, 0, 0, 0}, // 7
{1, 1, 1, 1, 1, 1, 1, 0}, // 8
{1, 1, 1, 1, 0, 1, 1, 0} // 9
};
void setup() {
// 初始化数码管各段引脚为输出模式
pinMode(D_a, OUTPUT);
pinMode(D_b, OUTPUT);
pinMode(D_c, OUTPUT);
pinMode(D_d, OUTPUT);
pinMode(D_e, OUTPUT);
pinMode(D_f, OUTPUT);
pinMode(D_g, OUTPUT);
pinMode(D_dp, OUTPUT);
}
void loop() {
for (int i = 0; i < 10; i++) {
// 显示数字 i
displayNumber(i);
delay(1000); // 延时 1 秒
}
}
void displayNumber(int number) {
// 根据段码表点亮相应的段
digitalWrite(D_a, num[number][0]);
digitalWrite(D_b, num[number][1]);
digitalWrite(D_c, num[number][2]);
digitalWrite(D_d, num[number][3]);
digitalWrite(D_e, num[number][4]);
digitalWrite(D_f, num[number][5]);
digitalWrite(D_g, num[number][6]);
digitalWrite(D_dp, num[number][7]);
}
cpp复制代码
#define D_a 2 // 数码管 a 段连接引脚 | |
#define D_b 3 // 数码管 b 段连接引脚 | |
#define D_c 4 // 数码管 c 段连接引脚 | |
#define D_d 5 // 数码管 d 段连接引脚 | |
#define D_e 6 // 数码管 e 段连接引脚 | |
#define D_f 7 // 数码管 f 段连接引脚 | |
#define D_g 8 // 数码管 g 段连接引脚 | |
#define D_dp 9 // 数码管小数点 dp 段连接引脚 | |
// 数码管段码表,0-9 对应的段点亮状态(1 为点亮,0 为熄灭) | |
unsigned char num[10][8] = { | |
{1, 1, 1, 1, 1, 1, 0, 0}, // 0 | |
{0, 1, 1, 0, 0, 0, 0, 0}, // 1 | |
{1, 1, 0, 1, 1, 0, 1, 0}, // 2 | |
{1, 1, 1, 1, 0, 0, 1, 0}, // 3 | |
{0, 1, 1, 0, 0, 1, 1, 0}, // 4 | |
{1, 0, 1, 1, 0, 1, 1, 0}, // 5 | |
{1, 0, 1, 1, 1, 1, 1, 0}, // 6 | |
{1, 1, 1, 0, 0, 0, 0, 0}, // 7 | |
{1, 1, 1, 1, 1, 1, 1, 0}, // 8 | |
{1, 1, 1, 1, 0, 1, 1, 0} // 9 | |
}; | |
void setup() { | |
// 初始化数码管各段引脚为输出模式 | |
pinMode(D_a, OUTPUT); | |
pinMode(D_b, OUTPUT); | |
pinMode(D_c, OUTPUT); | |
pinMode(D_d, OUTPUT); | |
pinMode(D_e, OUTPUT); | |
pinMode(D_f, OUTPUT); | |
pinMode(D_g, OUTPUT); | |
pinMode(D_dp, OUTPUT); | |
} | |
void loop() { | |
for (int i = 0; i < 10; i++) { | |
// 显示数字 i | |
displayNumber(i); | |
delay(1000); // 延时 1 秒 | |
} | |
} | |
void displayNumber(int number) { | |
// 根据段码表点亮相应的段 | |
digitalWrite(D_a, num[number][0]); | |
digitalWrite(D_b, num[number][1]); | |
digitalWrite(D_c, num[number][2]); | |
digitalWrite(D_d, num[number][3]); | |
digitalWrite(D_e, num[number][4]); | |
digitalWrite(D_f, num[number][5]); | |
digitalWrite(D_g, num[number][6]); | |
digitalWrite(D_dp, num[number][7]); | |
} |
5. 仿真与调试
- Wokwi 平台:
- 将代码上传到 Wokwi 平台上的 Arduino Mega 2560 仿真器。
- 观察数码管的显示情况,确保连接和代码正确。
- 调试技巧:
- 使用串口监视器输出调试信息。
- 检查硬件连接是否正确。
- 逐步调试代码,确保每个段都能正确点亮。
6. 实际应用
- 数字时钟:使用多个数码管显示时、分、秒。
- 计数器:通过按钮控制数码管的计数。
- 温度计:结合温度传感器,将温度值显示在数码管上。
三、课程总结
通过本课程的学习,你掌握了数码管的基本工作原理、硬件连接方法以及编程技巧。通过示例代码和仿真调试,你能够成功地在 Wokwi 平台上使用 Arduino Mega 2560 控制数码管进行数字显示。希望你在后续的学习中能够继续探索更多有趣的应用!
四、学习资源
- Arduino 官方文档:获取更多关于 Arduino Mega 2560 和数码管的信息。
- Wokwi 平台教程:学习如何在 Wokwi 平台上进行仿真和调试。
- 在线社区和论坛:与其他开发者交流经验,解决遇到的问题。
1548

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



