wokwi arduino mega 2560 - 定时器与数码管显示

截图:

超过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在线仿真平台(用于代码测试和仿真)
实验原理
  1. 七段数码管:七段数码管由7个LED段(a, b, c, d, e, f, g)组成,可以显示0-9的数字。通过控制这些段的亮灭,可以显示不同的数字。

  2. 定时器:在Arduino中,可以使用millis()函数来实现简单的定时器功能。millis()函数返回自Arduino板开始运行当前程序以来的毫秒数。

  3. SevSeg库:SevSeg库是一个用于驱动七段数码管的Arduino库,它简化了控制数码管的过程,包括硬件配置、数字显示和亮度调节等。

实验步骤
  1. 硬件连接
    • 将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
  2. 软件编程
    • 导入SevSeg库。
    • 初始化SevSeg对象,配置数码管的数量、引脚、硬件配置等。
    • setup()函数中设置数码管的亮度和其他参数。
    • loop()函数中使用millis()函数实现定时器功能,更新计数值并显示在数码管上。
    • 当计数值达到特定条件时,显示特定的数字(如学号后四位)。
  3. 仿真测试
    • 在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 平台上进行仿真和调试。
  • 在线社区和论坛:与其他开发者交流经验,解决遇到的问题。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangrelay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值