【STM32单片机_(HAL库)】3-4-3【中断EXTI】【智能排队控制系统】排队系统代码框架搭建

news2024/9/24 13:25:53

3-4-2系统框图及硬件接线

3.软件

  • beep、exti、gate、LCD1602、led、tasks驱动文件添加
  • GPIO常用函数
  • 中断配置流程
  • main.c程序
#include "sys.h"
#include "delay.h"
#include "led.h"
#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, 2, "HELLO");

    while(1)
    {         
//        if(ia_flag_get() == TRUE)
//        {
//            led1_on();
//            delay_ms(2000);
//            led1_off();
//        }
//        beep_on();
//        delay_ms(500);
//        beep_off();
//        delay_ms(500);
//        task1();
//        task2();
    }
}




  • exti.c程序
#include "exti.h"
#include "sys.h"
#include "delay.h"
#include "led.h"

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

  • exti.h程序
#ifndef __EXTI_H__
#define __EXTI_H__

#include "stdint.h"

#define TRUE    1
#define FALSE   0

void exti_init(void);
uint8_t ia_flag_get(void);
void ia_flag_set(uint8_t value);

#endif

  • gate.c
#include "gate.h"
#include "sys.h"

//初始化GPIO函数
void gate_init(void)
{
    GPIO_InitTypeDef gpio_initstruct;
    //打开时钟
    __HAL_RCC_GPIOB_CLK_ENABLE();                           // 使能GPIOB时钟
    
    //调用GPIO初始化函数
    gpio_initstruct.Pin = GPIO_PIN_6;                       // 继电器对应的引脚
    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);
    //关闭LED
    gate_off();
}

//闭合继电器的函数
void gate_on(void)
{
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);   // 拉低LED1引脚,点亮LED1
}

//松开继电器的函数
void gate_off(void)
{
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);     // 拉高LED1引脚,熄灭LED1
}

//获取继电器状态的函数
uint8_t gate_status_get(void)
{
    return (uint8_t)HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_6);
}

  • gate.h
#ifndef __GATE_H__
#define __GATE_H__

#include "stdint.h"

#define GATE_STATUS_ON     0
#define GATE_STATUS_OFF    1

void gate_init(void);
void gate_on(void);
void gate_off(void);
uint8_t gate_status_get(void);

#endif


  • beep.c
#include "beep.h"
#include "sys.h"

//初始化GPIO函数
void beep_init(void)
{
    GPIO_InitTypeDef gpio_initstruct;
    //打开时钟
    __HAL_RCC_GPIOB_CLK_ENABLE();                           // 使能GPIOB时钟
    
    //调用GPIO初始化函数
    gpio_initstruct.Pin = GPIO_PIN_5;                       // 蜂鸣器对应的引脚
    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);
    //关闭蜂鸣器
    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);     // 拉高蜂鸣器引脚,关闭蜂鸣器
}

  • beep.h
#ifndef __BEEP_H__
#define __BEEP_H__

void beep_init(void);
void beep_on(void);
void beep_off(void);

#endif

  • led.c
#include "led.h"
#include "sys.h"

//初始化GPIO函数
void led_init(void)
{
    GPIO_InitTypeDef gpio_initstruct;
    //打开时钟
    __HAL_RCC_GPIOB_CLK_ENABLE();                           // 使能GPIOB时钟
    
    //调用GPIO初始化函数
    gpio_initstruct.Pin = GPIO_PIN_8 | GPIO_PIN_9;          // 两个LED对应的引脚
    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);
    //关闭LED
    led1_off();
    led2_off();
}

//点亮LED1的函数
void led1_on(void)
{
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);   // 拉低LED1引脚,点亮LED1
}

//熄灭LED1的函数
void led1_off(void)
{
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);     // 拉高LED1引脚,熄灭LED1
}

//翻转LED1状态的函数
void led1_toggle(void)
{
    HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_8);
}

//点亮LED2的函数
void led2_on(void)
{
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET);   // 拉低LED2引脚,点亮LED2
}

//熄灭LED2的函数
void led2_off(void)
{
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET);     // 拉高LED2引脚,熄灭LED2
}

//翻转LED2状态的函数
void led2_toggle(void)
{
    HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_9);
}

  • led.h
#ifndef __LED_H__
#define __LED_H__

void led_init(void);
void led1_on(void);
void led1_off(void);
void led1_toggle(void);
void led2_on(void);
void led2_off(void);
void led2_toggle(void);

#endif

  • tasks.c
#include "tasks.h"
#include "led.h"

uint32_t task1_cnt = 0;
uint32_t task2_cnt = 0;

uint8_t task1_flag = 0;
uint8_t task2_flag = 0;

void systick_isr(void)
{
    if (task1_cnt < 1000)
        task1_cnt++;
    else
    {
        task1_flag = 1;
        task1_cnt = 0;
    }

    if (task2_cnt < 500)
        task2_cnt++;
    else
    {
        task2_flag = 1;
        task2_cnt = 0;
    }
}

void task1(void)
{
    if(task1_flag == 0)
        return;
    
    task1_flag = 0;
    
    led1_toggle();
}

void task2(void)
{
    if(task2_flag == 0)
        return;
    
    task2_flag = 0;
    
    led2_toggle();
}

  • tasks.h
#ifndef __TASKS_H__
#define __TASKS_H__

#include "sys.h"

void systick_isr(void);
void task1(void);
void task2(void);

#endif

  • lcd1602.c
#include "lcd1602.h"
#include "string.h"
#include <stdarg.h>
#include "delay.h"

// RS引脚定义
#define RS_GPIO_Port GPIOB
#define RS_GPIO_PIN GPIO_PIN_1
#define RS_HIGH     HAL_GPIO_WritePin(RS_GPIO_Port, RS_GPIO_PIN, GPIO_PIN_SET)
#define RS_LOW      HAL_GPIO_WritePin(RS_GPIO_Port, RS_GPIO_PIN, GPIO_PIN_RESET)

// RW引脚定义
#define RW_GPIO_Port GPIOB
#define RW_GPIO_PIN GPIO_PIN_2
#define RW_HIGH     HAL_GPIO_WritePin(RW_GPIO_Port, RW_GPIO_PIN, GPIO_PIN_SET)
#define RW_LOW      HAL_GPIO_WritePin(RW_GPIO_Port, RW_GPIO_PIN, GPIO_PIN_RESET)

// EN引脚定义
#define EN_GPIO_Port GPIOB
#define EN_GPIO_PIN GPIO_PIN_10
#define EN_HIGH     HAL_GPIO_WritePin(EN_GPIO_Port, EN_GPIO_PIN, GPIO_PIN_SET)
#define EN_LOW      HAL_GPIO_WritePin(EN_GPIO_Port, EN_GPIO_PIN, GPIO_PIN_RESET)

/**
 * @brief       LCD1602 GPIO初始化
 * @param       无
 * @retval      无
 */
void lcd1602_gpio_init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();


  GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3
                          |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /*Configure GPIO pins : PB1 PB2 PB10 */
  GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_10;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}

/**
 * @brief       lcd开始工作
 * @param       无
 * @retval      无
 */
void lcd1602_start(void)
{
//(1)延时 15ms
    delay_ms(15);
//(2)写指令 38H(不检测忙信号) 
    lcd1602_write_cmd(0x38);
//(3)延时 5ms
    delay_ms(5);
//(4)检测忙信号(省略)
//(5)写指令 38H:显示模式设置
    lcd1602_write_cmd(0x38);
//(6)写指令 08H:显示关闭
    lcd1602_write_cmd(0x08);
//(7)写指令 01H:显示清屏
    lcd1602_write_cmd(0x01);
//(8)写指令 06H:显示光标移动设置
    lcd1602_write_cmd(0x06);
//(9)写指令 0CH:显示开及光标设置
    lcd1602_write_cmd(0x0c);
}

/**
 * @brief       LCD1602初始化
 * @param       无
 * @retval      无
 */
void lcd1602_init(void)
{
    lcd1602_gpio_init();
    lcd1602_start();
}

/**
 * @brief       写指令
* @param        cmd:指令
 * @retval      无
 */
void lcd1602_write_cmd(char cmd)
{
    RS_LOW;
    RW_LOW;
    EN_LOW;
    GPIOA->ODR = cmd;       //将一字节数据发到GPIOA 8个引脚
    delay_ms(5);
    EN_HIGH;
    delay_ms(5);
    EN_LOW;
}

/**
 * @brief       写数据
 * @param       dataShow:显示的字符
 * @retval      无
 */
void lcd1602_write_data(char dataShow)
{
    RS_HIGH;
    RW_LOW;
    EN_LOW;
    GPIOA->ODR = dataShow;   //将一字节数据发到GPIOA 8个引脚
    delay_ms(5);
    EN_HIGH;
    delay_ms(5);
    EN_LOW;
}

/**
 * @brief       画面右移
 * @param       无
 * @retval      无
 */
void lcd1602_right_move(void)
{
    for(int i=0;i < 16;i++){
        delay_ms(1000);
        lcd1602_write_cmd(0x18);            //画面右移一位 0x18
    }
}

/**
 * @brief       显示字符
 * @param       row: 显示行,col: 显示起始列,string:显示字符
 * @retval      无
 */
void lcd1602_show_line(char row, char col, char *string)
{
    switch(row){
    case 1:
        lcd1602_write_cmd(0x80+col);        //最高位 D7 为高电平
        while(*string){
            lcd1602_write_data(*string);
            string++;
        }
        break;
    
    case 2:
        lcd1602_write_cmd(0x80+0x40+col);
        while(*string){
            lcd1602_write_data(*string);
            string++;
        }
        break;
    }
}

  • lcd1602.h
#ifndef __LCD1602_H__
#define __LCD1602_H__

#include <stdint.h>


void lcd1602_init(void);
void lcd1602_write_cmd(char cmd);
void lcd1602_write_data(char dataShow);
void lcd1602_show_line(char row, char col, char *string);
void lcd1602_right_move(void);

#endif

在这里插入图片描述

智能排队控制系统项目代码框架

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

联华证券-股票冲高回落的意义:上方抛压恢复

“股票冲高回落”是指股票价格在一段时期内迅速上涨至较高水平后&#xff0c;随后又下跌的现象。这种情况通常表明市场对股票的短期上涨缺乏持续的支撑。以下是冲高回落的主要意义和原因&#xff1a; 1.上方抛压较重 抛压是指大量的卖出订单&#xff0c;这些订单可能在股价达到…

刘海屏的优雅回归?华为Mate 70 Pro定义新美学

在智能手机的发展历程中&#xff0c;华为Mate系列一直是高端旗舰的代表。而今&#xff0c;华为Mate 70 Pro的神秘面纱终于揭开&#xff0c;其回归的刘海屏设计和独特的寰宇舷窗设计&#xff0c;再次将华为的设计理念推向了新的高度。 刘海屏的回归&#xff1a;经典与创新的融合…

用于低质量蒙面人脸识别的一致子决策网络

Consistent Sub-Decision Network for Low-Quality Masked Face Recognition 摘要 提出了一种利用由多个dropout块组成的在线一致性评估结构来获得对应于人脸不同区域的子决策网络&#xff0c;以获得对应于不同面部区域的子决策&#xff0c;并通过加权双向KL散度来约束子决策&…

Transformer模型-5-Multi-Head Attention

上图红色圈中的部分为 Multi-Head Attention&#xff0c;是由多个Self-Attention组成的&#xff0c;虽然Encoder与Decoder中都有Multi-Head Attention&#xff0c;但他们略有区别。Encoder block包含一个 Multi-Head Attention&#xff0c; 而Decoder block包含两个 Multi-Head…

从聊天机器人到智能算法:Facebook AI技术的最新应用

人工智能&#xff08;AI&#xff09;技术的飞速发展正推动社交网络进入一个全新的智能化时代。作为全球领先的社交平台之一&#xff0c;Facebook&#xff08;现已改名为Meta&#xff09;在AI技术应用方面不断创新&#xff0c;推动了从聊天机器人到智能算法的诸多突破。本文将探…

C++第十三弹 -- STL之stack深度剖析与模拟实现

文章索引 前言1. stack的介绍2. stack的使用3. stack的模拟实现4. stackOJ题目4.1 最小栈4.2 栈的压入弹出序列4.3 用栈实现队列 总结 前言 在现代C编程中&#xff0c;STL&#xff08;标准模板库&#xff09;是一个不可或缺的工具。它提供了一套通用的模板类和算法&#xff0c…

Vue 2.x时间转换为北京时间(+8)

文章目录 当前时间格式效果图理想时间格式效果图转换方法总结 当前时间格式效果图 非中国常用时间格式&#xff0c;在上图中给可以看到&#xff0c;选择的时间为&#xff1a;2024-8-26 ~ 2024-8-27&#xff0c;返回结果却是&#xff1a;2024-08-25TXX:XX:XXZ&#xff0c;明显不…

C/C++开发神器CLion全新发布v2024.2——更适用于嵌入式开发

CLion是一款专为开发C及C所设计的跨平台IDE。它是以IntelliJ为基础设计的&#xff0c;包含了许多智能功能来提高开发人员的生产力。这种强大的IDE帮助开发人员在Linux、OS X和Windows上来开发C/C&#xff0c;同时它还使用智能编辑器来提高代码质量、自动代码重构并且深度整合CM…

教你识别原装与翻新芯片IC

在IC采购中&#xff0c;鉴别芯片真伪至关重要。原装芯片经过严格测试&#xff0c;而散新、翻新芯片可能存在质量和稳定性问题。市面上的IC芯片林林总总、各式各样&#xff0c;如果不注意区分&#xff0c;有时很难看出各种料有何不同。 假芯片制作手段包括翻新、打磨等&#xf…

2024年小红书图文制作超火爆风格,1单19.9!趣味性插画AI表情包项目思路

今天我想跟大家分享一个每天只需花20分钟就能轻松赚钱的AI表情包项目。 这个项目在小红书上非常受欢迎&#xff0c;因为它符合小红书的用户习惯&#xff0c;而且操作简单。下面我来详细讲讲如何利用软件快速创作有趣的插画&#xff01; 项目简介 这个项目的原理很简单&#x…

自助共享空间小程序怎么做 共享空间小程序系统开发制作方法

最近很多老板想要做一个自己公司的自助共享空间小程序系统&#xff0c;但是不知道该怎么做&#xff0c;本次瀚林就为大家详细介绍一下各种自助共享空间小程序系统的开发制作方法为大家做参考。 目前市面上的自助共享空间有很多类型例如常见的&#xff1a; 娱乐空间、棋牌室、共…

SpringBoot中MyBatis使用自定义TypeHandler

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

2-77 基于matlab-GUI的图像分割程序

基于matlab-GUI的图像分割程序&#xff0c;分别包括超像素 (superpixels)分割 SLIC算法&#xff0c;mean shift 图像分割&#xff0c;H算法&#xff08;Felzenszwalb和Huttenloch提出的图像分割算法&#xff09;&#xff0c;SEEDS&#xff08;Superpixels Extracted via Energy…

docker-compose单机部署rocketmq集群(双主双从,同步双写)

1.本文以RocketMQ 5.3.0 版本的镜像为例。 2.首先先更新docker&#xff0c;之前旧版docker&#xff0c;导致rocketmq一直起不来&#xff0c;一直报错。 3.安装docker-compose。 服务器环境&#xff08;目前只用192.168.25.135后期改ip地址即可&#xff09; | 1 | 192.168.…

ArcGIS图斑导出CAD后变成三维多段线?

欢迎关注同名微信公众号&#xff0c;更多文章推送&#xff1a; 正常情况下&#xff0c;将ArcGIS中的图层导出为CAD&#xff0c;生成的是闭合多段线&#xff1a; 导出的CAD&#xff1a; 但是有时候导出的CAD变成三维多段线&#xff1a; 三维多段线有多麻烦用过CAD画图的人应该都…

【GD32 MUC 移植教程】从 GD32F10x 移植到 GD32F30x

1. 前言 对于使用 GD32 系列微控制器进行产品开发的设计人员来说&#xff0c;因产品及功能升级&#xff0c;往往需要将一种微控制器替换成另一种微控制器&#xff0c;在保留既有功能的情况下增加新功能。为了更快地推出新产品&#xff0c;设计人员经常要将应用程序移植到新的…

【数据分享】1999—2022年地级市各类交通工具的客货运量和拥有量数据(Shp/Excel格式)

在之前的文章中&#xff0c;我们分享过基于2000-2023年《中国城市统计年鉴》整理的1999-2022年地级市的人口相关数据、各类用地面积数据、污染物排放和环境治理相关数据、房地产投资情况和商品房销售面积、社会消费品零售总额和年末金融机构存贷款余额、一般公共预算收支状况、…

Transformer模型-4-Inputs

Encoder的输入层和Decoder的输入层是一样的结构&#xff0c;都是由Token embedding&#xff08;词向量 word embedding&#xff09; 和 Positional embedding(位置向量) 组合而成&#xff0c;并到最终的 输入向量x。 Transformer引入Positional embedding主要是解决词序问题。…

开源程序实操:岩土工程渗流问题的有限单元法应用

有限单元法在岩土工程问题中应用非常广泛&#xff0c;很多商业软件如Plaxis/Abaqus/Comsol等都采用有限单元解法。尽管各类商业软件使用方便&#xff0c;但其使用对用户来说往往是一个“黑箱子”。相比而言&#xff0c;开源的有限元程序计算方法透明、计算过程可控&#xff0c;…

Linux configure.ac:51: error: possibly undefined macro: AC_MSG_ERROR

&#xff42;&#xff55;&#xff47;&#xff1a; 解决方法&#xff1a; cd /usr/local/share/autoconf/autoconf  cp *&#xff0e;m4 /usr/share/aclocal