首页 > 其他分享 >基于stm32排队系统完整代码分析(二)

基于stm32排队系统完整代码分析(二)

时间:2024-09-16 10:50:13浏览次数:3  
标签:led1 HAL PIN 代码 排队 stm32 gpio GPIO void

功能代码

led1.c、灯

#include "led.h"
#include "sys.h"


void led_init(void)
{
    GPIO_InitTypeDef gpio_initstruct;
    __HAL_RCC_GPIOB_CLK_ENABLE();
    
    gpio_initstruct.Pin   = GPIO_PIN_8 | GPIO_PIN_9;
    gpio_initstruct.Mode  = GPIO_MODE_OUTPUT_PP;
    gpio_initstruct.Pull  = GPIO_PULLUP;
    gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;
    
    HAL_GPIO_Init(GPIOB,&gpio_initstruct);
    led1_off();
    led2_off();
}


void led1_on(void)
{
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);
}

void led1_off(void)
{
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);
}

void led1_toggle(void)
{
    HAL_GPIO_TogglePin(GPIO_PIN_8);
}

void led2_on(void)
{
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);
}

void led2_off(void)
{
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);
}

void led2_Toggle(void)
{
    HAL_GPIO_TogglePin(GPIO_PIN_9);
}

task.c、线程

写代码之前要么写状态机,要么写流程图

//如果处于允许通行的状态

        //led1以1秒的频率闪烁

        //led2不闪烁
        //蜂鸣器不响

        //开门

#include "tasks.h"
#include "led.h"
#include "beep.h"
#include "exti.h"
#include "lcd1602.h"
#include "gate.h"
#include "stdio.h"


enum  //状态一般用枚举的方法   两种(允许和不允许) 工作中通常使用枚举,将工作状态定义出来

{
    PASS_STATE,
    WAIT_STATE
};
//时间计数
uint32_t led1_task1_cnt = 0;
uint32_t led2_task2_cnt = 0;
uint32_t wait_cnt       = 0;

//乘客
uint32_t passager       = 0;

// 灯线程
uint8_t led1_task1_flag = 0;
uint8_t led2_task2_flag = 0;

uint8_t state = PASS_STATE;//刚开始显示一个默认通行的状态


char message[16] = {0};//构造一个字符串,定义一个,----字符数组来实现
void systick_isr(void)
{
    //如果处于允许通行的状态
    if(state == PASS_STATE)
    {
       //led以1秒的频率闪烁
        if(led1_task1_cnt < 1000)
        led1_task1_cnt++;
        else
        {
        led1_task1_flag = 1;
        led1_task1_cnt  = 0;       
} 
       //led2不闪烁
        led2_off();
        //蜂鸣器不响
        beep_off();
        //开门
}

    else if(state == WAIT_STATE)
    {
       //led以1秒的频率闪烁
        if(led1_task2_cnt < 200)
            led1_task2_cnt++;
        else
        {
            led1_task1_flag = 1;
            led1_task1_cnt  = 0;       
} 
       //led1不闪烁
        led1_off();
        //蜂鸣器响
        beep1_off();
        //关门
        gate1_on();
        if(wait_cnt < 3000)
                wait_cnt++;
        //进入允许通行的状态
        else
        {
            wait_cnt = 0;
            //进入允许通行的状态
            state = PASS_STATE;.
            //lcd显示状态
            lcd1602_show_line(1,1,“PASS...”);
         }

}
}
}
灯1线程


void led1_task1(void)
{
    if(led1_task1_flag == 0)//
    return ;
    led1_task1_flag = 0;
    
    led1_toggle();
}

灯2线程
void led2_task2(void)
{
    if(led1_task2_flag == 0)//如果等于0表示计时还未结束,不执行后面的代码,反之执行
    return ;
    led1_task2_flag = 0;

    led2_toggle();
}

//定义一个红外传感器的线程
void senser_task(void)
{
    //检测到有人通过
        //if(ia_flag_get() == TRUE && state == PASS_STATE)
        //有人通过的同时也要处在通过状态才能允许继续计数,
          {
        passenger++;
        sprintf(message, "PASS...%02d/05", passenger);//两位显示
        lcd1602_show_line(1,1,message);//刷新显示
}
    //如果通过的人数超过5个
    if(passager >= 5)
    {
            //计数清零
            passager = 0;
            //进入不允许通行状态
            state = WAIT_STATE;
            //LCD显示状态
            lcd1602_show_line(1,1,"WAIT...00/05");
    }
        
}

exti.c 、外部事件中断

uint8_t ia_flag = FALSE;                               // 检测到震动标志位

void exti_init(void)
{
    GPIO_InitTypeDef gpio_initstruct;
    //打开时钟
    __HAL_RCC_GPIOB_CLK_ENABLE();                           // 使能GPIOA时钟
    
    //调用GPIO初始化函数
    gpio_initstruct.Pin = GPIO_PIN_4;                       // 震动传感器对应的引脚
    gpio_initstruct.Mode = GPIO_MODE_IT_FALLING;            // 下降沿触发
    gpio_initstruct.Pull = GPIO_PULLUP;                     // 上拉
    HAL_GPIO_Init(GPIOB, &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)
{
    delay_ms(20);
    if (GPIO_Pin == GPIO_PIN_4)
    {
        if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_4) == GPIO_PIN_RESET)
            //led1_toggle();
            ia_flag = TRUE;
    }
}

uint8_t ia_flag_get(void)
{
    uint8_t temp = ia_flag;
    ia_flag = FALSE;
    return temp;
    
}

void ia_flag_set(uint8_t value)
{
    ia_flag = value;
}

gate.c、继电器控制门

#include "gate.h"
#include "sys.h"

void gate_init(void)
{
    GPIO_InitTypeDef gpio_initstruct;
    
    HAL_RCC_GPIOB_CLK_ENABLE();
    
    gpio_initstruct.Pin  = GPIO_PIN_6;
    gpio_initstruct.Mode = GPIO_MODE_OUT_PP;
    gpio_initstruct.Pull = GPIO_PULLUP;//低电平触发
    gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;//速度随意不做要求
    
    HAL_GPIO_Init(GPIOB,&gpio_initstruct);
    gate1_off(); 
}


void gate1_on(void)
{
  
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET);

}

void gate1_off(void)
{
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET);

}

void gate1_toggle(void)
{
    HAL_GPIO_TogglePin(GPIO_PIN_6);
}

lcd1602.c、液晶屏显示

beep.c 蜂鸣器

#include "beep.h"
#include "sys.h"

void beep_init(void)
{
    GPIO_InitTypeDef gpio_initstruct;
    
    HAL_RCC_GPIOB_ENABLE();
    gpio_initstruct.Pin   = GPIO_PIN_5;
    gpio_initstruct.Mode  = GPIO_MODE_OUTPUT_PP;
    gpio_initstruct.Pull  = GPIO_PULLUP;//低电平触发
    gpio_initstruct.Speed = GPIO_SPEED_FREG_HIGH;
    
    beep_off();
    
}

void beep_on(void)
{
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);
}

void beep_off(void)
{
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);
}

主函数

#include "tasks.h"
#include "gate.h"
#include "beep.h"
#include "exti.h"
#include "lcd1602.h"

int main(void)
{
    HAL_Init();                         /* 初始化HAL库 */
    stm32_clock_init(RCC_PLL_MUL9);     /* 设置时钟, 72Mhz */
    led_init();                         /* 初始化LED灯 */
    gate_init();                        /* 初始化继电器 */
    beep_init();                        /* 初始化蜂鸣器 */
    exti_init();                        /* 初始化红外传感器 */
    lcd1602_init();                     /* 初始化LCD1602 */
    
    lcd1602_show_line(1, 1, "PASS...");

    while(1)
    { 
        led1_task();
        led2_task();
        sensor_task();

    }
}

标签:led1,HAL,PIN,代码,排队,stm32,gpio,GPIO,void
From: https://blog.csdn.net/qq_65524926/article/details/142287953

相关文章

  • python毕业设计可视化主题:python体育用品销售电商数据可视化系统毕业设计源代码作品和
     博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩。项目配有对应开发文档、开题报告、任务书、P......
  • 代码随想录算法训练营Day5 | 哈希表理论基础、242.有效的字母异位词、349.两个数组的
    哈希表理论基础哈希表哈希表是根据关键码的值而直接进行访问的数据结构。数组就是一张哈希表,哈希表中关键码就是数组的索引下标,然后通过下标直接访问数组中的元素,如下图所示:哈希表一般用来快速判断一个元素是否出现集合里。哈希函数哈希函数通过特定编码方式,可以将其......
  • Verilog - 串口命令封装(多个命令封装为1个命令)代码
    串口命令封装,代码实现思想:1.对接收的串口数据(8bit)进行移位2.识别封装命令,输出配置使能信号3.计数(计数器cnt),使计数时间大于一个命令的配置时间,当达到计数值cnt_x时,输出有效信号并对计数器清零4.输出flag信号:开始配置时,将flag信号拉高,配置完成后拉低5.计数(计数器cnt_ca......
  • 阅读周·深入浅出的Node.js | 代码测试,开发者掌握代码的行为和性能的极佳思路
    背景去年下半年,我在微信书架里加入了许多技术书籍,各种类别的都有,断断续续的读了一部分。没有计划的阅读,收效甚微。新年伊始,我准备尝试一下其他方式,比如阅读周。每月抽出1~2个非连续周,完整阅读一本书籍。这个“玩法”虽然常见且板正,但是有效。已读完书籍:《架构简洁之道》。当前阅读......
  • ICM20948 DMP代码详解(24)
    接前一篇文章:ICM20948DMP代码详解(23) 上一回解析完了inv_icm20948_set_lowpower_or_highperformance函数,本回回到inv_icm20948_initialize_lower_driver函数中,继续往下解析。为了便于理解和回顾,再次贴出inv_icm20948_initialize_lower_driver函数源码,在EMD-Core\sources\Inv......
  • ICM20948 DMP代码详解(23)
    接前一篇文章:ICM20948DMP代码详解(22) 上一回解析完了inv_icm20948_wakeup_mems函数,本回回到inv_icm20948_initialize_lower_driver函数中,继续往下解析。为了便于理解和回顾,再次贴出inv_icm20948_initialize_lower_driver函数源码,在EMD-Core\sources\Invn\Devices\Drivers\IC......
  • zblogphp调用当前日期/当前时间代码汇总
    有的朋友在使用zblogphp程序中会遇到想调用当前时间,官方wiki里面这个标签没有写。本文来汇总下zblogphp调用当前时间的代码。首先zblogphp使用的是php语言,所以php怎么调用的zblogphp也可以直接拿来主义,但是标签格式得改改。废话不多说,zblog的调用标签是{date("Y-m-dH:i:s")},调......
  • 走进低代码表单开发(三):高效业务功能构建
    前面我们已经介绍了勤研低代码开发平台的页面设计相关的内容,当页面设计完成后,我们将继续进行表单的功能开发,接下来,我们一起走进勤研低代码开发平台高效便捷的表单功能设计,来看看勤研低代码平台如何为用户带来全新的开发体验。一、可视化布局与事件定义勤研低代码开......
  • opencv学习:calcHist 函数绘制图像直方图及代码实现
    cv2.calcHist函数是OpenCV库中用于计算图像直方图的函数。直方图是一种统计图像中像素值分布的工具,它可以提供图像的亮度、颜色等信息。这个函数可以用于灰度图像和彩色图像。函数语法hist=cv2.calcHist(images,channels,mask,histSize,ranges,accumulate=False)......
  • opencv学习:图像旋转的两种方法,旋转后的图片进行模板匹配代码实现
    图像旋转在图像处理中,rotate和rot90是两种常见的图像旋转方法,它们在功能和使用上有一些区别。下面我将分别介绍这两种方法,并解释它们的主要区别rot90 方法rot90方法是NumPy提供的一种数组旋转函数,它主要用于对二维数组(如图像)进行90度的旋转。这个方法比较简单,只支持9......