前言
💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗
👇🏻 精彩专栏 推荐订阅👇🏻
单片机设计精品实战案例✅
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人
资料获取
文章底部名片,详细资料联系我。
设计介绍
基于STM32红外感应的自动迎客人语音控制系统设计,旨在通过结合STM32单片机与红外传感器技术,实现智能化、自动化的迎客服务。以下是对该系统设计的详细介绍:
STM32单片机控制模块:
作为系统的核心控制单元,负责接收红外传感器信号、执行控制算法、驱动语音模块等功能。
STM32单片机以其高性能、低功耗和丰富的外设接口,能够满足系统对实时性和准确性的要求。
功能介绍
STM32单片机自动迎客门红外感应步进电机语音播报41
本系统由STM32F103C8T6单片机核心板、语音播报、ULN2003步进电机控制、红外避障传感器、按键及电源组成。
1、红外探头检测到有人时,自动门打开(步进电机向打开方向旋转一周),人员进入,语音播报欢迎。
2、在开门的状态下,检测不到人遮挡,自动门关闭。
3、在关门过程中,再次检测到人遮挡,会停止关门进行开门操作。防止夹到人。
4、另外按键操作相当于门里的开关,按下开关门打开,门里人出来,语音播报欢迎再次光临。
设计程序
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include <stdio.h>
#include "timer.h"
#include "key.h"
#include <stdio.h>
#include "adc.h"
#define TIMELATERNUM 2000 //步进电机旋转时间
unsigned char i ;
char dis0[16]; //暂存
unsigned char zfFlag = 0 ; //正反转标志
unsigned int timeLater = 0; //时间延时
char rekey =0;//防止重复按下
char keyFlag = 0;//按键操作开门标志
void yyReportReadAdd(unsigned char yyAdd) ;
int main(void)
{
delay_init(); //延时函数初始化
uart_init(9600); //串口初始化
uart2_init(9600) ;
TIM3_Int_Init(29,7199);//3ms
LED_Init(); //初始化与LED连接的硬件接口
KEY_Init();
zfFlag = 1 ; //正反转标志
timeLater = TIMELATERNUM; //时间延时
delay_ms(100);
yyReportReadAdd(86);//播报地址语音 “欢迎使用”
while(1)
{
if(key==0) //检测到按键按下
{
if(rekey == 0)//防止重复按下
{
delay_ms(20);
if(key==0)//确认按键按下
{
rekey =1;
if(zfFlag != 2) //门没有打开或者没在打开过程
{
zfFlag=2; //驱动电机启动 正传开门
timeLater = TIMELATERNUM; //旋转//**All notes can be deleted and modified**//
keyFlag = 1;//按键操作开门标志
}
yyReportReadAdd(85);//播报地址语音 //欢迎再次光临
}
}
}
else
{rekey =0 ;} //防止重复按下
if(keyFlag == 1)//按键操作标志
{
if(timeLater == 0 ){keyFlag = 0;}//按键开门操作完成
}
else
{
if(manhot == 0)
{
if(zfFlag != 2) //门没有打开或者没在打开过程
{
zfFlag=2; //驱动电机启动 正传开门
timeLater = TIMELATERNUM; //旋转//**All notes can be deleted and modified**//
yyReportReadAdd(84);//播报地址语音 //欢迎光临
}
}
else
{
if(zfFlag != 1) //门没有打开或者没在打开过程
{
zfFlag=1; //驱动电机启动 正传开门
timeLater = TIMELATERNUM; //旋转//**All notes can be deleted and modified**//
}
}
}
}
}
void ctrlBuJinDj(void)
{
static unsigned char MotorNum=0;
if(timeLater>0)
{
timeLater-- ;
if(zfFlag==2) //电机转动时间不为零 设置了时间 正转
{
MotorNum++;
if(MotorNum==1)//接通d相 其他关闭
{Coil_D1;}
else if(MotorNum==2)//接通c相 其他关闭
{Coil_C1;}
else if(MotorNum==3)//接通b相 其他关闭
{Coil_B1;}
else if(MotorNum==4)//接通a相 其他关闭
{Coil_A1;MotorNum=0;}
}
else if(zfFlag==1) //电机转动时间不为零 设置了时间 反转
{
MotorNum++;
if(MotorNum==1) //接通a相 其他关闭
{Coil_A1;}
else if(MotorNum==2) //接通b相 其他关闭
{Coil_B1;}
else if(MotorNum==3)//接通c相 其他关闭
{Coil_C1;}
else if(MotorNum==4)//接通d相 其他关闭
{Coil_D1;MotorNum=0;}
}
}
else
{
{Coil_OFF;}
}
}
void yyReportReadAdd(unsigned char yyAdd) //语音播报地址
{
yy_rest=0; //yyxp(语音芯片的简写,下同)的复位脚为高电平//
delay_us(300); //持续 200us//
yy_rest=1; //然后复位脚置零//
delay_us(300);
yy_rest=0; //yyxp(语音芯片的简写,下同)的复位脚为高电平//
delay_us(300); //持续 200us//
yy_rest=1; //然后复位脚置零//
delay_us(300);
while(yyAdd>0) //若 等于 0 则不工作,若大于 0 则继续自减//
{
yy_data=0; //data 脚位为高电平//
delay_us(300); //持续 100us//
yy_data=1; //然后置零//
delay_us(300); //持续 100us 这三句的意思就是发从一个 100us 的脉冲(高低各 100us)//
yyAdd--; //z 自减完成后开始播放对应的语音(因为 z 是几就播放第几段)//
}
delay_ms(5);
}
具体实现截图
设计获取
文章下方名片联系我即可~
精彩专栏推荐订阅:在下方专栏👇🏻
毕业设计精品实战案例
收藏关注不迷路!!
🌟文末获取设计🌟