【嵌入式软件-STM32】按键控制LED & 光敏传感器控制蜂鸣器

目录

一、按键控制LED

【文件杂述】

【LED代码封装】

[▲ 初始化LED](#▲ 初始化LED)

1)初始化LED函数

[1.1 打开时钟](#1.1 打开时钟)

[1.2 配置端口模式](#1.2 配置端口模式)

[2) " .h "文件声明](#2) “ .h ”文件声明)

[3)" main.c"文件使用](#3)“ main.c”文件使用)

[■ 错误解决](#■ 错误解决)

▲亮灯-不受控制版

1)亮灯1.0

2)开关灯

【LED.c】定义函数

【LED.h】声明函数

【main.c】运用函数

▲亮灯-受按键控制版

对LED灯设置

【LED.c】设置函数

【LED.h】声明函数

对按键设置

1)gpio.h的库函数

2)具体实施代码

①初始化Key

【Key.c】初始化函数

【Key.h】声明函数

【main.c】初始化按键

②读取按键值的函数

【main.c】函数解析

【Key.c】函数定义

【Key.h】函数声明

【main.c】补齐头文件

③实际运用

【main.c】控制的两个版本

二、光敏传感器控制蜂鸣器

【外设简述】

【代码封装】

▲初始化Buzzer

【Buzzer.c】初始化

1.1打开闹钟

1.2设置端口模式

【Buzzer.h】声明

【main.c】初始化按键+头文件

▲蜂鸣器Buzzer-不受控版

【Buzzer.c】设置函数

【Buzzer.h】声明函数

【main.c】使用函数

▲蜂鸣器Buzzer-受控版

【Buzzer.c】设置函数

【Buzzer.h】声明函数

【main.c】使用函数

▲初始化LightSensor

【LightSensor.c】初始化

1.1打开闹钟

1.2设置端口模式

【LightSensor.h】声明

【main.c】初始化按键+头文件

▲光敏传感器LightSensor-控制蜂鸣器版

【LightSensor.c】设置函数

【LightSensor.h】声明函数

【main.c】运用函数

三、总结GPIO用法

【方法总结】

1)初始化时钟

2)定义结构体

3)赋值结构体

4)最后用GPIO_Init函数

【tips】


一、按键控制LED

【文件杂述】

重看LED正负极区分:若没剪,长正短负;内小为正,内大为负

文件Hardware:用来存放硬件驱动

创建文件LED.c & LED.h 两个文件:用来封装LED的驱动程序

文件LED.c:用来存放驱动程序的主体代码

文件LED.h:用来存放这个驱动程序可以对外提供的函数或变量的声明

该俩文件创好后还得添加必要的一些代码

  1. ".c "文件的第一行 include一个stm32f10x的头文件

2)".h"文件里添加一个防止头文件重复包含的代码

(格式固定:#ifndef_LED_H

#define_LED_H

...定义的方法...

#endif

(翻译:#if no define 如果没有定义LED这个字符串,那么#define 定义这个字符串,最后加上#endif)

#endif 是和 #ifndef 组成的括号,函数与变量声明就放在括号内

注意,文件要以空行结尾

【LED代码封装】

▲ 初始化LED

1)初始化LED函数

在".c"文件里写一个LED初始化函数 ,如下

void LED_Init(void)

{...}

该函数是用来初始化LED,里面写的是打开时钟,配置端口模式等

详细如下:

1.1 打开时钟

|----------------------------------------------------------------------------|
| |

1.2 配置端口模式

|----------------------------------------------------------------------------|
| |
| |
| |
| |
| |

2)在 " .h "文件里声明

初始化完后,对模块外部声明,这个函数是可以被外部调用的函数

到此,我们只需要调用一个LED_Init函数,LED的两个GPIO口就可以直接初始化完成了

因为这个函数式需要被外部引用的,所以需要复制一下函数的第一行,将函数第一行放在**.h 文件** 里,加上分号;

//即:void LED_Init(void);

|----------------------------------------------------------------------------|
| |

3)在" main.c"文件里补上" .h "的头文件,就可以在 " main.c "文件里使用了

然后在main.c 文件里 补充包含.h文件的头文件 (#include "LED.h")

然后在主函数里直接调用LED_Init,这样就完成了LED的初始化(LED_Init();)

|----------------------------------------------------------------------------|
| |
| |

■ 错误解决

如果产生无效预处理(关于 #include "LED.h"的),就要留意 "ifndef"、"define"跟文件名之间有空格

▲亮灯-不受控制版

1)亮灯1.0

默认低电平,所以没操作LED,LED就亮灯了

所以在LED_Init函数的最后加上(GPIO_SetBits(GPIOA,GPIO_Pin_1 |GPIO_Pin_2);)

这样初始化后,如果不操作LED,LED就是熄灭了的(其实就是置为高电平)

(即初始化最后一步)

|----------------------------------------------------------------------------|
| |

2)开关灯

**法一:**两组 LEDx_ON 跟 LEDx_OFF

最后都要放在LED.h文件中声明

【LED.c】定义函数

|----------------------------------------------------------------------------|----------------------------------------------------------------------------|
| | |

【LED.h】声明函数

|----------------------------------------------------------------------------|
| |

【main.c】运用函数

两灯交替开关

|----------------------------------------------------------------------------|
| |

**法二:**一个LED_Set函数,定义两个参数,一个参数选择操作哪个灯,另一个参数选择开还是关

▲亮灯-受按键控制版

对LED灯设置

因为先前已初始化,所以只用将写出一按键控制一灯的函数

【LED.c】设置函数

|----------------------------------------------------------------------------|
| |
| |

【LED.h】声明函数

|----------------------------------------------------------------------------|
| |

对按键设置
1)gpio.h的库函数

|----------------------------------------------------------------------------|
| |

函数GPIO_ReadInputDataBit :用来读取输入数据寄存器某一个端口的输入值

参数为 GPIOxGPIO_Pin ,用来指定某一个端口,返回值是uint8_t,代表这个端口的高低电平

为读取按键需要用到的函数

|----------------------------------------------------------------------------|
| |

函数GPIO_ReadInputData: 用来读取整个输入数据寄存器 ,参数只有一个GPIOx,用来指定外设,返回值是uint16_t,是一个16位的数据,每一位代表一个端口值

|----------------------------------------------------------------------------|
| |

函数GPIO_ReadOutputDataBit: 用来读取输出数据寄存器某一个位

(所以原则上来说,它并不是用来读取端口的输入数据的),这个函数一般用于输出模式下,用来看一下自己输出的是什么

|----------------------------------------------------------------------------|
| |

函数GPIO_ReadOutputData: 用来读取整个输出寄存器

|----------------------------------------------------------------------------|
| |

如果想读取GPIO口 的话,需要用ReadInput的这两个函数

如果在输出 模式下,要看输出什么的时候,才需要用到ReadOutput这两个函数

2)具体实施代码
①初始化Key
【Key.c】初始化函数

|----------------------------------------------------------------------------|
| |

【Key.h】声明函数

|----------------------------------------------------------------------------|
| |

【main.c】初始化按键

|----------------------------------------------------------------------------|
| |

②读取按键值的函数
**【main.c】**函数解析

|----------------------------------------------------------------------------|
| |

【Key.c】函数定义

|----------------------------------------------------------------------------|
| |
| |
| |
| |

【Key.h】函数声明

|----------------------------------------------------------------------------|
| |
| |

【main.c】补齐头文件
③实际运用
【main.c】控制的两个版本

|------------------------------------------------------------------------------------------------|
| 【两按键控制一灯】控制 1.0 |
| 【一按键控制一灯】控制 2.0 |

二、光敏传感器控制蜂鸣器

【外设简述】

**蜂鸣器:**VCC、GND接电源,控制脚接PB12号口

**光敏传感器:**VCC、GND接电源,DO数字输出端 接PB13口

上电,光敏传感器的灯会亮

当遮住光线时,输出指示灯灭,代表输出高电平;

松手时,输出指示灯亮,代表输出低电平

**电位器:**可以调节高低电平的判断阈值

【代码封装】

▲初始化Buzzer

【Buzzer.c】初始化
1.1打开闹钟

|----------------------------------------------------------------------------|
| |

1.2设置端口模式

|----------------------------------------------------------------------------|
| |
| |
| |
| |

【Buzzer.h】声明

|----------------------------------------------------------------------------|
| |

【main.c】初始化按键+头文件

|----------------------------------------------------------------------------|
| |

▲蜂鸣器Buzzer-不受控版

【Buzzer.c】设置函数

|----------------------------------------------------------------------------|
| |
| |

【Buzzer.h】声明函数

|----------------------------------------------------------------------------|
| |

【main.c】使用函数

开完后就关

|----------------------------------------------------------------------------|
| |

▲蜂鸣器Buzzer-受控版

【Buzzer.c】设置函数

|----------------------------------------------------------------------------|
| |

【Buzzer.h】声明函数

|----------------------------------------------------------------------------|
| |

【main.c】使用函数

|----------------------------------------------------------------------------|
| |

初始化LightSensor

【LightSensor.c】初始化
1.1打开闹钟

|----------------------------------------------------------------------------|
| |

1.2设置端口模式

|----------------------------------------------------------------------------|
| |
| |
| |
| |

【LightSensor.h】声明

|----------------------------------------------------------------------------|
| |

【main.c】初始化按键+头文件

|----------------------------------------------------------------------------|
| |

▲光敏传感器LightSensor-控制蜂鸣器版

【LightSensor.c】设置函数

|----------------------------------------------------------------------------|
| |

【LightSensor.h】声明函数

|----------------------------------------------------------------------------|
| |

【main.c】运用函数

|----------------------------------------------------------------------------|
| |

三、总结GPIO用法

【方法总结】

1)初始化时钟

2)定义结构体

3)赋值结构体

GPIO_Mode:可以选择8种输入输出模式

GPIO_Pin:选择引脚,可以用按位或的方式(" | ")同时选中多个引脚

GPIO_Speed:选择输出速度(不是很重要,要求不高下,直接选50MHz)

4)最后用GPIO_Init函数

将指定的GPIO外设初始化好

【tips】

tips:模块化编程-尽量把每个硬件的驱动函数单独提取出来,封装在".c" 和 "h" 里,有利于简化主函数模式

相关推荐
国科安芯1 小时前
ASP4644芯片低功耗设计思路解析
网络·单片机·嵌入式硬件·安全
充哥单片机设计1 小时前
【STM32项目开源】基于STM32的智能厨房火灾燃气监控
stm32·单片机·嵌入式硬件
CiLerLinux8 小时前
第四十九章 ESP32S3 WiFi 路由实验
网络·人工智能·单片机·嵌入式硬件
时光の尘8 小时前
【PCB电路设计】常见元器件简介(电阻、电容、电感、二极管、三极管以及场效应管)
单片机·嵌入式硬件·pcb·二极管·电感·三极管·场效应管
Lu Zelin8 小时前
单片机为什么不能跑Linux
linux·单片机·嵌入式硬件
宁静致远20219 小时前
stm32 freertos下基于hal库的模拟I2C驱动实现
stm32·嵌入式硬件·freertos
Wave84514 小时前
STM32--智能小车
stm32·单片机·嵌入式硬件
wdfk_prog16 小时前
[Linux]学习笔记系列 -- lib/timerqueue.c Timer Queue Management 高精度定时器的有序数据结构
linux·c语言·数据结构·笔记·单片机·学习·安全
helesheng19 小时前
用低成本FPGA实现FSMC接口的多串口(UART)控制器
stm32·fsmc·fpga·uart控制器
充哥单片机设计19 小时前
【STM32项目开源】基于STM32的智能家居环境(空气质量)检测系统
stm32·单片机·嵌入式硬件