当前位置:   article > 正文

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

物联网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;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

按键控制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;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

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



  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75

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

在这里插入图片描述

//光敏蜂鸣器头文件
#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();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67

项目结构

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/558783
推荐阅读
相关标签
  

闽ICP备14008679号