STM32/51单片机实训day3——点亮LED灯、闪烁LED灯(二)实践

news2025/1/13 13:27:41

内  容:编写代码实现LED灯的点亮功能

学  时:2学时

知识点:分析原理图、LED灯控制原理

重点:GPIO参数配置、LED原理图分析

难点:编写 GPIO参数配置函数、LED点亮函数

时间:2022年12月21日 9:00~11:50 

总结:​​​​​​​​​​​​​​

1 通过原理图分析LED灯硬件结构

2 定义初始化GPIO引脚的结构体,并配置LED的GPIO引脚;

3 编写LED点亮程序,下载到proteus电路中进行仿真。

内  容:编码实现LED灯闪烁

学  时:2学时

知识点:LED灯控制原理延时函数的编写

重点: LED的点亮和熄灭控制

难点:延时函数的编写

时间:2022年12月21日 13:30~16:20

总结:

1 定义LED灯的点亮和熄灭操作函数;

2 利用for循环实现延时函数的编写;

3 编写LED闪烁函数下载Proteus仿真。

目录

1 LED电路设计 ​​​​​​​

2 代码实现

2.1 GPIO参数配置

代码如下:

2.2 主函数实现

代码如下:

3生成单片机运行的文件

3.1 生成HEX文件

4 proteus功能仿真

5 LED灯控制原理

6 延时函数编写

7 主函数实现

代码如下:

8 proteus功能仿真

“error:conflicting types for XXX”错误及处理方法

"cannot open source input file"的问题解决方法 


1 LED电路设计 ​​​​​​​

        LED电路图设计如下图所示,由于二极管具有单向导通性的特点,LED右端为高电平VCC,所以点亮LED只需要保证LED左端为低电平即可,为保证LED不会因为电流过大而烧毁,电路中增加了R3电阻进行电流限制。LED左侧接到了PB15,因此点亮LED只需要将PB15设置为低电平即可。

图1 LED电路

2 代码实现

2.1 GPIO参数配置

        在main.c中编写LED的配置函数,调用库函数配置LED管脚的相关参数,在配置参数之前,需要调用时钟使能函数GPIOB的端口时钟进行使能;只有使能端口后相关参数的配置才能生效。GPIO_InitTypeDef结构体包含了GPIO所需配置的所有参数,因此配置GPIO主要是调用GPIO_InitTypeDef对其内部的元素进行配置。

代码如下:

void led_init(void)
{
// LED引脚初始化
GPIO_InitTypeDef GPIO_InitStruct;
 
// 开启引脚时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
 
// PB15
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_15;    // 指定LED引脚
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; // 设置引脚为通用推挽输出模式
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;// 设置引脚输出速率为50MHz
GPIO_Init(GPIOB, &GPIO_InitStruct);    // 使引脚设置生效

// LED开始亮
GPIO_ResetBits(GPIOB, GPIO_Pin_15);  // LED ON
}

2.2 主函数实现

        在main.c中编写实现主函数;

代码如下:

/* main.c */  
int main(void)
{
   led_init();//led初始化!一定要记得初始化!!
   while(1)
   {
       GPIO_ResetBits(GPIOB, GPIO_Pin_15); // LED ON
   }
}

3生成单片机运行的文件

        直接烧写进STM32/C51芯片的文件是HEX文件,所以要通过KEIL把源代码编译成HEX文件。

3.1 生成HEX文件

        选择Output(输出),把Create HEX File 勾上,点击OK。

        然后在工具栏上点击编译按钮就可以了。

        然后打开项目所在文件夹,然后发现.hex文件,如果没有,看看当前文件夹下有没有Objects文件夹,hex也有可能在Objects文件夹里生成;然后通过烧写软件就可以把HEX文件烧到STM32/C51芯片中。

4 proteus功能仿真

        编译好的工程文件,需要下载到proteus电路中进行仿真,双击STM32F103R6元器件,出现如下图所示内容,将晶振频率设置为8MHz,选择编译好的hex文件,点击OK即可。

图2 Hex文件下载​​​​​​​

        点击运行按钮,程序即可运行,LED灯点亮,如下图所示。若想退出运行模式,可点击按钮。

 图3 LED点亮效果图

仿真启动后,搭好的电路模型连接点通常会出现颜色块,不同颜色块的含义如下:

红色——高电平;

蓝色——低电平;

灰色——没有电平或者不稳定;

黄色——短路。


5 LED灯控制原理

        要想点亮LED,只需要将LED连接的PB15管脚设置为低电平即可,熄灭LED只需要将LED连接PB15管脚设置为高电平即可,本任务涉及的代码在任务9代码基础上实现。

6 延时函数编写

        在main.c中编写for循环实现延时函数,实现延时操作。

// 延时函数
void delay(void)
{
uint32_t cnt = 0x20000;
while(cnt--); // cnt-- --> cnt = cnt - 1
}

7 主函数实现

        在main.c中编写LED闪烁功能程序;LED闪烁的功能主要实现的原理是驱动LED点亮一段时间后,再驱动LED熄灭一段时间,程序反复执行,便可产生LED闪烁的现象。  

代码如下:

int main(void)
{
led_init();      // LED初始化
 while (1)
 {
 
 GPIO_SetBits(GPIOB, GPIO_Pin_15);  // LED OFF
 delay();
 GPIO_ResetBits(GPIOB, GPIO_Pin_15); // LED ON
 delay();  
}

8 proteus功能仿真

        将编译好的工程文件下载到proteus电路中进行仿真,点击运行按钮可查看仿真效果,同时可通过修改延时函数中延时时间来控制LED灯亮灭的时长。


“error:conflicting types for XXX”错误及处理方法

原因一:
原来是因为没有先做函数声明,而函数位于main()之后。
在main函数前声明了函数原型后,一切ok。

原因二:

头文件的被循环引用,在引用时考虑清楚包含顺序。

原因三:

头文件声明和定义参数稍有不同

例:

 头文件中声明 void Hanlder(const char * buf);

 在定义时写作 void Hanlder(char * buf);

"cannot open source input file"的问题解决方法 

添加路径:

proteus入门教程_贝勒里恩的博客-CSDN博客_proteus使用教程

Proteus20个应用技巧_丁老师的技术随笔的博客-CSDN博客_proteus应用技术课程考试

关于中断标志位清零_qq_54529723的博客-CSDN博客_清除中断标志位

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/117784.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何轻松做数据治理?开源技术栈告诉你答案

搭建一套数据治理体系耗时耗力,但或许我们没有必要从头开始搞自己的数据血缘项目。本文分享如何用开源、现代的 DataOps、ETL、Dashboard、元数据、数据血缘管理系统构建大数据治理基础设施。 元数据治理系统 元数据治理系统是一个提供了所有数据在哪、格式化方式…

vue2.0中集成并使用ueditor,解决第一次编辑器正常加载,第二次就不加载的问题,父组件调用子组件的方法

vue2.0中集成并使用ueditor 最近有项目需要使用编辑器,就找了一款百度的ueidtor编辑器,第一次用各种不会,所以记录一下 下面的链接就是ueditor的前后端的配置说明和API等 链接: ueidtor的API 下载ueidtor 下载最新版的1.5.0版本&#xf…

基于Flask+bootstrap+sqlite开发宝宝成长管理系统,宝宝成长记录系统源码

BabyLog 岁月如风,唯有此忆, 任凭时光匆匆,记录点点滴滴。 当爸爸了,就多陪陪孩子,有事没事的记些东西,不要总把心思放在程序编码上,也多陪陪孩子! 记录了那么多条数据,是时候也为…

Linux之Shell脚本学习笔记(持续更新中......)

Shell是什么 命令解释器。为用户提供了一个向Linux内核发送请求一i按运行程序的界面系统级程序。 Shell编程快速入门 脚本格式要求 脚本以#!/bin/bash开头脚本需要有可执行权限 编写脚本,输出HelloWorld 编写 #!/bin/bash echo "hello world!"执行 …

Stm32开发1-蓝牙实现STM32的无线烧写程序 ISP模式 串口1不受影响 无线下载

最近研究如何实现Stm32的无线烧写程序。从CSDN上看到大部分的无线烧写方法,大都是采用ESP8266CMSIS-DAP的方式,其能下载也能调试程序,也能通过虚拟串口通信。但是其串口应该是用软件实现的,会占用系统资源,对于其能否实…

【unity3D】DoTween动画插件(上)

💗 未来的游戏开发程序媛,现在的努力学习菜鸡 💦本专栏是我关于游戏开发的学习笔记 🈶本篇是unity的DoTween动画插件 DoTween动画插件(上)基础知识一些常用方法DOMove和DoLocalMovefrom TerrnsDOText打字机…

JavaScript篇.day04-函数, 对象类型

目录 1.函数 2.对象类型 3.例题 (1)斐波拉契数列(递归) (2)猴子吃桃(递归) (3)求100内的数之和(递归) 1.函数 函数: 是完成某个功能的代码块 函数声明 function 函数名(){ }function 函数名(形参1, 形参2...){ }函数表达式: var 函数名 function(){ } 匿名函数 …

springdata-Jpa-04原理

Repository原理 核心机制: 动态代理 : JdkDynamicAopProxy#invoke 调用JPA的Repository统一实现 SimpleJpaRepository 就是去通过JPA的API完成的持久化操作 Spring整合jpa原理 Spring怎么管理Repository( 怎么创建的Repository的Bean) 1.EnableJpaRep…

多线程与高并发(15)——线程池详解(非源码层面)

通过之前的一篇文章,我们总结了Executor框架。而在Executor框架中,ThreadPoolExecutor 是最核心的类。 ThreadPoolExecutor 看字面意思,是线程池的执行器。我们本篇文章就基于ThreadPoolExecutor 这个类来展开总结线程池。 下篇文章会从源码的…

java之线程同步和线程之间的通信

线程同步的概念: 由于同一个进程的多个线程共享同一块存储空间,在带来方便的同时,也会带来访问冲突的问题: 举例: public class Runnable_test implements Runnable {//实现Runnable接口 private int ticknumbers10;Overridepublic void …

【C++】——数据类型(二)

文章目录2. 数据类型2.1 整型2.2 sizeof关键字2.3 浮点型2.3.1 浮点数表示——小数点表示法2.3.2 浮点数表示——E表示法2.3.3 浮点数类型2.4 字符型2.5 转义字符2.6 字符串型2.7 布尔类型bool2. 数据类型 2.1 整型 整数就是没有小数部分的数字,如2、98、 -5286 和…

【机器学习】模型评估与选择(实战)

模型评估与选择(实战) 目录一、准备工作(设置 jupyter notebook 中的字体大小样式等)二、数据集读取与查看三、交叉验证实验1、划分数据集并置乱2、设计交叉验证实验3、进行训练(采用随机梯度下降分类器)4、…

推荐一款数据可视化分析工具

当今时代数据分析的发展,导致数据可视化成为企业必不可少的一部分,进而市面上也就涌现出各种丰富多彩的工具。传统的Excel无疑是数据可视化工具的典型,我们平时经常使用Excel制作简单表格,简单、方便,但是复杂一点的可…

酒业崛起一支奇兵,009将自信走向全球

“天若不爱酒,酒星不在天。地若不爱酒,地应无酒泉。天地既爱酒,爱酒不愧天。”这是李白《月下独酌》中的句子,诗仙也是酒仙,已是广为人知的轶事。 中国是酒的国度,酒也是历史和文化的一种表达。正因为如此&…

【读书笔记】高级FPGA设计之面积结构设计

目录 面积结构设计 折叠流水线 基于控制的逻辑复用 资源共享 复位对面积的影响 无复位的资源 无置位的资源 无同步复位的资源 复位 RAM 利用置位/复位触发器引脚 总结 面积结构设计 本篇讨论数字设计的三个主要物理特性的第二个:面积。并分析在FPGA中结构…

【代码随想录】Day67哈希表:力扣242,383,1,349,202,454,15,18

目录 基础知识 哈希表 哈希函数 2.哈希碰撞 常见的哈希结构(三种) 数组 集合set 映射map 经典题目 数组作为哈希表 例题:力扣242 已完成 例题:力扣383 已完成 例题:力扣49 例题:力扣438 set…

小黑实习第二天,正在为hbase而头疼的leetcode之旅:671. 二叉树中第二小的节点

小黑代码(暴力) # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution:def findSecondMinimumValue(self, root: …

执照吊销了能否恢复

一、执照吊销了能否恢复 1、按照法律规定,企业法人被吊销营业执照,只是企业解散程序的开始。《公司法》规定,企业法人被吊销营业执照后应当依法进行清算,清算程序结束并办理工商注销登记后,该企业法人才归…

间隔分区表merge into报错“-2903: 语句块/包/存储函数中的间隔分区不支持自动扩展”

描述 版本: DM V8 --08134283904-20220804-166351-20005 Pack4 初始化参数: 默认 ini参数: 默认 执行间隔分区表上执行merge into语句报错,信息如下: 同样的语句,在Oracle中执行正常。 测试 创建环境&a…

Springboot利用redis缓存,结合Aop与自定义注解实现接口节流

接口的节流是开发过程中为了防止单一微服务模块突然遭受太多并发导致用户服务不流畅而产生的业务需求,就是实现在固定时间内访问同一个接口的次数也固定。开发过程中通常采用redis去作为缓存去快存快取,对于需求次数较多的数据可以存储在redis内部&#…