【嵌入式软件-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 小时前
【51单片机用数码管显示流水灯的种类是按钮控制数码管加一和流水灯】2022-6-14
c语言·经验分享·笔记·单片机·嵌入式硬件·51单片机
智商偏低7 小时前
单片机之helloworld
单片机·嵌入式硬件
青牛科技-Allen9 小时前
GC3910S:一款高性能双通道直流电机驱动芯片
stm32·单片机·嵌入式硬件·机器人·医疗器械·水泵、
森焱森11 小时前
无人机三轴稳定控制(2)____根据目标俯仰角,实现俯仰稳定化控制,计算出升降舵输出
c语言·单片机·算法·架构·无人机
白鱼不小白11 小时前
stm32 USART串口协议与外设(程序)——江协教程踩坑经验分享
stm32·单片机·嵌入式硬件
S,D11 小时前
MCU引脚的漏电流、灌电流、拉电流区别是什么
驱动开发·stm32·单片机·嵌入式硬件·mcu·物联网·硬件工程
芯岭技术14 小时前
PY32F002A单片机 低成本控制器解决方案,提供多种封装
单片机·嵌入式硬件
youmdt15 小时前
Arduino IDE ESP8266连接0.96寸SSD1306 IIC单色屏显示北京时间
单片机·嵌入式硬件
嘿·嘘15 小时前
第七章 STM32内部FLASH读写
stm32·单片机·嵌入式硬件
Meraki.Zhang15 小时前
【STM32实践篇】:I2C驱动编写
stm32·单片机·iic·驱动·i2c