【STM32单片机_(HAL库)】3-4-4【中断EXTI】【智能排队控制系统】项目实现

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

3-4-3系统代码框架搭建

4.软件—tasks.c文件编写

  • 排队控制系统状态机
    在这里插入图片描述

  • tasks.c

#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_task_cnt = 0;
uint32_t led2_task_cnt = 0;
uint32_t wait_cnt = 0;
uint32_t passenger = 0;

uint8_t led1_task_flag = 0;
uint8_t led2_task_flag = 0;
uint8_t state = PASS_STATE;

char message[16] = {0};//定义字符数组

void systick_isr(void)
{
    //如果处于允许通行的状态
    if(state == PASS_STATE)
    {
        //LED1以1秒的频率闪烁
        if (led1_task_cnt < 1000)
            led1_task_cnt++;
        else
        {
            led1_task_flag = 1;
            led1_task_cnt = 0;
        }
        //LED2不闪烁
        led2_off();
        //蜂鸣器不响
        beep_off();
        //开门
        gate_off();
    }
    //如果处于不允许通行的状态
    else if(state == WAIT_STATE)
    {
        //LED2以200ms的频率闪烁
        if (led2_task_cnt < 200)
            led2_task_cnt++;
        else
        {
            led2_task_flag = 1;
            led2_task_cnt = 0;
        }
        //LED1不闪
        led1_off();
        //蜂鸣器响
        beep_on();
        //关门
        gate_on();
        //计时3秒,之后
        if(wait_cnt < 3000)
            wait_cnt++;
        else
        {
            wait_cnt = 0;
            //进入允许通行状态
            state = PASS_STATE;
            //LCD显示状态
            lcd1602_show_line(1, 1, "PASS...");
        }
    }
}

void led1_task(void)
{
    if(led1_task_flag == 0)
        return;
    
    led1_task_flag = 0;
    
    led1_toggle();
}

void led2_task(void)
{
    if(led2_task_flag == 0)
        return;
    
    led2_task_flag = 0;
    
    led2_toggle();
}

void sensor_task(void)
{
    //如果检测到有人通过
    if(ia_flag_get() == TRUE && state == PASS_STATE)
    {
        //计数加1
        passenger++;
        //LCD显示状态
        sprintf(message, "PASS...%02d/05", passenger);//sprintf()函数
        lcd1602_show_line(1, 1, message);
        
    }

    //如果通过的人数超过5个
    if(passenger >= 5)
    {
        //计数清零
        passenger = 0;
        //进入不允许通行状态
        state = WAIT_STATE;
        //LCD显示状态
        lcd1602_show_line(1, 1, "WAIT...00/05");
    }
}

  • tasks.h
#ifndef __TASKS_H__
#define __TASKS_H__

#include "sys.h"

void systick_isr(void);
void led1_task(void);
void led2_task(void);
void sensor_task(void);

#endif

5.实物效果

ST-Link下载方式
请添加图片描述
请添加图片描述
请添加图片描述

智能排队控制系统

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值