物联网D3——按键控制LED、光敏传感蜂鸣器

按键控制LED

按键抖动,电平发生变化,可用延时函数抵消按键抖动对系统的影响

在这里插入图片描述

传感器电路图

在这里插入图片描述

按键电路图

在这里插入图片描述

c语言对应类型

“_t”后缀表示使用typedef重命名的数据类型

在这里插入图片描述

枚举类型

在这里插入图片描述

#include<iostream>
using namespace std;
//定义枚举类型
typedef enum{
   Mon=1,
   Tue=2,
   Wed=3
} week_t;
int main(){
   week_t w;
   w=Wed; //对星期类型设定指定量
   cout << w << endl;
   return 0;
}

按键控制LED灯

主函数

#include "stm32f10x.h"                  // Device header
#include "MyDelay.h"   //自定义延时函数
#include "Delay.h"     //官方延迟函数
#include "Button.h"   //按键Led驱动
#include "stdio.h"
 uint8_t KeyNum ;
int main(void){
  
  //初始化
    Led_Init();
    Button_Init();
   
   //按键控制led灯
   while(1){
     KeyNum = Key_GetNum();
     if(KeyNum==1) {
        Led_One_Turn();
     }
     if(KeyNum==2){
        Led_Two_Turn();
     }
   }
   
   return 0;
}

Button

//头文件
#ifndef Led_h  //若没有定义该变量,则定义
#define led_h
//LED驱动
void Led_Init(void);
//按键初始化,按键用于输入,不用设置输出的速度
void Button_Init(void);
//获取是哪个按键被按下
uint8_t Key_GetNum(void);
//灯1亮
void Led_One_Turn(void);
//灯2亮
void Led_Two_Turn(void);
#endif

//源文件
#include "stm32f10x.h" 
#include "Delay.h"
#include "stdio.h"
//Led初始化
void Led_Init(void){
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
   
  GPIO_InitTypeDef GI;
  GI.GPIO_Mode = GPIO_Mode_Out_PP;
  GI.GPIO_Pin = GPIO_Pin_All;
  GI.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA,&GI);
  //设置led灯对应引脚为高电平
  GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1); //A0,A1引脚高电平,灯灭
}
//按键初始化,按键用于输入,不用设置输出的速度
void Button_Init(void){
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //时钟使能
    GPIO_InitTypeDef Button;
    Button.GPIO_Mode = GPIO_Mode_IPU; //上拉输入模式,保持高电平
    Button.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_11; //按键所在引脚  
    Button.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB,&Button);
}  
//获取是哪个按键被按下
uint8_t Key_GetNum(void){
   uint8_t KeyNum=0;
   //按键1
   if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0){  //按键按下读取输入数据
        Delay_ms(20); //按下抖动
        while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) == 0 ); //等待度过按键触底期
        Delay_ms(20);  //弹起抖动
        KeyNum=1;  //按键一
   }
    //按键11
   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; //返回按键号码
}
//灯1
void Led_One_Turn(void){
  uint8_t Light_Status = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0);
  if(Light_Status==0) GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);
  else GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);
}

//灯2
void Led_Two_Turn(void){
   uint8_t Light_Status = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1);
  if(Light_Status==0) GPIO_WriteBit(GPIOA,GPIO_Pin_1,Bit_SET);
  else GPIO_WriteBit(GPIOA,GPIO_Pin_1,Bit_RESET);
}



光敏传感蜂鸣器(绿灯常亮,光线变暗,红灯亮,警报响起,光线恢复,警报解除)

在这里插入图片描述

//光敏蜂鸣器头文件
#ifndef Buzzer
#define Buzzer
//读取光敏传感器的数据
uint8_t Read_Buzzer_Data(void);
//初始化环境
void Buzzer_PhotoResitors_Init(void);
//光敏电阻响应
void Reaction_PhotoResitors(void);
//蜂鸣器响应
void Buzzer_Ring(void);
//蜂鸣器安静
void Buzzer_Slient(void);
#endif

//源文件
#include "stm32f10x.h"
#include "Button.h"
#include "Delay.h"
//读取光敏传感器的数据
uint8_t Read_Buzzer_Data(void){
    return  GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13); //读取蜂鸣器引脚数据
}
//初始化蜂鸣器和光敏电阻环境
void Buzzer_PhotoResitors_Init(void){
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);  //B端口时钟使能
    GPIO_InitTypeDef Buzzer;
  Buzzer.GPIO_Mode = GPIO_Mode_IPU; //上拉输入,保持光敏电阻在线
    Buzzer.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_12; 
    Buzzer.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB,&Buzzer);
    GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_SET);
}
//蜂鸣器响应,红灯亮
void Buzzer_Ring(void){
  GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);  //红灯亮
  GPIO_WriteBit(GPIOA,GPIO_Pin_1,Bit_SET);  //绿灯灭
  while(1){
    GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_RESET);  //低电平有效
    Delay_ms(200);
    GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_SET);
    Delay_ms(300);
    GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_RESET);  //低电平有效
    Delay_ms(300);
    GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_SET);
    Delay_ms(100);
    GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_RESET);  //低电平有效
    Delay_ms(200);
    GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_SET);
    Delay_ms(300);
    break;     //要退出循环,不然一直响,也回不到绿灯状态
  }
  
   
}
//蜂鸣器安静,绿灯亮
void Buzzer_Slient(void){
  GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);  //红灯灭
  GPIO_WriteBit(GPIOA,GPIO_Pin_1,Bit_RESET);  //绿灯亮
   GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_SET);  //高电平无效
}
//光敏电阻响应
void Reaction_PhotoResitors(void){
    uint8_t  RP = GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13);  
    if(RP==1) Buzzer_Ring();
    else Buzzer_Slient();
}

项目结构

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

github删除自己的仓库

测试Github的时候新建了很多仓库&#xff0c;但是后来想删除&#xff0c;找了半天居然没有找到按钮。 我就推测这个删除的功能肯定藏起来了&#xff0c;后来度娘了一下&#xff0c;发现果然在一个比较隐蔽的位置&#xff0c;不知道以后这个功能会不会改到一个比较明显的位置吧…

驱动开发-字符设备驱动的注册与注销

1.注册字符设备驱动 #include<fs.h> int register_chrdev(unsigned int major,const char *name,const struct file_operations *fops) 函数功能&#xff1a;注册字符设备驱动 参数&#xff1a;major&#xff1a;主设备号 major>0:静态指定主设备号&#xff0c;不…

uni-appH5Android混合开发二 || 使用Android Studio打包应用APK

前言&#xff1a; 在上一章节我们已经讲了如何uni-app离线打包Android平台教程&#xff0c;这一章就该来讲讲如何使用Android Studio打包应用APK提供给Android手机安装使用了。 uni-app跨平台框架介绍和快速入门 uni-app跨平台框架介绍和快速入门 第一步、首先打开已经编译好的…

vue cmd执行报错 ‘vue‘ 不是内部或外部命令

使用vue脚手架快速搭建项目&#xff0c;在cmd中执行&#xff1a;vue init webpack vue-demo&#xff0c;报错&#xff1a; vue 不是内部或外部命令,也不是可运行的程序 或批处理文件。 解决方法&#xff0c;执行如下的命令 npm config list 注意&#xff1a;找到prefix等号后…

[windows系统安装/重装系统][step-3]装驱动、打驱动、系统激活

重装系统三部曲 [windows系统安装/重装系统][step-1]U盘启动盘制作&#xff0c;微软官方纯净系统镜像下载-CSDN博客 [windows系统安装/重装系统][step-2]BIOS设置UEFI引导、磁盘分区GPT分区、安装系统[含完整操作拍照图片]-CSDN博客 [windows系统安装/重装系统][step-3]装驱动…

Navicat 17 的数据分析

上周的博客预告了 Navicat 17&#xff08;英文版&#xff09;即将发布&#xff0c;目前正在测试阶段&#xff0c;并计划于 5 月 13 日发布。如我们所见&#xff0c;版本 17 推出了众多令人兴奋的新功能。其中最大亮点是数据分析工具&#xff0c;只需点击按钮&#xff0c;即可为…

链表详解—单链表与双向链表

一.单链表 1.链表的概念及结构 (1)概念&#xff1a; 链表是一种物理存储结构上非连续&#xff0c;非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 (2)结构&#xff1a; 与顺序表不同的是&#xff0c;链表里的每个节点都是独立申请的空…

02c++模板部分讲解

1理解函数模板 #include<iostream> using namespace std;//函数模板 template<typename T> //定义一个模板参数列表 //模板类型参数 typename/class bool compare(T a, T b) {cout << "template compare: " << endl;return a > b; }temp…

centos7.9系统rabbitmq3.8.5升级为3.8.35版本

说明 本文仅适用rabbitmq为RPM安装方式。 升级准备 查看环境当前版本&#xff1a; # cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) # rabbitmqctl status Status of node rabbitmq01 ... RuntimeOS PID: 19333 OS: Linux Uptime (seconds): 58 Is under …

Blazor入门-基础知识+vs2022自带例程的理解

参考&#xff1a; Blazor 教程 - 生成首个应用 https://dotnet.microsoft.com/zh-cn/learn/aspnet/blazor-tutorial/intro Blazor基础知识&#xff1a;Visual Studio 2022 中的Blazor开发入门_vs2022 blazor webassembly-CSDN博客 https://blog.csdn.net/mzl87/article/detail…

【Unity自制手册】unity常用API大全——一篇文章足以(十万字详解)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 收录于专栏 unity 实战系列 ⭐相关文章⭐ ⭐【软件设计师高频考点暴击】 -本站最全-unity常用API大全&#xff08;万字…

性能测试 --概念

什么是性能测试 性能测试和功能测试都是在系统测试阶段运行, 两者有什么区别呢? 案例:豌豆射手和三线射手都是射手, 它们的功能都是向前发射豌豆进行攻击, 能够攻击到地面的僵尸. 但是从性能上来讲, 豌豆射手只能攻击到一路的僵尸, 而三线射手能同时攻击三路(注:放在边路实际…

如何统计区域内部公路总长度和绘制数据直方图

交通对区域经济发展具有重要的意义&#xff0c;诸多经济学文献均对此进行了深入探讨&#xff0c;那么如何在ArcGIS上统计区域内部交通路线的总长度呢&#xff1f;本文以全国各省份主要公路总长度为例详细介绍了相关ArcGIS以及统计直方图的操作。 工具&#xff1a; 使用ArcGIS中…

【JavaScript】内置对象 - 数组对象 ③ ( 数组反转 - reverse 方法 | 数组排序 - sort 方法 | 自定义数组排序规则 )

文章目录 一、数组排序1、翻转数组元素 - reverse()2、数组元素排序 - sort() 默认从小到大排序3、数组元素排序 - sort() 自定义排序规则4、数组元素排序 - sort() 自定义降序排序简化写法 Array 数组对象参考文档 : https://developer.mozilla.org/zh-CN/docs/Web/JavaScript…

C#编程模式之享元模式

创作背景&#xff1a;各位朋友&#xff0c;我们继续学习C#的编程模式&#xff0c;本文主要介绍享元模式。享元模式是一种结构型设计模式&#xff0c;它主要用于减少创建对象的数量&#xff0c;从而提高程序性能。它通过共享对象的方式来减少内存的使用&#xff0c;特别是系统中…

彩虹聚合DNS管理系统

聚合DNS管理系统可以实现在一个网站内管理多个平台的域名解析&#xff0c;目前已支持的域名平台有&#xff1a;阿里云、腾讯云、华为云、西部数码、CloudFlare。本系统支持多用户&#xff0c;每个用户可分配不同的域名解析权限&#xff1b;支持API接口&#xff0c;支持获取域名…

同城组局同城活动找搭子小程序JAVA源码面芽组局的实现方案

功能概述 基于微信小程序开发的一款软件&#xff0c;支持用户动态发布、私信聊天关注、礼物充值打赏、发起活动组局、用户报名参与、支持商家入驻&#xff0c;对接广告功能等。 活动发布&#xff1a;用户可以在平台上发布各种类型的活动&#xff0c;如户外徒步、音乐会观赏、…

回炉重造java----单列集合(List,Set)

体系结构: 集合主要分为两种&#xff0c;单列集合collection和双列集合Map&#xff0c;区别在于单列集合一次插入一条数据&#xff0c;而双列的一次插入类似于key-value的形式 单列集合collection 注:红色的表示是接口&#xff0c;蓝色的是实现类 ①操作功能: 增加: add()&am…

探索震坤行API:一键解锁高效工业用品采购新纪元!

震坤行是一家专注于工业用品的B2B电商平台&#xff0c;为企业客户提供一站式的工业用品采购服务。虽然震坤行没有直接公开通用的API接口供开发者调用&#xff0c;但通常大型企业或合作伙伴之间可以通过API进行系统集成和数据交互。以下是一个假设性的震坤行API接口调用示例与代…

博特激光:355nm高精度紫外激光打标机带来极致工艺

紫外激光打标机在现代制造业和技术中的应用&#xff0c;的确在准确度和精密度方面带来了革命性的提高。特别是在微电子、半导体、医疗器械、高端消费品等需要高精度、高清晰打标的行业&#xff0c;紫外激光打标机以其独特的优势&#xff0c;赋予产品极致的工艺品质。 以下是UV激…