32单片机 小项目1-跑马灯

发布时间:2026/11/2 16:16:50

32单片机 小项目1-跑马灯 一、前言前两篇分别记录了无封装单灯、无封装多路流水灯今天我尝试做了简单工程分层新建Hardware文件夹存放LED驱动文件把引脚初始化、点灯控制逻辑封装成独立函数代码整洁很多。依旧是初学阶段封装思路比较基础有写得不合理、不规范的地方欢迎各位大佬指点。二、实验目标学会简单工程分层区分驱动文件与主程序​掌握GPIO初始化封装、独立引脚控制函数编写​实现5路LED依次点亮流动的跑马灯效果。三、本地工程真实结构工程新增Hardware文件夹整体目录Start启动文件底层初始化​LibrarySTM32标准外设库​System系统延时、时钟工具​Hardware本次新建存放LED.c、LED.h驱动文件​User仅存放main.c主逻辑不再堆砌初始化代码。四、硬件说明五路LED分别对应PA0、PA1、PA2、PA3、PA4传入参数1代表点亮LED0代表熄灭每路LED串联220Ω限流电阻保护。五、完整代码1.main.c主函数#includestm32f10x.h// Device header#includedelay.h#includeLED.h//Îå¸öµÆÅÝ·Ö±ðÁ¬A0,A1,A2,A3,A4intmain(){led_init();while(1){led2(1);Delay_ms(500);led2(0);led1(1);led3(1);Delay_ms(500);led1(0);led3(0);led0(1);led4(1);Delay_ms(500);led0(0);led4(0);}}2.Hardware/LED.c#includestm32f10x.h// Device headervoidled_init(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_ModeGPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_PinGPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;GPIO_InitStruct.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_InitStruct);GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4);}//µÆÅݲÙ×÷º¯Êý£¬0ÊDz»ÁÁ£¬1ÊÇÁÁvoidled0(uint16_tx){if(x0)GPIO_SetBits(GPIOA,GPIO_Pin_0);if(x1)GPIO_ResetBits(GPIOA,GPIO_Pin_0);}voidled1(uint16_tx){if(x0)GPIO_SetBits(GPIOA,GPIO_Pin_1);if(x1)GPIO_ResetBits(GPIOA,GPIO_Pin_1);}voidled2(uint16_tx){if(x0)GPIO_SetBits(GPIOA,GPIO_Pin_2);if(x1)GPIO_ResetBits(GPIOA,GPIO_Pin_2);}voidled3(uint16_tx){if(x0)GPIO_SetBits(GPIOA,GPIO_Pin_3);if(x1)GPIO_ResetBits(GPIOA,GPIO_Pin_3);}voidled4(uint16_tx){if(x0)GPIO_SetBits(GPIOA,GPIO_Pin_4);if(x1)GPIO_ResetBits(GPIOA,GPIO_Pin_4);}3.Hardware/LED.h#ifndef__LED_H#define__LED_Hvoidled_init(void);voidled0(uint16_tx);voidled1(uint16_tx);voidled2(uint16_tx);voidled3(uint16_tx);voidled4(uint16_tx);#endif六、粗浅学习感悟第一次尝试分层封装把硬件驱动放到单独Hardware文件夹主函数变得特别简洁可读性提升很多​把每个LED控制写成独立函数主程序只需要调用不用重复写GPIO操作代码​本次跑马灯不是逐个单灯流动而是中间1个亮→中间2个亮→两边一起亮自己设计的灯光流动逻辑熟悉多灯同时点亮控制​目前封装方式还比较冗余五个led函数逻辑高度重复之后学习数组、循环后可以简化代码。七、本次踩坑记录新建Hardware分组后没添加路径编译提示找不到LED.h头文件​头文件忘记加#ifndef防重复包含出现重复定义报错​延时函数大小写写错Delay_ms写成delay_ms直接编译报错​高低电平搞反传入1反而熄灭灯光调试很久才修正逻辑。
延伸阅读

更多相关文章

2026/11/1 16:23:56

Java Web开发实战:从基础到进阶的典型问题解析

1. Java Web开发基础概念解析Java Web开发是构建动态网站的核心技术栈,它基于Java EE规范,通过Servlet、JSP等技术实现服务器端逻辑处理。很多初学者容易混淆一些基本概念,这里我用实际项目中的经验帮你理清思路。首先明确一点:动…

2026/11/2 16:12:51

Qt数据库开发实战:从基础操作到高级应用

1. Qt数据库开发实战概述在桌面应用开发领域,数据库操作几乎成为标配功能。作为跨平台框架的Qt,提供了一套完整的数据库操作类库,让开发者能够以统一的方式处理各种数据库。我经历过多个Qt数据库项目的完整生命周期,从简单的SQLit…

2026/11/2 16:12:51

2026年主流视频转文字工具评测与使用技巧

1. 视频转文字工具的价值与现状 2026年的今天,视频内容已经占据了互联网流量的85%以上,但文字依然是信息检索和内容消化的主要形式。作为一名长期与视频内容打交道的从业者,我深刻体会到视频转文字工具的重要性。记得去年为了整理一场3小时的…

2026/11/2 16:12:51

Burpsuite越权漏洞实战与防御指南

1. 越权漏洞实战解析与Burpsuite靶场通关指南越权漏洞(Broken Access Control)长期占据OWASP Top 10安全风险前三名,我在渗透测试项目中遇到的90%系统都存在这类问题。Burpsuite官方靶场作为业界公认的实战训练场,其越权漏洞场景设…

2026/11/2 16:12:51

C++多态基类为何需要virtual析构函数?

1. 为什么多态基类需要virtual析构函数?1.1 从内存泄漏说起上周排查一个内存泄漏问题时,发现一个典型场景:通过基类指针删除派生类对象时,如果基类析构函数非virtual,只会调用基类的析构函数。这直接导致派生类成员未被…

2026/11/2 16:12:51

SG3525推挽升压逆变器电路图拆解:从PWM到220V正弦波

简介:这份SG3525逆变器电路图资料面向电子工程师、电源设计爱好者及电类专业学生,聚焦以SG3525脉宽调制控制器为核心的逆变方案,解决将10.5~14.5V低压直流转换为220V正弦波交流、驱动200W负载的设计参考问题,适合具备一…

2026/11/2 16:07:48

MATLAB特征值入门:三行代码看懂数据的‘性格说明书’

简介:本资源是一份面向MATLAB初学者与工科高年级学生的矩阵分析专项学习文档,聚焦特征值与特征向量、矩阵对角化、实对称矩阵正交对角化、若当标准形等核心线性代数计算实践。内容以高校数值分析或矩阵论实验为背景,完整覆盖实验目的、原理推…

2026/11/2 6:08:01

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/2 6:39:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 1:04:04

工业级SPI隔离设计:硬件抗扰与信号完整性实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 1:04:04

PLFM_RADAR:主动探测数据通道,构建低误报的数据感知系统

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 1:04:04

工业SPI隔离设计:MAX14431与STM32F746硬件抗干扰实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 6:08:01

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/2 6:39:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑