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

内  容:编写代码实现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博客_清除中断标志位

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值