基于STM32开发板实现数码管显示
STM32是意法半导体(STMicroelectronics)推出的32位单片机系列,基于ARM Cortex-M内核,具有强大的性能、丰富的外设以及广泛的应用。本文将使用STM32开发板进行跑马灯的实现,利用STM32的GPIO(通用输入输出)接口控制LED灯的点亮顺序,达到跑马灯的效果。
目录
1. 项目简介
1.1 STM32开发板简介
STM32是意法半导体(STMicroelectronics)推出的32位单片机系列,基于ARM Cortex-M内核,具有强大的性能、丰富的外设以及广泛的应用。本文将使用STM32开发板进行跑马灯的实现,利用STM32的GPIO(通用输入输出)接口控制LED灯的点亮顺序,达到跑马灯的效果。
1.2 本项目目标
本项目的目标是通过STM32开发板控制一个LED阵列实现跑马灯效果。我们将通过GPIO口控制LED的状态,并编写相应的代码来实现灯光的循环点亮。
2. 开发环境搭建
2.1 安装Keil uVision5
在开始开发之前,我们首先需要安装Keil uVision5,这是一个非常适合开发STM32等ARM Cortex-M系列微控制器的集成开发环境(IDE)。下面是详细的安装步骤:
-
下载Keil uVision5
前往Keil官方网站(Keil官网)下载Keil uVision5开发环境的安装包。你可以选择注册一个Keil账户并下载最新版本的安装包,或者直接通过Google搜索“Keil uVision5 下载”找到安装链接。 -
安装Keil uVision5
下载完成后,双击安装包并按照提示进行安装。安装过程中,建议选择默认选项进行安装。安装完成后,启动Keil uVision5开发环境。 -
安装STM32支持包
在Keil中使用STM32开发时,需要安装STM32的支持包,支持包包含了相关的库和驱动文件,方便开发人员进行开发。-
打开Keil uVision5后,点击菜单栏中的“Project” -> “Manage” -> “Pack Installer”。
-
在弹出的Pack Installer窗口中,选择"STMicroelectronics"目录,然后找到"STM32"相关的包,点击安装。根据提示,安装所有必需的包,确保STM32的标准库和驱动库都被正确安装。
-
2.2 配置STM32开发环境
完成Keil安装后,我们需要为STM32配置开发环境,确保开发板与Keil能够正常配合工作。
-
创建一个新的工程
打开Keil uVision5,点击菜单栏的“Project” -> “New Project”,在弹出的窗口中选择一个合适的位置来保存你的工程。给项目命名,并选择一个适合的文件夹路径。 -
选择合适的STM32型号
在“Select Device for Target”窗口中,选择你所使用的STM32型号。例如,如果你使用的是STM32F103系列的开发板,可以选择“STM32F103C8”作为目标芯片。点击“OK”完成选择。 -
配置目标设备的时钟设置
STM32的时钟系统可能需要配置,尤其是在使用定时器或外设时。可以在Keil中使用相关的库函数来配置系统时钟,以确保外设的正常工作。 -
添加标准库文件
在Keil中使用STM32时,最好添加STM32的标准外设库(HAL库)。在“Project”-> “Options for Target”,然后进入“C” tab,在“Include Paths”中添加HAL库的路径。这样可以方便我们直接使用STM32提供的外设库函数。
2.3 Proteus 8的搭建
Proteus 8是一款非常流行的电子电路仿真软件,可以帮助开发者验证硬件电路与软件代码的正确性。我们可以使用Proteus 8来模拟STM32开发板的运行,并验证跑马灯效果。
-
安装Proteus 8
首先,前往Proteus的官方网站(Proteus官网)下载并安装Proteus 8仿真软件。你可以选择试用版本或购买正版
3. 硬件连接与接线图
3.1 STM32开发板与74LS245连接
在这个项目中,STM32通过GPIO控制74LS245芯片,进而控制七段数码管的显示。74LS245芯片作为数据总线收发器,将STM32的GPIO信号传输到数码管。
3.2 七段数码管的接线与控制
每个七段数码管有7个LED段(A-L),每个段用一个GPIO端口来控制。74LS245的输出端与七段数码管的各个段连接,通过发送不同的控制信号,数码管可以显示数字。
3.3 Proteus 8仿真连接示意图(附图)
以下是Proteus 8仿真连接图:
硬件连接与接线图解释:
这张图展示了STM32F103R6开发板与74LS245驱动芯片及七段数码管的连接。下面是每个部分的详细解释:
1. STM32F103R8开发板
-
STM32的GPIO引脚(PA0-PA15,PB0-PB15)用于连接外部设备。在这张图中,STM32的GPIO引脚与74LS245芯片的输入端(A端口)相连接,用于发送数字信号到74LS245。
2. 74LS245芯片
-
74LS245是一个八位双向数据总线收发器,用于从STM32开发板传输数据到七段数码管的显示控制端。STM32通过74LS245的A端口将信号送到其B端口,从而控制显示器的各个段。
-
74LS245的CE端(芯片使能端)控制数据是否传输。通常,CE端保持激活状态,以便数据能传输到显示器。
3. 七段数码管
-
每个七段数码管由七个LED段(A-L)组成,用于显示数字或字母。在这张图中,74LS245芯片的输出(B端口)直接连接到七段数码管的各个段(A-L)。
-
通过控制这些段的开关,数码管可以显示不同的数字。例如,当某些段亮起时,显示数字“1”;其他段亮起时,显示数字“8”等。
4. 连接关系总结
-
STM32通过GPIO引脚控制74LS245芯片的输入端(A端),将数字信号发送到74LS245。
-
74LS245的输出端(B端)连接到数码管的七个段,每个段控制数码管的显示。
-
通过改变STM32发送到74LS245的数据,进而控制数码管的显示内容,从而在数码管上显示不同的数字。
4. 代码实现
4.1 Keil uVision5代码编写
4.1.1 GPIO初始化
STM32的GPIO端口控制七段数码管的显示,需要初始化相关的GPIO口。
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); // 启用GPIOC时钟
GPIO_InitStructure.GPIO_Pin = 0xffff; // 配置PC0-PC15引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 配置为推挽输出模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 设置GPIO速度为50MHz
GPIO_Init(GPIOC, &GPIO_InitStructure); // 初始化GPIOC端口
4.1.2 74LS245驱动配置
74LS245芯片的控制信号需要配置,以便传输数据到数码管。通过控制输入端A,将数字编码传送到B端,然后通过B端控制数码管。
// 设置74LS245为输出模式,控制数码管的段
GPIO_Write(GPIOC, temp);
4.1.3 数码管显示逻辑实现
根据输入的数字,生成相应的七段显示编码,并通过GPIO输出到74LS245,控制显示器的显示。
uint16_t table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f}; // 数字0-9的七段编码
uint16_t disp[2];
uint16_t temp, i;
while(1)
{
for(i = 0; i <= 9; i++)
{
disp[1] = table[i / 10]; // 高位显示
disp[0] = table[i % 10]; // 低位显示
temp = (disp[1] << 8) | (disp[0] & 0x0ff); // 拼接显示的数值
GPIO_Write(GPIOC, temp); // 输出到GPIOC
Delay(100); // 延时
}
}
4.2 代码详细分析
4.2.1 数码管的控制原理
通过控制GPIO引脚的电平,我们可以打开或关闭七段数码管的每个LED段。每个段对应一个数字的显示,例如“8”需要所有段都亮起,而“1”只需要显示“B”和“C”两段。
4.3 完整代码展示(附代码)
#include "stm32f10x.h"
uint16_t table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f}; // Table for displaying digits 0 to 9 in 7-segment encoding
uint16_t disp[2];
uint16_t temp, i;
void Delay(unsigned int count) // Delay function
{
unsigned int i;
for(; count != 0; count--)
{
i = 500;
while(i--);
}
}
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); // Enable GPIOC clock
GPIO_InitStructure.GPIO_Pin = 0xffff; // Configure PC0-PC15 pins
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // Set pins to push-pull output mode
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // Set GPIO speed to 50MHz
GPIO_Init(GPIOC, &GPIO_InitStructure); // Initialize GPIOC
while(1)
{
// Loop through digits to display on 7-segment display
for(i = 0; i <= 20; i++)
{
disp[1] = table[i / 10]; // Display the high digit
disp[0] = table[i % 10]; // Display the low digit
temp = (disp[1] << 8) | (disp[0] & 0x0ff); // Combine the high and low digits
GPIO_Write(GPIOC, temp); // Output to GPIOC
Delay(100); // Wait for a while before displaying the next number
}
}
}
5. 仿真与调试
5.1 在Proteus中进行仿真
Proteus仿真环境能够帮助我们在不需要实际硬件的情况下测试代码。通过仿真,可以查看数码管显示的数字是否与预期一致。
5.2 调试常见问题与解决方法
-
问题:数码管不显示任何数字。
-
解决方案:检查74LS245的连接是否正确,确保数据从STM32正确传输到显示器。
-
-
问题:显示的数字不正确。
-
解决方案:检查数字编码表(table)中的值,确保每个数字对应正确的七段编码。
-
5.3 仿真结果展示

更多推荐



所有评论(0)