按键控制LED和光敏传感器控制蜂鸣器

news2025/1/20 19:17:17

按键控制LED

把两个按键分别接在PB11、PB1上面,两个LED接在PA1和PA2上面

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();  //不断读取键码值,放在keynum变量里
		if(keynum == 1)   //按键1按下
		{
			LED1_Turn();  //电平翻转,led状态取反,需用到GPIO_readoutput函数
		}
		
		if(keynum == 2)   //按键2按下
		{
			LED2_Turn();
		}
	}
}
Led.c

#include "stm32f10x.h"                  // Device header

void LED_Init(void)   
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);  //打开时钟
	
	GPIO_InitTypeDef GPIO_InitStructure;              //结构体变量名GPIO_InitStructA
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;  //GPIO-MODE_OUT_OD 开漏输出  
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;  //用按位或选择多个引脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);          //使用的是地址传递,将指定的GPIO外设初始化好
	
	GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2);  //初始化led是高电平,熄灭状态
}

void LED1_ON(void)   //点亮LED1
{
	GPIO_ResetBits(GPIOA, GPIO_Pin_1);   //低电平点亮
}

void LED1_OFF(void)   //熄灭LED1
{
	GPIO_SetBits(GPIOA, GPIO_Pin_1);    //高电平熄灭
}

void LED1_Turn(void)       //LED1状态取反,电平翻转
{
	if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1) == 0)   
	//GPIO_ReadOutputDataBit,来读取端口输出的是什么
	{
		GPIO_SetBits(GPIOA, GPIO_Pin_1);  //状态取反,0变1
	}
	else
	{
		GPIO_ResetBits(GPIOA, GPIO_Pin_1);  //状态取反,1变0
	}
}

void LED2_ON(void)
{
	GPIO_ResetBits(GPIOA, GPIO_Pin_2);
}

void LED2_OFF(void)
{
	GPIO_SetBits(GPIOA, GPIO_Pin_2);
}

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);
	}
}
Led.h
#ifndef __LED_H
#define __LED_H

void LED_Init(void);
void LED1_ON(void);
void LED1_OFF(void);
void LED2_ON(void);
void LED2_OFF(void);
void LED1_Turn(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);  //打开时钟
	
	GPIO_InitTypeDef GPIO_InitStructure;           //结构体变量名GPIO_InitStructB
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  //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);
}

uint8_t key_Getnum(void)  //读取按键值的函数
{
	uint8_t keynum = 0;   //按键键码,没有按下,就返回0,局部变量
	if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1)==0)  
	//读取GPIO端口,返回值就是输入数据寄存器的某一位值,等于0代表按键按下
	{
		Delay_ms(20);  //按键按下消抖20ms
		while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1)==0); //松开按键
		Delay_ms(20);  //消抖
		keynum = 1;    //键码为1
	}
	
	if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11)==0)  //按键按下
	{
		Delay_ms(20);  //消抖
		while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11)==0);
		Delay_ms(20);
		keynum = 2;
	}
	
	return keynum;
}
Key.h

#ifndef __KEY_H
#define __KEY_H

void Key_Init(void);
uint8_t key_Getnum(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)  //光线暗,指示灯不亮
		{
			Buzzer_ON();  //蜂鸣器响
		}
		else
		{
			Buzzer_OFF();  //蜂鸣器不响
		}
	}
}
Buzzer.c
#include "stm32f10x.h"                  // Device header

void Buzzer_Init(void)   //初始化蜂鸣器函数
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);  //开启时钟
	
	GPIO_InitTypeDef GPIO_InitStructure;   //定义结构体变量
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;  //开漏输出
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStructure);
	
	GPIO_SetBits(GPIOB, GPIO_Pin_12);
}

void Buzzer_ON(void)
{
	GPIO_ResetBits(GPIOB, GPIO_Pin_12);
}

void Buzzer_OFF(void)
{
	GPIO_SetBits(GPIOB, GPIO_Pin_12);
}

void Buzzer_Turn(void)
{
	if (GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_12) == 0)
	{
		GPIO_SetBits(GPIOB, GPIO_Pin_12);
	}
	else
	{
		GPIO_ResetBits(GPIOB, GPIO_Pin_12);
	}
}
Buzzer.h
#ifndef __BUZZER_H
#define __BUZZER_H

void 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);
	
	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);
}

uint8_t LightSensor_Get(void)
{
	return GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13);
}
LightSensor.h
#ifndef __LIGHTSENSOR_H
#define __LIGHTSENSOR_H

void LightSensor_Init(void);
uint8_t LightSensor_Get(void);

#endif

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

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

相关文章

激光跟踪仪|6D跟踪仪测量大尺寸空间姿态

标题理解激光跟踪仪的工作原理与应用 激光跟踪仪基于激光干涉和测距原理,通过发射和接收激光束来实现对目标物体的跟踪和测量。它是将激光照射到接触测量目标物的目标(使用反射器等)上,然后经目标反射的激光返回发光源&#xff0…

【Java】图解 JVM 垃圾回收(一):GC 判断策略、引用类型、垃圾回收算法

图解 JVM 垃圾回收(一) 1.前言1.1 什么是垃圾1.2 内存溢出和内存泄漏 2.垃圾回收的定义与重要性3.GC 判断策略3.1 引用计数算法3.2 可达性分析算法 4.引用类型5.垃圾回收算法5.1 标记-复制(Copying)5.2 标记-清除(Mark…

算法学习系列(三十五):贪心(杂)

目录 引言一、合并果子(Huffman树)二、排队打水(排序不等式)三、货仓选址(绝对值不等式)四、耍杂技的牛(推公式) 引言 上一篇文章也说过了这个贪心问题没有一个规范的套路和模板&am…

Spring 事务原理总结七

今天是二零二四年二月十八,农历正月初九。同时今天也是农历新年假期后的第一个工作日。我的内心既兴奋,又担忧,更急躁。兴奋是因为假期后的第一个工作日工作轻松;担忧是因为经过了这么长时间,我依旧没搞明白Spring事务…

物奇平台DRC动态范围控制修改方法

物奇平台DRC动态范围控制修改 是否需要申请加入数字音频系统研究开发交流答疑群(课题组)?可加我微信hezkz17, 本群提供音频技术答疑服务,+群赠送语音信号处理降噪算法,蓝牙耳机音频,DSP音频项目核心开发资料, 音频 DRC 是指动态范围控制(Dyna

Pytest测试技巧之Fixture:模块化管理测试数据!

在 Pytest 测试中,有效管理测试数据是提高测试质量和可维护性的关键。本文将深入探讨 Pytest 中的 Fixture,特别是如何利用 Fixture 实现测试数据的模块化管理,以提高测试用例的清晰度和可复用性。 什么是Fixture? 在 Pytest 中…

Java入门教程:介绍、优势、发展历史以及Hello World程序示例

Java入门教学 java语言介绍 Java是由Sun Microsystems公司(已被Oracle公司收购)于1995年5月推出的Java面向对象程序设计语言和Java平台的总称。由James Gosling和同事们共同研发,并在1995年正式推出。 Java分为三个体系: JavaSE(J2SE&…

【PX4-AutoPilot教程-源码】移植PX4固件到自制NuttX操作系统飞控板的方法

移植PX4固件到自制NuttX操作系统飞控板的方法 找到使用相同(或型号相似)CPU类型的现有目标并进行复制飞控板的配置文件夹结构firmware.prototype文件default.px4board文件bootloader.px4board文件nuttx-config/bootloader/defconfig文件nuttx-config/nsh…

Code Composer Studio (CCS) - Licensing Information

Code Composer Studio [CCS] - Licensing Information 1. Help -> Code Composer Studio Licensing Information2. Upgrade3. Specify a license fileReferences 1. Help -> Code Composer Studio Licensing Information 2. Upgrade ​​​ 3. Specify a license file …

Paper - CombFold: Predicting structures of large protein assemblies 环境配置

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/136153329 CombFold: GitHub:https://github.com/dina-lab3D/CombFoldPaper:predicting structures of large…

详解C语言10大字符串函数【超详细建议点赞收藏】

目录 1. strlen----求字符串长度1.1 函数介绍1.2 函数使用1.3 模拟实现 2. strcpy----字符串拷贝2.1 函数介绍2.2 函数使用3.3 模拟实现 3. strcat----字符串追加3.1 函数介绍3.2 函数使用3.3 模拟实现 4. strcmp----字符串比较4.1 函数介绍4.2 函数使用 5. strncpy----长度受限…

一、直方图相关学习

1、灰度直方图 1.1 基本概念和作用 表示图像中每个灰度级别的像素数量。用于分析图像的亮度分布情况。 1.2 代码示例 参数介绍 hist cv2.calcHist(images, channels, mask, histSize, ranges, hist, accumulate)-images:输入图像的列表。对于灰度图像&#xff0…

APP端网络测试与弱网模拟

当前APP网络环境比较复杂,网络制式有2G、3G、4G网络,还有越来越多的公共Wi-Fi。不同的网络环境和网络制式的差异,都会对用户使用app造成一定影响。另外,当前app使用场景多变,如进地铁、上公交、进电梯等,使…

基于Springboot的新能源充电系统(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的新能源充电系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构&a…

AtCoder Regular Contest 172(仅A题)

A - Chocolate 给N个人分巧克力,分的大小是2^Ai * 2^Ai,给你一个大小为H*W的巧克力,问能不能给N个人都分到要求的巧克力。 假设蓝色是h*w的大巧克力,红色的是要分出来的巧克力(四个角落都一样,这里用左上…

VMware虚拟机安装CentOS7

对于系统开发来说,开发者时常会需要涉及到不同的操作系统,比如Windows系统、Mac系统、Linux系统、Chrome OS系统、UNIX操作系统等。由于在同一台计算机上安装多个系统会占据我们大量的存储空间,所以虚拟机概念应运而生。本篇将介绍如何下载安…

innoDB page页结构详解

Page是整个InnoDB存储的最基本构件,也是InnoDB磁盘管理的最小单位,与数据库相关的所有内容都存储在这种Page结构里。 Page分为几种类型,常见的页类型有数据页(B+tree Node)Undo页(Undo Log Page)系统页(System Page) 事务数据页(Transaction System Page)等 Page 各…

重学Java 15.面向对象.3.数组常用算法

我走过漫漫求学路 大雪落在求知所依靠的心脏上 昨日种种我弃之如敝履 滚滚洪流中,毁灭自己 ——24.2.18 数组常见算法 1.数组翻转 2.冒泡排序 3.二分查找 一、数组翻转 1.概述:数组对称索引位置上的元素互换 2.如何确定数组两端位置? int min…

vue2+高德地图web端开发(二)

前言: 高德地图输入提示与 POI 搜索相关文档:输入提示与 POI 搜索-服务插件和工具-进阶教程-地图 JS API 2.0 | 高德地图API (amap.com) 输入提示-输入提示-示例中心-JS API 2.0 示例 | 高德地图API (amap.com) 创建输入框: 引入Element组…

Selenium Grid分布式测试环境搭建

Selenium Grid简介 Selenium Grid实际上是基于Selenium RC的,而所谓的分布式结构就是由一个hub节点和若干个node代理节点组成。Hub用来管理各个代理节点的注册信息和状态信息,并且接受远程客户端代码的请求调用,然后把请求的命令转发给代理节…