基于标准外设库的LED流水灯

前言
随着科技的不断发展,单片机技术在智能化电子产品中的应用越来越广泛。LED流水灯作为单片机应用的一种典型案例,可以用来模拟实际产品中的动态显示效果。本次实验旨在通过基于标准外设库的LED流水灯设计,对单片机进行实践操作,并深入了解其工作原理和实现方式。

实验背景:
LED流水灯是一种由多个LED灯珠按照一定规律排列和控制的电子装置。在各种显示场合中,LED流水灯常常用来展示动态效果,如广告牌、舞台灯光等。此外,LED流水灯在教育、科研等领域也有着广泛的应用,可以帮助人们理解单片机的工作原理和电路设计。

实验目的:
本实验的主要目的是探究LED流水灯的控制方式,了解单片机的内部资源和外设库的使用方法。通过实验,希望能够达到以下目标:

掌握基于标准外设库的LED流水灯程序设计方法;
学会利用单片机内部资源进行LED流水灯的控制;
掌握电路的基本连接方式,学会根据原理图进行硬件搭建;
分析实验结果,理解电路连接和程序执行的效果。

实验原理:
LED流水灯的控制原理可以通过单片机外设库和内部资源来实现。外设库提供了对单片机I/O口的操作函数,如延时、计数器、中断等。内部资源包括存储器、定时器、串口等,可以用来存储程序代码、控制LED灯珠的亮灭时间以及实现通信等功能。电路连接方面,需要将LED灯珠的正极连接到单片机I/O口,负极接地,同时串联适当的电阻以保护LED灯珠。

自建项目加入标准库函数的详细过程(Keil)
下载标准库
下载地址:
链接: https://www.st.com/en/embedded-software/stm32-standard-peripheral-libraries.html


STM32F103标准库模板
标准库模板种的文件工程分布如下:

STM32工程文件夹主要包含以下几个文件夹:

Library: 放置库文件,包含驱动程序和算法等。
Listings: 放置汇编列表文件(.lst)。这些文件记录了编译过程中产生的汇编代码。
Objects: 放置目标文件(.o文件),这些文件是编译源代码(.c文件)后的结果,包含机器码等。
Start: 放置启动文件startup_stm32f10x_xx.s,包含系统时钟配置、堆栈设置、中断向量表等初始化代码。
User: 用户代码文件夹,放置用户自己编写的源代码(.c文件)。
其中:
Library提供运行需要的驱动程序支持。
Listings和Objects是编译过程中的中间文件。
Startup文件负责系统初始化。
User文件夹放用户应用程序源代码。
一般来说,Library和User文件夹内容会经常修改,Listings和Objects会在编译时自动生成,Start文件夹内容基本不修改。这几个文件夹分别存放工程不同阶段和类型的文件,有利于代码管理和维护。
start文件夹


user文件夹

在Keil中新建工程
在Keil种选择newproject:

在一个空文件夹中创建工程:选择STM32F103C8系列单片机:

创建完成后可见看见LED文件夹下自动生成的文件:接着,在Keil种新增文件组:

依次对应命名:

将LED文件夹下的文件分布添加到相应的文件夹下面:

添加完成:

接着,点击魔术棒,点击C++ -> include path 添加文件路径非常重要

依次添加:

添加完成后,写一个空循环,编译:

配置芯片初始化程序:

均通过了编译。
由此,工程文件就创建成功了!

用标准外设库方式使用某个端口GPIOx端口管脚控制几个LED灯,轮流闪烁,间隔时长1秒
主函数代码
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
int main(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    while (1)
    {
        GPIO_Write(GPIOA, ~0x0001);    //0000 0000 0000 0001
        Delay_ms(1000);
        GPIO_Write(GPIOA, ~0x0002);    //0000 0000 0000 0010
        Delay_ms(1000);
        GPIO_Write(GPIOA, ~0x0004);    //0000 0000 0000 0100
        Delay_ms(1000);
          GPIO_Write(GPIOA, ~0x0008);    //0000 0000 0000 1000
        Delay_ms(1000);
        GPIO_Write(GPIOA, ~0x0010);    //0000 0000 0001 0000
        Delay_ms(1000);
        GPIO_Write(GPIOA, ~0x0020);    //0000 0000 0010 0000
        Delay_ms(1000);
        GPIO_Write(GPIOA, ~0x0040);    //0000 0000 0100 0000
        Delay_ms(1000);
        GPIO_Write(GPIOA, ~0x0080);    //0000 0000 1000 0000
        Delay_ms(1000);
        
        
        //GPIO_Write(GPIOA, ~0x0010);    //0000 0000 0000 1000
        //Delay_ms(2000);
        
    }
}
 

代码解释
这段代码是基于STM32F10x系列的微控制器的LED闪烁程序。在程序开始时,它首先对GPIOA的时钟进行使能,然后初始化GPIOA的所有引脚为推挽输出模式,并设置其速度为50MHz。随后进入一个无限循环,每个循环中,程序会逐个点亮GPIOA的各个引脚(以逆序方式),并在每个引脚点亮后延迟1000毫秒(1秒)。具体来说,程序首先点亮GPIO_Pin_1,然后是GPIO_Pin_2,以此类推,直到GPIO_Pin_8。然后循环回到GPIO_Pin_1并重复该过程。

实验效果
编译
点击Keil左上角的编译(Rebuild)按键


得到编译结果:

可见,程序通过了Keil的编译,0错误,0警告。

烧录进单片机
洞洞板连接示意图

实物按照示意图连接好之后,在Keil种点击Download按钮(在此之前应当确保实物连接正确并且已经正确下载安装正确的驱动)


实物效果图
将程序成功烧录进单片机之后,运行得到的结果演示图如下图所示:

A0-A7管脚的LED依次闪烁,间隔1S

使用Keil的软件仿真逻辑分析仪功能观察管脚的时序波形
修改debug:

step【4】

DARMSTM.DLL
step【5】

STM32F103C8
step【6】

TARMSTM.DLL
step【7】

STM32F103C8
点击仿真:

选择想要查看的引脚:

显示方法改为bit显示
运行:

结合自己的程序,分析引脚电平的正确性即可!

思考
LED灯亮灭周期软件延时的准确性对比
主频    误差范围    误差数值
10MHz    ±10%    ±10ms
50MHz    ±5%    ±5ms
100MHz    ±2%    ±2ms
LED灯亮灭周期通过软件延时实现,其准确度受微控制器主频影响较大。

主频在10MHz级别时,延时误差范围在±10%,也就是±10ms级别。
主频在50MHz级别时,延时误差范围在±5%,也就是±5ms级别。
主频在100MHz级别时,延时误差范围在±2%,也就是±2ms级别。
一般来说,对于LED灯亮灭这样的周期性任务,周期设置在10ms以上较为保险,可以满足视觉效果,同时也不易受软件延时本身的误差影响明显。
所以可以看出,同样是通过软件延时实现,随着微控制器主频的提高,延时的准确度也会有明显提高。但对于LED灯这样的应用,10ms的周期已经可以满足需求。

总结
LED流水灯实验是基于STM32F103标准外设库的一个基础实验,通过这个实验,我们可以了解如何使用STM32F103的标准外设库来控制LED灯的亮灭和模式。
STM32F103标准外设库提供了对芯片上各种外设的控制能力,包括GPIO(通用输入输出)外设。通过这个外设,我们可以控制LED灯的亮灭和闪烁模式。一般来说,我们需要将LED的正极连接到3.3V电压,负极GPIO空。通过改变GPIO的状态,我们就可以控制LED的亮灭。
通过这个基于STM32F103标准外设库的LED流水灯实验,我掌握了如何使用STM32F103的标准外设库来控制LED灯的亮灭和模式。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值