【STM32】STM32学习笔记-按键控制LED 光敏传感器控制蜂鸣器(08)

news2024/11/25 1:02:58

00. 目录

文章目录

    • 00. 目录
    • 01. 按键控制LED接线图
    • 02. 按键控制LED程序示例
    • 03. 光敏传感器控制Buzzer接线图
    • 04. 有源蜂鸣器原理图
    • 05. 光敏传感器控制Buzzer示例
    • 06. 程序示例下载
    • 07. 附录

01. 按键控制LED接线图

在这里插入图片描述

02. 按键控制LED程序示例

led.h

#ifndef __LED_H__
#define __LED_H__

void 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 /*__LED_H__*/

led.c

#include "led.h"

#include "stm32f10x.h"                  // Device header


//LED初始化
void led_init(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	
	//使能时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	//A1  A2
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStruct);
	
	//设置为高电平
	GPIO_SetBits(GPIOA, GPIO_Pin_1);
	GPIO_SetBits(GPIOA, GPIO_Pin_2);
}

//LED1亮
void led1_on(void)
{
	GPIO_ResetBits(GPIOA, GPIO_Pin_1);
}

//LED1灭
void led1_off(void)
{
	GPIO_SetBits(GPIOA, GPIO_Pin_1);
}

//LED翻转
void led1_turn(void)
{
	if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1) == 0)
	{
		GPIO_SetBits(GPIOA, GPIO_Pin_1);
	}
	else
	{
		GPIO_ResetBits(GPIOA, GPIO_Pin_1);
	}
}


//LED2亮
void led2_on(void)
{
	GPIO_ResetBits(GPIOA, GPIO_Pin_2);
}

//LED2灭
void led2_off(void)
{
	GPIO_SetBits(GPIOA, GPIO_Pin_2);
}

//LED2翻转
void led2_turn(void)
{
	if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_2) == 0)
	{
		GPIO_SetBits(GPIOA, GPIO_Pin_2);
	}
	else
	{
		GPIO_ResetBits(GPIOA, GPIO_Pin_2);
	}
}

key.h

#ifndef __KEY_H__
#define __KEY_H__

#include "stm32f10x.h"                  // Device header

void key_init(void);

uint8_t key_scan(void);

#endif /*__KEY_H_*/


key.c

#include "key.h"


#include "delay.h"


//按键初始化
void key_init(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	
	//使能时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	//B1 B11
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //对于输入用途不大
	GPIO_Init(GPIOB, &GPIO_InitStruct);
}

//按键扫描
uint8_t key_scan(void)
{
	uint8_t ret = 0;
	
	if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0)
	{
		delay_ms(10);
		
		//等待按键抬起
		while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0);
		
		delay_ms(10);
		ret = 1;
	}
	
	
	if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0)
	{
		delay_ms(10);
		
		//等待按键抬起
		while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0);
		
		delay_ms(10);
		ret = 2;
	}
	
	return ret;
}

main.c

#include "stm32f10x.h"

#include "delay.h"
#include "led.h"
#include "key.h"


 int main(void)
 {	
	led_init();
	key_init();
	 
	 while(1)
	 {
		if (key_scan() == 1)
		{
			led1_turn();
		}
		
		if (key_scan() == 2)
		{
			led2_turn();
		}
	 }
	  
	 return 0;
 }

03. 光敏传感器控制Buzzer接线图

在这里插入图片描述

04. 有源蜂鸣器原理图

电路图:
在这里插入图片描述

实物图:

在这里插入图片描述

05. 光敏传感器控制Buzzer示例

buzzer.h

#ifndef __BUZZER_H__

#define __BUZZER_H__

#include "stm32f10x.h"  


//蜂鸣器初始化 B12
void buzzer_init(void);


//on
void buzzer_on(void);


//off
void buzzer_off(void);



#endif

buzzere.c

#include "buzzer.h"



//蜂鸣器初始化 B12
void buzzer_init(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	
	//使能时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	//B12
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; 
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz; 
	GPIO_Init(GPIOB, &GPIO_InitStruct);
	
	//设置为高电平
	GPIO_SetBits(GPIOB, GPIO_Pin_12);
}

//on
void buzzer_on(void)
{
	GPIO_ResetBits(GPIOB, GPIO_Pin_12);
}


//off
void buzzer_off(void)
{
	//设置为高电平
	GPIO_SetBits(GPIOB, GPIO_Pin_12);	
}

lightsensor.h


#ifndef __LIGHT_SENSOR_H__
#define __LIGHT_SENSOR_H__


#include "stm32f10x.h"

void lightsensor_init(void);

uint8_t lightsensor_get(void);


#endif /*__LIGHT_SENSOR_H__*/

lightsensor.cpp

#include "lightsensor.h"

//B13
void lightsensor_init(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	
	//使能时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	//B1 B11
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //对于输入用途不大
	GPIO_Init(GPIOB, &GPIO_InitStruct);
	
}

uint8_t lightsensor_get(void)
{
	return GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13);
}

main.c

#include "stm32f10x.h"

#include "delay.h"
#include "led.h"
#include "key.h"
#include "buzzer.h"
#include "lightsensor.h"

 int main(void)
 {	

	buzzer_init();
	lightsensor_init();
	 
	 while(1)
	 {
		 if (lightsensor_get() == 1)
		 {
			buzzer_on();
		 }
		 else
		 {
			buzzer_off();
		 }
	 }
	 
	 
	 return 0;
 }


 

06. 程序示例下载

04-Key控制LED.rar

05-光敏传感器控制蜂鸣器.rar

07. 附录

参考: 【STM32】江科大STM32学习笔记汇总

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

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

相关文章

Qt 表格相关API

1.文本框 限制输入数据类型(如仅英文) QValidator* validator new QRegExpValidator(QRegExp("[a-zA-Z]"), lineText); // 创建正则表达式验证器lineText->setValidator(validator); // 将验证器设置给 QLineEdit QLineEdit:单…

岛屿数量介绍

在Java编程语言中,岛屿数量通常指的是在一个二维字符数组(grid)中,相邻的、值为1的格子数量。这个二维字符数组可能代表一个地图或一个二维平面,每个1代表一个岛屿或地形凸起,每个0代表一个海洋或平坦地区。…

HI3559AV100和FPGA 7K690T的PCIE接口调试记录-续

上文https://blog.csdn.net/fzktongyong/article/details/134963814?spm1001.2014.3001.5501 上一篇文中PCIE实测速度和理论计算有较大偏差,经过尝试后有所提升。 1、提升效果 1)、RC写操作,实测速度817MB/s(410407&…

JupyterNotebook VS JupyterLab 如果jupyter安装成功,点击jupyterlab即可进入lab环境

简介 JupyterNotebook 是一个款以网页为基础的交互计算环境,可以创建Jupyter的文档,支持多种语言,包括Python, Julia, R等等。一般来说,如果是使用R语言的话,使用Rstudio居多,使用Python的话,使…

第78讲:截取MySQL Binlog二进制日志中特定部分内容的技巧

文章目录 1.为什么要截取Binlog日志中的部分内容2.针对标识位截取Binlog日志中的部分数据2.1.以标识位号截取Binlog日志的方法2.2.截取Binlog日志中的部分数据2.3.模拟简单基于标识位的Binlog数据恢复 3.针对事件范围截取Binlog日志中的部分数据 1.为什么要截取Binlog日志中的部…

虚幻学习笔记15—C++和UI(一)

一、前言 在C可以直接创建按钮、滚轮等UI,并且可以直接绑定并处理响应事件。在创建C代码后还是需要通过蓝图来显示到应用中,总体来说还是不如直接用蓝图来的方便。 本文使用的虚幻引擎为5.2.1。 二、实现 2.1、创建UUserWidgetl类型的C类 声明两个按钮…

老杨说运维 | 年末大盘点!擎创CEO实时盘点运维大干货,不容错过

2023年即将走到尾声,对于擎创而言,这一年是颇具成长和成就的一年。我们庆幸获得了更多客户的信任,也为他们达到下一个运维阶段提供了充足的助力。 越多的实践就会带来越多新的理解和可优化的经验。这一年来,擎创在运维数据治理、智…

【PID学习笔记10】PID公式分析

写在前面 前面已经将控制系统的基础知识点过了一遍,从本节开始,将正式学习PID控制的相关知识,将会从基本的PID公式概念解释,再基于matlab仿真介绍十几种数字式PID的基本概念。本文重点讲解PID的经典公式。 一、连续与离散的概念…

Tableau进阶--Tableau数据故事慧(20)解构Tableau的绘图逻辑

官网介绍 官网连接如下: https://www.tableau.com/zh-cn tableau的产品包括如下: 参考:https://zhuanlan.zhihu.com/p/341882097 Tableau是功能强大、灵活且安全些很高的端到端的数据分析平台,它提供了从数据准备、连接、分析、协作到查阅…

【MATLAB】数据拟合第10期-二阶多项式的局部加权回归拟合算法

有意向获取代码,请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 二阶多项式局部加权回归拟合算法是一种用于回归分析的方法,主要通过局部加权线性回归模型来实现。以下是对二阶多项式局部加权回归拟合算法的介绍: 局部加权线性回…

C# OpenCvSharp DNN 部署YOLOV6目标检测

目录 效果 模型信息 项目 代码 下载 C# OpenCvSharp DNN 部署YOLOV6目标检测 效果 模型信息 Inputs ------------------------- name:image_arrays tensor:Float[1, 3, 640, 640] -------------------------------------------------------------…

搭建个人智能家居 开篇(搭建Home Assistant)

搭建个人智能家居 开篇(搭建Home Assistant) 前言Home Assistant搭建Home AssistantUbuntu系统搭建Windows系统搭建VM安装方法VirtualBox安装方法: 配置Home Assistant控制页面 前言 随着科技的进步、发展,物联网给我们的生活带来…

Axure的安装及界面基本功能介绍

目录 一. Axure概述 二. Axure安装 2.1 安装包下载 2.2 安装步骤 三. Axure功能介绍​ 3.1 工具栏介绍 3.1.1 复制,剪切及粘贴 3.1.2 选择模式和连接 3.1.3 插入形状 3.1.4 点(编辑控点) 3.1.5 置顶和置底 3.1.6 组合和取消组合 …

双向无线功率传输系统MATLAB仿真

微❤关注“电气仔推送”获得资料(专享优惠) 模型简介: 初级侧转换器通过双向 AC/DC 转换器从电网获取电力,并由直流线电压 Vin 供电,而拾波侧被视为连接到 EV,并由连接到任一存储的单独直流源 Vout 表示或…

express 下搞一个 websocket 长连接

安装模块 npm i express npm i express-ws 新建文件app.js 先安排源码 监听端口 7777 var express require(express) var app express() require(express-ws)(app)var port 7777 var clientObject {} app.ws(/, (client, req) > {// 连接var key req.socket.re…

TypeScript【枚举、联合类型函数_基础、函数_参数说明 、类的概念、类的创建】(二)-全面详解(学习总结---从入门到深化)

文章目录 枚举 联合类型 函数_基础 函数_参数说明 类的概念 类的创建 枚举 枚举(Enum)类型用于取值被限定在一定范围内的场景,比如一周只能有七天,颜色限定为红绿蓝等 枚举例子 枚举使用 enum 关键字来定义 enum Days {…

locust 压测 websocket

* 安装 python 3.8 https://www.python.org/ py --version * 安装 locust pip install locust2.5.1 -i http://pypi.douban.com/simple/ pip install locust2.5.1 -i https://pypi.mirrors.ustc.edu.cn/simple/ locust -V 备注:-i 是切换下载源 * 安装依赖 pip ins…

一篇文章讲透TCP/IP协议

1 OSI 7层参考模型 2 实操连接百度 nc连接百度2次,使用命令netstat -natp查看就会重新连接一次百度 请求百度 3 三次握手、socket 应用层协议控制长连接和短连接 应用层协议->传输控制层(TCP UDP)->TCP( 面向连接&am…

超声波清洗机应该怎样使用?清洁能力强超声波清洗机推荐

其实超声波清洗机使用方法非常简单,只需要将清洁物品放进超声波清洗机内,加入水打开开关即可开始使用,不需要太复杂操作就可以开启清洗,等待个数分钟就可以得到一个干干净净的物品被清洗完毕!可见现在科技进步&#xf…

在Node.js中MongoDB更新数据的方法

本文主要介绍在Node.js中MongoDB更新数据的方法。 目录 Node.js中MongoDB更新数据使用原生 MongoDB 驱动程序更新数据使用 Mongoose 更新数据 Node.js中MongoDB更新数据 在Node.js中,可以使用原生的 MongoDB 驱动程序或者使用 Mongoose 来更新 MongoDB 数据。 下面…