STM32F103C8T6 HAL库生成数码管倒计时

STM32F103C8T6 HAL库生成数码管倒计时报告

摘要

本报告旨在概述使用STM32F103C8T6单片机结合HAL库实现数码管倒计时功能的开发过程。该项目通过STM32CubeMX进行硬件配置,并利用HAL库提供的API进行软件编程,实现了一个具有用户交互功能的倒计时定时器。

1. 项目背景与需求

1.1 项目背景

随着嵌入式技术的广泛应用,基于STM32单片机的数码管倒计时系统因其低成本、高性能和易于开发的特点,被广泛应用于各类计时场合,如比赛计分、倒计时警告等。

1.2 需求分析

  • 倒计时功能:实现用户设定的时间倒计时,时间范围可设定为1-999分钟。
  • 用户交互:通过按键设置倒计时时间,包括设置、加一、减一、开始/暂停和复位等功能。
  • 显示功能:利用数码管实时显示剩余时间。
  • 扩展功能(可选):加入语音报警系统,在特定时间发出提醒。

2. 硬件准备

  • STM32F103C8T6开发板:作为核心控制单元。
  • 数码管显示模块:通过四个GPIO引脚连接,用于显示时间。
  • 按键电路:至少包括设置、加一、减一、开始/暂停和复位五个按键。
  • 电源模块:为整个系统提供稳定电源。
  • 其他辅助元件:如电阻、电容等。

3. 软件开发环境

  • STM32CubeMX:用于配置STM32的硬件参数,生成初始化代码。
  • Keil MDK-ARM 或 STM32CubeIDE:作为IDE,用于编写、编译和调试程序代码。
  • HAL库:提供硬件抽象层,简化硬件操作。

4. 开发流程

4.1 硬件连接

  1. 将数码管显示模块的四个引脚连接到STM32F103C8T6的GPIO输出端口。
  2. 将按键电路通过GPIO输入端口连接到STM32F103C8T6。
  3. 连接电源模块,确保系统供电稳定。

4.2 硬件配置

  1. 使用STM32CubeMX创建新项目,选择STM32F103C8T6作为目标芯片。
  2. 在“Pinout & Configuration”中配置GPIO引脚,将对应的引脚设置为数码管输出和按键输入。
  3. 配置系统时钟,确保时钟频率满足系统需求。
  4. 生成初始化代码,并导入到IDE中。

4.3 软件编程

  1. 初始化:编写代码初始化HAL库、系统时钟、GPIO等。
  2. 按键扫描:编写按键扫描函数,检测按键状态,并根据按键操作执行相应功能。
  3. 时间管理:使用定时器实现倒计时功能,更新数码管显示的时间。
  4. 显示更新:编写函数根据当前时间更新数码管显示内容。
  5. 扩展功能(如适用):实现语音报警功能,根据剩余时间发出相应提示。

4.4 调试与测试

  1. 使用IDE的调试功能进行代码调试,确保各功能模块正常运行。
  2. 进行实物测试,验证数码管显示和按键操作的准确性。
  3. 调整系统参数,优化性能表现。

5. 预期成果

完成一个基于STM32F103C8T6和HAL库的数码管倒计时系统,能够实现用户设定的时间倒计时,并通过数码管实时显示剩余时间。系统具有用户友好的交互界面和较高的稳定性。

6. 结论

本报告详细描述了使用STM32F103C8T6单片机结合HAL库实现数码管倒计时功能的开发过程。通过合理的硬件设计和软件编程,成功实现了预期功能,为类似项目的开发提供了有益的参考。

```c
#include "stm32f1xx_hal.h"

// 数码管段选引脚定义
#define SEG_A GPIO_PIN_0
#define SEG_B GPIO_PIN_1
#define SEG_C GPIO_PIN_2
#define SEG_D GPIO_PIN_3
#define SEG_E GPIO_PIN_4
#define SEG_F GPIO_PIN_5
#define SEG_G GPIO_PIN_6
#define SEG_DP GPIO_PIN_7

// 数码管位选引脚定义
#define DIGIT_1 GPIO_PIN_8
#define DIGIT_2 GPIO_PIN_9
#define DIGIT_3 GPIO_PIN_10
#define DIGIT_4 GPIO_PIN_11

// 数码管显示数字对应的段选编码
const uint8_t seg_code[] = {
    SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F, // 0
    SEG_B | SEG_C,                                  // 1
    SEG_A | SEG_B | SEG_D | SEG_E | SEG_G,         // 2
    SEG_A | SEG_B | SEG_C | SEG_D | SEG_G,         // 3
    SEG_B | SEG_C | SEG_F | SEG_G,                 // 4
    SEG_A | SEG_C | SEG_D | SEG_F | SEG_G,         // 5
    SEG_A | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G, // 6
    SEG_A | SEG_B | SEG_C,                         // 7
    SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G, // 8
    SEG_A | SEG_B | SEG_C | SEG_F | SEG_G,         // 9
};

void display(uint8_t num) {
    HAL_GPIO_WritePin(GPIOA, DIGIT_1 | DIGIT_2 | DIGIT_3 | DIGIT_4, GPIO_PIN_RESET);
    switch (num) {
        case 1:
            HAL_GPIO_WritePin(GPIOA, DIGIT_1, GPIO_PIN_SET);
            break;
        case 2:
            HAL_GPIO_WritePin(GPIOA, DIGIT_2, GPIO_PIN_SET);
            break;
        case 3:
            HAL_GPIO_WritePin(GPIOA, DIGIT_3, GPIO_PIN_SET);
            break;
        case 4:
            HAL_GPIO_WritePin(GPIOA, DIGIT_4, GPIO_PIN_SET);
            break;
        default:
            break;
    }
    HAL_GPIO_WritePin(GPIOA, seg_code[num], GPIO_PIN_SET);
}

int main(void) {
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();

    uint8_t countdown = 9;
    while (1) {
        display(countdown);
        HAL_Delay(1000);
        countdown--;
        if (countdown == 0) {
            countdown = 9;
        }
    }
}
```

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

科创工作室li

你的鼓励将是大学生的创作动力

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

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

打赏作者

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

抵扣说明:

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

余额充值