基于标准外设库的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
在这里插入图片描述
在这里插入图片描述
或者,笔者在此直接给出标准库的模板:
链接: https://pan.baidu.com/s/1OO3scQLltz645Q0DXpa5ig?pwd=sae8

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文件夹
在这里插入图片描述
Library文件夹
在这里插入图片描述

在Keil中新建工程

在Keil种选择newproject:
在这里插入图片描述
在一个空文件夹中创建工程:
在这里插入图片描述
选择STM32F103C8系列单片机:
在这里插入图片描述
创建完成后可见看见LED文件夹下自动生成的文件:
在这里插入图片描述

接着,将工程模板的文件(User,Start,Library)拷贝到LED文件夹下面:
在这里插入图片描述
接着,在Keil种新增文件组:
在这里插入图片描述
依次对应命名:
在这里插入图片描述
将LED文件夹下的文件分布添加到相应的文件夹下面:
在这里插入图片描述
选择All Files
在这里插入图片描述
添加完成:
在这里插入图片描述
接着,点击魔术棒,点击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灯的亮灭和模式。我学习了如何初始化和配置GPIO和定时器,并编写了简单的延时函数。在主循环中,我使用定时器生成延时,然后改变GPIO的状态,实现LED灯的亮灭和闪烁。这个实验不仅让我理解了STM32F103标准外设库的使用方法,也增强了我的编程和调试能力。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
第一章:AVR单片机C语言程序设计概述 1.1 AVR单片机简介 1.2 AVR Studio+WinAVR开发环境安装及应用 1.3 AVR-GCC程序设计基础 1.4 程序与数据内存访问 1.5 I/O端口编程 1.6 外设相关寄存器及应用 1.7 中断服务程序 1.8 GCC在AVR单片机应用系统开发中的优势 第二章:PROTEUS操作基础 2.1 PROTEUS操作界面简介 2.2 仿真电路原理图设计 2.3 元件选择 2.4 仿真运行 2.5 PROTEUS与AVR Studio的联合调试 2.6 PROTEUS在AVR单片机应用系统开发中的优势 第三章:基础程序设计 3.1 闪烁的LED 3.2 左右来回的流水 3.3 花样流水 3.4 LED模拟交通 3.5 单只数码管循环显示0~9 3.6 8只数码管滚动显示单个数字 3.7 8只数码管显示多个不同字符 3.8 K1~K4控制LED移位 3.9 数码管显示4×4键盘矩阵按键 3.10 数码管显示拨码开关编码 3.11 继电器控制照明设备 3.12 开关控制报警器 3.13 按键发音 3.14 INT0中断计数 3.15 INT0及INT1中断计数 3.16 TIMER0控制单只LED闪烁 3.17 TIMER0控制的流水 3.18 TIMER0控制数码管扫描显示 3.19 TIMER1控制交通指示 3.20 TIMER1与TIMER2控制十字路口秒计时显示屏 3.21 用工作于计数方式的T/C0实现100以内的按键计数 3.22 用定时器设计的门铃 3.23 报警器与旋转 3.24 100000秒以内的计时程序 3.25 用TIMER1输入捕获功能设计的频率计 3.26 用工作于异步模式的T/C2控制的可调式数码管电子钟 3.27 TIMER1定时器比较匹配中断控制音阶播放 3.28 用TIMER1输出比较功能调节频率输出 3.29 TIMER1控制的PWM脉宽调制器 3.30 数码管显示两路A/D转换结果 3.31 模拟比较器测试 3.32 EEPROM读写与数码管显示 3.33 Flash程序空间中的数据访问 3.34 单片机与PC机双向串口通讯仿真 3.35 看门狗应用 第四章:硬件应用 4.1 74HC138与74HC154译码器应用 4.2 74HC595串入并出芯片应用 4.3 用74LS148与74LS21扩展中断 4.4 62256扩展内存 4.5 用8255实现接口扩展 4.6 可编程接口芯片8155应用 4.7 可编程外围定时计数器8253应用 4.8 数码管BCD解码驱动器7447与4511应用 4.9 8×8LED点阵屏显示数字 4.10 8位数码管段位复用串行驱动芯片MAX6951应用 4.11串行共阴显示驱动器MAX7219与7221应用 4.12 16段数码管演示 4.13 16键解码芯片74C922应用 4.14 1602字符液晶测试程序 4.15 1602液晶显示DS1302实时时钟 4.16 1602液晶工作于四位模式实时显示当前时间 4.17 2×20串行字符液晶演示 4.18 LGM12864液晶显示程序 4.19 PG160128A液晶图文演示 4.21 TG126410液晶串行模式演示 4.21 用带SPI接口的MCP23S17扩展16位通用IO端口 4.22 用TWI接口控制MAX6953驱动4片5×7点阵显示器 4.23 用TWI接口控制MAX6955驱动16段数码管显示 4.24 用DAC0832生成多种波形 4.25 用带SPI接口的数模转换芯片MAX515调节LED亮度 4.26 正反转可控的直流电机 4.27正反转可控的步进电机 4.28 DS18B20温度传感器测试 4.29 SPI接口温度传感器TC72应用测试 4.30 SHT75温湿度传感器应用 4.31 用SPI接口读写AT25F1024 4.32 用TWI接口读写24C04 4.33 MPX4250压力传感器测试 4.34 MMC存储卡测试 4.35 红外遥控发射与解码仿真 第五章:综合设计 5.1 多首电子音乐的选播 5.2 电子琴仿真 5.3 普通电话机拨号键盘应用 5.4 手机键盘仿真 5.5 数码管模拟显示乘法口诀 5.6 用DS1302与数码管设计的可调电子钟 5.7 用DS1302与LGM12864设计的可调式中文电子日历 5.8 用PG12864LCD设计的指针式电子钟 5.9 高仿真数码管电子钟 5.10 1602LCD显示的秒表 5.11 用DS18B20与MAX6951驱动数码管设计的温度报警器 5.12 用1602LCD与DS18B20设计的温度报警器 5.13 温控电机在L298驱动下改变速度与方向运行 5.14 PG160128中文显示日期时间及带刻度显示当前温度 5.15 液晶屏曲线显示两路模数转换结果 5.16 用74LS595与74LS154设计的16×16点阵屏 5.17 用8255与74LS154设计的16×16点阵屏 5.18 8×8LED点阵屏仿电梯数字滚动显示 5.19 用内置EEPROM与1602液晶设计的MD5加密电子密码锁 5.20 12864LCD显示24C08保存的开机画面 5.21 12864LCD显示EPROM27C256保存的开机画面 5.22 IIC-AT24C1024×2硬字应用 5.23 SPI-AT25F2048硬件字应用 5.24 带液晶显示的红外遥控调速仿真 5.25 能接收串口信息的带中英文硬字的80×16点阵显示屏 5.26 用AVR与1601LCD设计的计算器 5.27 电子秤仿真设计 5.28 模拟射击训练游戏 5.29 PC机通过485远程控制单片机 5.30 用IE访问AVR+RTL8019设计的以太网应用系统
利用stm32CubeMX,配合Keil,完成LED流水作业,即用GPIO端口完成3只LED红绿的周期闪烁。完成一个STM32的USART串口通讯程序.zip嵌入式优质项目,资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松copy复刻,拿到资料包后可轻松复现出一样的项目。 本人单片机开发经验充足,深耕嵌入式领域,有任何使用问题欢迎随时与我联系,我会及时为你解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明,项目具体内容可查看下方的资源详情。 【附带帮助】: 若还需要嵌入式物联网单片机相关领域开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步。 【本人专注嵌入式领域】: 有任何使用问题欢迎随时与我联系,我会及时解答,第一时间为你提供帮助,CSDN博客端可私信,为你解惑,欢迎交流。 【建议小白】: 在所有嵌入式开发中硬件部分若不会画PCB/电路,可选择根据引脚定义将其代替为面包板+杜邦线+外设模块的方式,只需轻松简单连线,下载源码烧录进去便可轻松复刻出一样的项目 【适合场景】: 相关项目设计中,皆可应用在项目开发、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面中 可借鉴此优质项目实现复刻,也可以基于此项目进行扩展来开发出更多功能

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值