当前位置: 首页 > news >正文

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

目录

一、按键控制LED

【文件杂述】

【LED代码封装】

▲ 初始化LED

1)初始化LED函数

1.1 打开时钟

1.2 配置端口模式

2) “ .h ”文件声明

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:用来读取输入数据寄存器某一个端口的输入值

        参数GPIOx GPIO_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" 里,有利于简化主函数模式 


http://www.mrgr.cn/news/60559.html

相关文章:

  • 查找接口成功率最优时间段
  • appium+mumu模拟器 嚼碎菜鸟教程
  • 【AI辅助】AWS Toolkit+AmazonQ
  • Vue3-创建实例
  • GPT打数模——电商品类货量预测及品类分仓规划
  • stm32单片机基于rt-thread 的 littlefs 文件系统 的使用
  • Shiro会话管理和加密
  • 医院信息化与智能化系统(11)
  • 阳振坤:云时代数据库的思考 | OceanBase发布会实录
  • 【高级IO】IO多路转接之epoll
  • 移植FreeRTOS实时操作系统(基于STM32F429)
  • Java运行时数据区
  • C++基础三
  • 华为大咖说丨如何通过反馈机制来不断优化大模型应用?
  • 销售拓客秘籍:线上渠道探寻与选择
  • 2024年【北京市安全员-A证】找解析及北京市安全员-A证考试试卷
  • 一周倒计时!2024中山智能家居峰会议程揭晓
  • 深入理解数据链路层:以太网帧格式、MAC地址、交换机、MTU及ARP协议详解与ARP欺骗探究
  • 300元蓝牙耳机性价比高的有哪些?学生平价蓝牙耳机推荐
  • 10位三维设计如何共享工作站算力和软件
  • Instagram如何加特效?轻松打造个性化动态效果的实用指南
  • ChatGPT:从发布到全球大热,仅用一年多的传奇之旅
  • pgloader的简单数据迁移教程
  • 推荐一款好用的redis管理工具TinyRDM
  • 三维模型加载慢的问题优化
  • 置换环模板题E - Permute K times 2