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

项目结构

在这里插入图片描述

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值