【STM32】按键控制LED光敏传感器控制蜂鸣器(江科大)

一、按键控制LED

在这里插入图片描述
LED.c

#include "stm32f10x.h"                  // Device header/*** 函    数:LED初始化* 参    数:无* 返 回 值:无*/
void LED_Init(void)
{/*开启时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);		//开启GPIOA的时钟/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);						//将PA1和PA2引脚初始化为推挽输出/*设置GPIO初始化后的默认电平*/GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2);				//设置PA1和PA2引脚为高电平
}/*** 函    数:LED1开启* 参    数:无* 返 回 值:无*/
void LED1_ON(void)
{GPIO_ResetBits(GPIOA, GPIO_Pin_1);		//设置PA1引脚为低电平
}/*** 函    数:LED1关闭* 参    数:无* 返 回 值:无*/
void LED1_OFF(void)
{GPIO_SetBits(GPIOA, GPIO_Pin_1);		//设置PA1引脚为高电平
}/*** 函    数:LED1状态翻转* 参    数:无* 返 回 值:无*/
void LED1_Turn(void)
{if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1) == 0)		//获取输出寄存器的状态,如果当前引脚输出低电平{GPIO_SetBits(GPIOA, GPIO_Pin_1);					//则设置PA1引脚为高电平}else													//否则,即当前引脚输出高电平{GPIO_ResetBits(GPIOA, GPIO_Pin_1);					//则设置PA1引脚为低电平}
}/*** 函    数:LED2开启* 参    数:无* 返 回 值:无*/
void LED2_ON(void)
{GPIO_ResetBits(GPIOA, GPIO_Pin_2);		//设置PA2引脚为低电平
}/*** 函    数:LED2关闭* 参    数:无* 返 回 值:无*/
void LED2_OFF(void)
{GPIO_SetBits(GPIOA, GPIO_Pin_2);		//设置PA2引脚为高电平
}/*** 函    数:LED2状态翻转* 参    数:无* 返 回 值:无*/
void LED2_Turn(void)
{if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_2) == 0)		//获取输出寄存器的状态,如果当前引脚输出低电平{                                                  GPIO_SetBits(GPIOA, GPIO_Pin_2);               		//则设置PA2引脚为高电平}                                                  else                                               		//否则,即当前引脚输出高电平{                                                  GPIO_ResetBits(GPIOA, GPIO_Pin_2);             		//则设置PA2引脚为低电平}
}

LED.h

#ifndef __LED_H
#define __LED_Hvoid LED_Init(void);
void LED1_ON(void);
void LED1_OFF(void);
void LED1_Turn(void);
void LED2_ON(void);
void LED2_OFF(void);
void LED2_Turn(void);#endif

Key.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"/*** 函    数:按键初始化* 参    数:无* 返 回 值:无*/
void Key_Init(void)
{/*开启时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);		//开启GPIOB的时钟/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);						//将PB1和PB11引脚初始化为上拉输入
}/*** 函    数:按键获取键码* 参    数:无* 返 回 值:按下按键的键码值,范围:0~2,返回0代表没有按键按下* 注意事项:此函数是阻塞式操作,当按键按住不放时,函数会卡住,直到按键松手*/
uint8_t Key_GetNum(void)
{uint8_t KeyNum = 0;		//定义变量,默认键码值为0if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0)			//读PB1输入寄存器的状态,如果为0,则代表按键1按下{Delay_ms(20);											//延时消抖while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0);	//等待按键松手Delay_ms(20);											//延时消抖KeyNum = 1;												//置键码为1}if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0)			//读PB11输入寄存器的状态,如果为0,则代表按键2按下{Delay_ms(20);											//延时消抖while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0);	//等待按键松手Delay_ms(20);											//延时消抖KeyNum = 2;												//置键码为2}return KeyNum;			//返回键码值,如果没有按键按下,所有if都不成立,则键码为默认值0
}

Key.h

#ifndef __KEY_H
#define __KEY_Hvoid Key_Init(void);
uint8_t Key_GetNum(void);#endif

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "LED.h"
#include "Key.h"uint8_t KeyNum;		//定义用于接收按键键码的变量int main(void)
{/*模块初始化*/LED_Init();		//LED初始化Key_Init();		//按键初始化while (1){KeyNum = Key_GetNum();		//获取按键键码if (KeyNum == 1)			//按键1按下{LED1_Turn();			//LED1翻转}if (KeyNum == 2)			//按键2按下{LED2_Turn();			//LED2翻转}}
}

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

在这里插入图片描述
Buzzer.c

#include "stm32f10x.h"                  // Device header/*** 函    数:蜂鸣器初始化* 参    数:无* 返 回 值:无*/
void Buzzer_Init(void)
{/*开启时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);		//开启GPIOB的时钟/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);						//将PB12引脚初始化为推挽输出/*设置GPIO初始化后的默认电平*/GPIO_SetBits(GPIOB, GPIO_Pin_12);							//设置PB12引脚为高电平
}/*** 函    数:蜂鸣器开启* 参    数:无* 返 回 值:无*/
void Buzzer_ON(void)
{GPIO_ResetBits(GPIOB, GPIO_Pin_12);		//设置PB12引脚为低电平
}/*** 函    数:蜂鸣器关闭* 参    数:无* 返 回 值:无*/
void Buzzer_OFF(void)
{GPIO_SetBits(GPIOB, GPIO_Pin_12);		//设置PB12引脚为高电平
}/*** 函    数:蜂鸣器状态翻转* 参    数:无* 返 回 值:无*/
void Buzzer_Turn(void)
{if (GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_12) == 0)		//获取输出寄存器的状态,如果当前引脚输出低电平{GPIO_SetBits(GPIOB, GPIO_Pin_12);						//则设置PB12引脚为高电平}else														//否则,即当前引脚输出高电平{GPIO_ResetBits(GPIOB, GPIO_Pin_12);						//则设置PB12引脚为低电平}
}

Buzzer.h

#ifndef __BUZZER_H
#define __BUZZER_Hvoid Buzzer_Init(void);
void Buzzer_ON(void);
void Buzzer_OFF(void);
void Buzzer_Turn(void);#endif

LightSensor.c

#include "stm32f10x.h"                  // Device header/*** 函    数:光敏传感器初始化* 参    数:无* 返 回 值:无*/
void LightSensor_Init(void)
{/*开启时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);		//开启GPIOB的时钟/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);						//将PB13引脚初始化为上拉输入
}/*** 函    数:获取当前光敏传感器输出的高低电平* 参    数:无* 返 回 值:光敏传感器输出的高低电平,范围:0/1*/
uint8_t LightSensor_Get(void)
{return GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13);			//返回PB13输入寄存器的状态
}

LightSensor.h

#ifndef __LIGHT_SENSOR_H
#define __LIGHT_SENSOR_Hvoid LightSensor_Init(void);
uint8_t LightSensor_Get(void);#endif

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "Buzzer.h"
#include "LightSensor.h"int main(void)
{/*模块初始化*/Buzzer_Init();			//蜂鸣器初始化LightSensor_Init();		//光敏传感器初始化while (1){if (LightSensor_Get() == 1)		//如果当前光敏输出1{Buzzer_ON();				//蜂鸣器开启}else							//否则{Buzzer_OFF();				//蜂鸣器关闭}}
}

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

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

相关文章

C语言习题~day32

请问该程序的输出是多少&#xff08;&#xff09; #include<stdio.h> int main(){ unsigned char i 7; int j 0; for(;i > 0;i - 3){ j; } printf("%d\n", j); return 0; }A.2 B.死循环 C.173 D.172 无符号字符型的取值范围是 0 到 255。 第一次循环…

199.二叉树的右视图(DFS)

给定一个二叉树的根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4] 输出: [1,3,4] 示例 2: 输入: [1,null,3] 输出: [1,3] 示例 3: 输入: [] 输出: [] 解题…

Flutter 中的基本数据类型:num、int 和 double

在 Dart 编程语言中&#xff0c;数值类型的基础是 num&#xff0c;而 int 和 double 则是 num 的子类型。在开发 Flutter 应用时&#xff0c;理解这三者的区别和使用场景是非常重要的。本文将详细介绍 num、int 和 double 的定义及其使用区别。 num num 是 Dart 中的数值类型…

实战:springboot用LocalDateTime快速替换Date

概叙 实战&#xff1a;早点用JDK8中的java.time来替换java.util.Date-CSDN博客 在Spring Boot项目中大家从Date升级到LocalDateTime最关心以下两个问题&#xff1a; 使用LocalDateTime类型字段作为接口出入参数&#xff0c;能正常映射转换前端传入的参数吗&#xff1f;返回参…

贪心算法总结(1)

一、贪心算法简介 常用方法&#xff1a;交换论证法、数学归纳法、反证法、分类讨论 二、柠檬水找零&#xff08;交换论证法&#xff09; . - 力扣&#xff08;LeetCode&#xff09; class Solution { public:bool lemonadeChange(vector<int>& bills) {int five0,t…

【考研数学】线代满分经验分享+备考复盘

我一战二战复习都听了李永乐的线代课&#xff0c;二战的时候只听了一遍强化&#xff0c;个人感觉没有很乱&#xff0c;永乐大帝的课逻辑还是很清晰的。 以下是我听向量这一章后根据听课内容和讲义例题总结的部分思维导图&#xff0c;永乐大帝讲课的时候也会特意点到线代前后联…

TDengine 3.3.2.0 发布:新增 UDT 及 Oracle、SQL Server 数据接入

经过数月的开发和完善&#xff0c;TDengine 3.3.2.0 版本终于问世了。这一版本中既有针对开源社区的功能优化&#xff0c;也有从企业级用户需求出发做出的功能调整。在开源版本中&#xff0c;我们增强了系统的灵活性和兼容性&#xff1b;而在企业级版本中&#xff0c;新增了关键…

TK秘籍:深度剖析机房IP与住宅IP的利与弊

大家好&#xff0c;今天我们来聊聊TikTok运营中的一个重要环节——IP地址的选择。 想象一下&#xff0c;你在TikTok上发布视频&#xff0c;就像是在一个热闹的市集上摆摊&#xff0c;而IP地址就是你的摊位位置。选对了位置&#xff0c;你的摊位就能吸引更多顾客&#xff0c;也…

最小二乘求待定位点的位置(三维环境)|MATLAB

前言 之前发过三点法求待测点位置的程序讲解&#xff0c;哪个是二维的&#xff0c;见&#xff1a;基于伪逆的三点法距离求位置&#xff0c;MATLAB源代码&#xff08;MATLAB函数&#xff09; 这里给出三维情况下的函数和测试代码。对于函数&#xff0c;输入已知锚点的位置、待…

JavaEE:Spring Web简单小项目实践三(留言板实现)

学习目的&#xff1a; 1、理解前后端交互过程 2、学习接口传参&#xff0c;数据返回以及页面展示 目录 1、准备工作 2、约定前后端交互接口 1、获取全部留言 2、发表新留言 3、实现服务器端代码 4、调整前端页面代码 5、运行测试 1、准备工作 创建SpringBoot项目&#x…

Linux 服务器管理和维护

Linux 是一个非常严谨的操作系统&#xff0c;每个目录都有自己的作用&#xff0c;这些作用是固定的&#xff0c;没有特殊情况&#xff0c;应严格执行&#xff1b; Linux 中所有东西以文件形式存储和管理&#xff0c;命令也不例外&#xff1b; 以下四个 bin 是二进制文件&…

SVM 技能测试:25 个 MCQ 用于测试数据科学家的 SVM

SVM 技能测试:25 个 MCQ 用于测试数据科学家的 SVM(2024 年更新) 一、介绍 你可以把机器学习算法想象成一个装满斧头、剑和刀片的军械库。你有各种各样的工具,但你应该学会在正确的时间使用它们。打个比方,将“线性回归或逻辑回归”视为一把能够有效地切片和切块数据但…

鸿蒙仓颉语言【泛型generic】

泛型 泛型特性&#xff1a; 在给定的代码中&#xff0c;泛型被用于定义参数的类型。举例来说&#xff0c;Array和Array<(Event, (Event)->Event)>中的Array都是泛型类型&#xff0c;它们可以接受不同类型的参数。 与Java的泛型相比&#xff1a; Java也有泛型特性&am…

LeetCode 739, 82, 106

文章目录 739. 每日温度题目链接标签思路代码 82. 删除排序链表中的重复元素 II题目链接标签思路代码 106. 从中序与后序遍历序列构造二叉树题目链接标签思路二叉树的三种遍历值与索引的映射对于后序遍历的使用对于中序遍历的使用 代码 739. 每日温度 题目链接 739. 每日温度…

力扣第十八题——四数之和

内容介绍 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元组元素一一对应&#xff0c;则认为两个四元组重复&#xff09;&#xff1a; 0…

jenkins 插件版本冲突

一、Jenkins安装git parameter 插件重启后报错与临时解决方案 cd /root/.jenkins cp config.xml config.xml.bak vim config.xml <authorizationStrategy class"hudson.security.FullControlOnceLoggedInAuthorizationStrategy"><denyAnonymousReadAcces…

protoc-gen-go-http: program not found or is not executable

# 1 先升级到最新版 sudo kratos upgrade # 2 安装 protoc-gen-go-http go get -u github.com/go-kratos/kratos/cmd/protoc-gen-go-http/v2 go install github.com/go-kratos/kratos/cmd/protoc-gen-go-http/v2 # 3 安装 protoc-gen-go-errors go get -u github.com/go-…

【工具使用】EMACS的verilog_mode脚本

#工作记录# 俗话说不会玩连连看的工程师不是一个好的SoC工程师。 在做集成工作的时候&#xff0c;集成连线估计是一件比较繁琐且容易出错的事情&#xff0c;连线类型定义出错、位宽问题、连线众多等等问题&#xff0c;此时使用由Veripool带来的verilog_mode简直是令人神清气爽…

基于牛顿-拉夫逊优化算法(Newton-Raphson-based optimizer, NBRO)的无人机三维路径规划

牛顿-拉夫逊优化算法(Newton-Raphson-based optimizer, NBRO)是一种新型的元启发式算法&#xff08;智能优化算法&#xff09;&#xff0c;该成果由Sowmya等人于2024年2月发表在中科院2区Top SCI期刊《Engineering Applications of Artificial Intelligence》上。 1、算法原理…

制造运营管理系统(MOM系统),企业实现先进制造的关键一步

随着全球制造业的快速发展&#xff0c;企业对于生产效率和成本控制的要求日益增高。在这个背景下&#xff0c;制造运营管理系统&#xff08;MOM系统&#xff09;成为了企业提升竞争力的关键工具。盘古信息作为业内领先的智能制造解决方案提供商&#xff0c;其MOM系统更是以其卓…