基于STM32的HAL库的项目电动车报警器及相关模块程序

项目电动车报警器

1.按键点灯(中断法)

实验目的

使用中断的方法,按下 KEY1 翻转 LED1 状态,而 LED2 一直保持 500ms 的频率闪烁

注意: 按键驱动一般使用轮询法。 如果采用中断法,由于软件消抖需要在中断服务函数加入延时函数,这种做法一般是不被允许的。由于还未学到传 感器模块及定时器,本实验暂时在中断服务函数中加入延时函数。

初始化exti函数            

打开时钟

对GPIO的结构体指针变量赋值

初始化GPIO

设置中断优先级

使能中断

中断服务函数

回调函数----(写功能代码)

上拉电阻初始态即可稳定成高电平

对于输入IO, 默认为高电平,当需要改变为低电平时配置为PULLUP


void exti_init(void)
{
    GPIO_InitTypeDef gpio_initstruct;
    __HAL_RCC_GPIOA_CLK_ENABLE();
    
    gpio_initstruct.Pin   = GPIO_PIN_0;
    gpio_initstruct.Mode  = GPIO_MODE_IT_FALLING;//下降沿触发
    gpio_initstruct.Pull  = GPIO_PULLUP;
    HAL_GPIO_Init(GPIOA,&gpio_initstruct);
    HAL_NVIC_SetPriority(EXTI0_IPQn,2,0);
    HAL_NVIC_EnableIRQ(EXTI0_IRQn);
        
}

void EXTI0_IRQHandler(void)
{
    HAL_GPIO_EXTI_IRQHandler(void);
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
     delay_ms(20);//延时消抖
    if(GPIO_Pin == GPIO_PIN_0)//检测按下
{
    if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_RESET)//再次检测是否按下
{
    led1_toggle();
}
}
}

 主函数

#include "led.h"
#include "exti.h"
#include "delay.h"
//主函数

void main(void)
{
    led_init();
    exti_init();
    while(1){
    delay_ms(500);
    led1_on();
    delay_ms(500);
    led1_off();
    
}
}

2.震动点灯

实验目的

震动点灯 实验目的 使用中断的方法,振动传感器检测到振动时,LED1 点亮 2 秒,之后熄灭。

 SW-18015P 在无震动或者震动强度达不到设定阈值时,DO 口输出高电平,当外界震动强度超过设定阈值时,模块 D0 输出低电平

        初始化EXTI函数

        打开时钟

        对GPIO的结构体指针变量赋值

        初始化GPIO

        设置中断优先级

        使能中断

中断服务函数

        HAL_GPIO_EXTI_IRQHandler()函数代码,是用户处理外部中断事件。

        该函数作用是检测指定的GPIO引脚是否发生外部中断事件

        这个函数在执行的时候是不是会调用HAL_GPIO_EXTI_Callback(功能可以另外写)

        

回调函数

        判断是否震动的端口捕获的数据

                读取振动状态 如果为低电平则设置vibrate——标志位设置为TRUE

判断是否震动

        中断标志位获取

返回中断标志位uint8_t vibrate_flag_get(void)

设置标志位状态void vibrate_flag_set(uint8_t value)

void exti_init(void)
{
    GPIO_InitTypeDef gpio_initstruct;
    __HAL_RCC_GPIOA_CLK_ENABLE();
    
    gpio_initstruct.Pin  = GPIO_PIN_4;//震动模块所接引脚
    gpio_initstruct.Mode = GPIO_PIN_IT_FALLING;
    gpio_initstruct.Pull = GPIO_PULLUP; //上拉
    
    HAL_GPIO_Init(GPIOA,&gpio_initstruct);
    HAL_NVIC_SetPriority(EXTI4_IRQn,2,0);//设置EXTI0中断优先级
    HAL_NVIC_EnableIRQ(EXTI4_IRQn);
}


void EXTI4_IRQHandler(void)
{
    HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4);
}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if(GPIO_Pin == GPIO_PIN_4)
{
    if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_4) == GPIO_PIN_RESET){
    vibrate_flag = TRUE
}
}
}

uint8_t vibrate_flag_get(void)
{
    uint8_t temp = vibrate_flag;
    vibrate_flag = FALSE;
    return temp;
}

void vibrate_flag_set(uint8_t value)
{
    vibrate_flag = value;
}

3.继电器定时开闭

  • 输入部分:
继电器单片机/电路备注
DC+/VCC电源正极按继电器要求,接5V、12、24V或其他电压
DC-/GND电源负极
INIO口可以以高或低电平控制继电器吸合
  • 输出部分:

以下三个引脚,COM 一定要接,NO 和 NC 二选一。

继电器电路备注
NO需要控制的电路,与 NC 二选一常开接口,继电器吸合前悬空,吸合后与COM短接,电路闭合
COM公共端继电器公用接口
NC需要控制的电路,与 NO 二选一常闭接口,继电器吸合前与COM短接,吸合后悬空,电路断开

工作示意图如下:

实验目的

继电器 500ms 闭合,再 500ms 断开,如此循环。

        继电器的程序写成对应功能的函数

问题:继电器在什么条件下吸合---当输入高电平时,晶体管T饱和导通,继电器线圈通电,触点吸合。当输入低电平时,晶体管T1截止,继电器线圈断电,触点断开

低电平触发

跳线与 L 短接时为低电平触发,跳线与 H 短接时为高电平触发。

GPIO初始化

void alarm_init(void)
{
    GPIO_InitTypeDef gpio_initstruct;
    HAL_RCC_GPIOB_CLK_ENABLE();
    gpio_initstruct.Pin   = GPIO_PIN_7;
    gpio_initstruct.Mode  = GPIO_MODE_OUTPUT_PP;
    gpio_initstruct.Pull  = GPIO_PULLUP;5//初始态即可 稳定成高电平
    gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;
    
    HAL_GPIO_Init(GPIOB,&gpio_initstruct);
    alarm1_off();
      
}

喇叭上电函数


void alarm1_on(void)//低电平触发
{
    //将GPIO口拉低
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_RESET);
}

喇叭下电函数


void alarm1_off(void)
{
    //将GPIO口拉高
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_SET);
}

获取继电器状态函数

//返回的类型是bitstatus,我们所定义的是uint8——t类型的

uint8_t alarm_status_get(void)
{
    return (uint8_t)HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_7);
}

4.433M点灯实验

实验目的

按下遥控器 A 键,LED1 亮/灭;按下遥控器 B 键,LED2 亮/灭。

 433M 模块的四个数据位输出脚 D0、D1、D2、D3。按下按键发射信号,对应的引脚就会输出高电平。

433M 模块一般按照工作模式分类 

  1. M 点动:瞬态输出,相当于自复位开关的状态收到信息输出高电平,无信号时为低电平。
  2. T 锁存:上电时为低,收到信号输出高电平并锁定高,再次收到信号输出低并锁定低。
  3. L 自锁:上电时为低,收到信号输出高电平并锁定高,同时将其他输出置低。
  • 天线对模块的接收效果影响很大,最好接 1/4 波长的天线,一般采用 50 欧姆单芯导线,433M 的天线的长度约为 17 cm
  • 天线位置对模块接收效果有影响,安装时,天线尽可能伸直,远离屏蔽体、高压及干扰源的地方。

 实例程序

初始化事件中断控制器

使能时钟

初始化GPIO

        Mode用上升沿,按键按下时给的是一个上升沿,RISING

默认情况下,下拉。

下拉电阻直接接GND,或当接到二极管并连接到低电平时,它被称为下拉电阻,因为电路节点的电平被下拉到地

(1)通过电阻将不确定信号接GND,将其锁定在低电平;

(2)下拉是器件输出电流;

(3)当与下拉电阻连接的IO端口设置为输入状态时,其正常状态处于低电平

设置成上升沿模式,拉电阻设置为下拉吗?默认低电平,为上升沿做准备?

        中断优先级

        使能中断

中断服务函数15_10

回调函数

返回标志位函数

毙掉标志位----可以使用在主程序中防止中断后,又触发中断,导致的问题

#define TRUE  1
#define FALSE 0
uint8_t buttonA_flag = FALSE;
uint8_t buttonB_flag = FALSE;
void exti_init(void)
{
    GPIO_InitTypeDef gpio_initstruct;
    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_GPIOB_CLK_ENABLE();

    gpio_initstruct.Pin  = GPIO_PIN_12;
    gpio_initstruct.Mode = GPIO_Mode_IT_RISING;
    gpio_initstruct.Pull = GPIO_PULLDOWN;
    HAL_GPIO_Init(GPIOA,GPIO_PIN_12);

    HAL_NVIC_SetPriority(EXTI15_10_IRQn,2,0);
    HAL_NVIV_Enable(EXTI15_10_IRQn);
    
     gpio_initstruct.Pin  = GPIO_PIN_5;
    gpio_initstruct.Mode = GPIO_Mode_IT_RISING;
    gpio_initstruct.Pull = GPIO_PULLDOWN;
    HAL_GPIO_Init(GPIOB,GPIO_PIN_5);

    HAL_NVIC_SetPriority(EXTI9_5_IRQn,2,0);
    HAL_NVIV_Enable(EXTI9_5_IRQn);
}

void EXTI15_10_Handler(void)
{
    HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12);
}

void EXTI15_10_IRQHandler(void)
{
    HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_5);
}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if(GPIO_Pin == GPIO_PIN_5)
{
    if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_5) == GPIO_PIN_SET)
    {
        buttonA_flag = TRUE;
}
}
    else if(GPIO_Pin == GPIO_PIN_12)
{
    if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_12) == GPIO_PIN_SET)
    {
        buttonB_flag = TRUE;
}
}
}

uint8_t buttonA_flag_get(void)
{
    uint8_t temp = buttonA_flag;
    buttonA_flag = FALSE;
    return temp;

}

void buttonA_Flag_set(uint8_t value)
{
    buttonA_flag = value;
}
uint8_t buttonB_flag_get(void)
{
    uint8_t temp = buttonB_flag;
    buttonA_flag = FALSE;
    return temp; 
}

void buttonB_Flag_set(uint8_t value)
{
    buttonB_flag = value;
}

主函数

#include "sys.h"
#include "delay.h"
#include "exti.h"
#include "led.h"


void main(void)
{
    HAL_Init();
    stm32_clock_init(RCC_PLL_MUL9);
    led_init();
    exti_init();
    
    while(1)
{

    if(buttonA_flag_get() == TRUE)
    led1_toggle();
    if(buttonA_flag_get() == TRUE)
    led3_toggle();
}
    
}

5.项目电动车报警器

项目需求

 功能程序

点击遥控器 A 按键,系统进入警戒模式,一旦检测到震动(小偷偷车),则喇叭发出声响报警,吓退小偷。 点击遥控器 B 按键,系统退出警戒模式,再怎么摇晃系统都不会报警,否则系统一直发出尖叫,让车主尴 尬。

项目流程图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值