基于STM32单片机的语音IC卡停车管理系统
1、系统功能介绍
- 1.在welcome界面,放置IC卡,此时会开始记录停车时间
- 2.按下KEY1按键,会提示放置IC卡,放置IC卡后,会进入扣费界面(系统会根据程序中设置的单价与停车时间进行计算,之后扣费)
- 2.1 扣费成功:记录时间清零
- 2.2 扣费失败:语音提示余额不足,此时停车时间继续记录
- 3.按下KEY0按键,会提示放置IC卡,放置IC卡后,会显示当前余额。
- 3.1 在此界面按下KEY0,余额每次增加10
- 3.2 在此界面按下KEY1,余额每次减104.KEY2按键时退出按键
- 5.系统会语音提示"欢迎停车"、“请放置IC卡”、"余额不足"等语音信息
2、资料下载
- 资料下载:https://download.csdn.net/download/qq_39020934/89662497
- 包含程序源码、电路图源文件、器件清单、器件资料等
- 更多设计视频:https://space.bilibili.com/3537120073353692
3、系统电路介绍
3.1、STM32单片机最小系统设计
-
STM32的最小系统的硬件组成主要有:电源电路、复位电路、时钟电路、调试接口电路、启动电路。
-
电源 : 一般是3.3V输入作为STM32芯片的工作电压,实际中很多采用LDO将5V转换为3.3V进行供电,另外电路上还要加多个0.01uf去耦电容对输入电压进行滤波,稳定输入电压。
-
复位:STM32中有三种复位方式,分别为:上电复位、手动复位、程序自动复位。上电复位是指芯片根据外部搭建的复位电路,在上电的时候进行的复位;手动复位是指通过外部的复位电路自己手动进行复位;程序复位是在软件中通过代码对STM32芯片进行的复位。
-
单片机最小系统电路图如下图所示
-
实物图:
3.2、RC522 RFID射频电路设计
-
RC522 刷卡模块是应用于13.56MHz 非接触式通信中高集成度读写卡系列芯片中的一员,是NXP 公司针对“三表”应用推出的一款低电压、低成本、体积小的非接触式读写卡芯片。
-
RC522模块(射频读写器)向IC卡发一组固定频率的电磁波,卡片内有一个LC串联谐振电路,其频率与读写器发射的频率相同,这样在电磁波激励下,LC谐振电路产生共振,从而使电容内有了电荷;在这个电荷的另一端,接有一个单向导通的电子泵,将电容内的电荷送到另一个电容内存储,当所积累的电荷达到2V时,此电容可作为电源为其它电路提供工作电压,将卡内数据发射出去或接受读写器的数据。
-
电路原理图
-
实物图
3.3、OLED显示电路设计
-
OLED,即有机发光二极管(Organic Light-Emitting Diode),又称为有机电激光显示(Organic Electroluminesence Display, OELD)。OLED由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示器新兴应用技术。
-
该模块采用8*2的2.52排针与外部连接,总共16个管脚,在16条线中,我们只用了15条,有一条是悬空的。15条线中,电源和地线占了2条,还剩下13条信号线。在不同的模式下,需要的信号线的数目是不同的,在8080模式下,需要全部的13条。
-
OLED控制器为SSD1306,也就是说:裸屏由SSD1306驱动,这也是一种较为广泛使用的led驱动芯片。
-
OLED显示电路设计如下图所示:
-
实物图:
3.4、语音播报电路设计
-
TTS(Text-to-Speech)是一种将文本内容转换成语音的技术。它允许计算机能够将书面文字转换为可听的人类语音,从而为用户提供更多选择和灵活性。TTS技术采用自然语言处理、数字信号处理和语音合成等技术,将电子文字转化为口头发音,并通过扬声器、耳机或其他设备播放出来。
-
电路原理图:
-
实物图:
4、程序设计
4.1、系统初始化
//=========================================================
// 函数名称: DeviceInit
//
// 函数功能: 初始化设备
//
// 入口参数: 无
//
// 返回参数: 无
//
// 说明:
//==========================================================
void DeviceInit(void) {
uart_init(115200); //波特率115200 串口1调试使用
//语音使用到的功能模块
usart3_init(9600); //初始化串口2为:9600,波特率.
//定时播种使用
TIM2_Int_Init(4999,7199);//10Khz的计数频率,计数到5000为500ms
//按键初始化
KEY_Init();
//OLED初始化
I2C_Configuration();
OLED_Init();
OLED_Fill(0x00);//全屏灭
OLED_ShowStr(30,3,"Welcome",2);
//RC522初始化
Rc522IoInit();
PcdReset();//复位RC522
PcdAntennaOn();//开启天线发射
//参数初始化
DeviceParamInit(&device);
printf("init ok----\r\n");
}
4.2、程序运行函数
//=========================================================
// 函数名称: DeviceRun
//
// 函数功能: 系统运行函数
//
// 入口参数: 无
//
// 返回参数: 无
//
// 说明:
//==========================================================
void DeviceRun(void) {
DeviceReadICCard(&device);
DeviceGetKey(&device);
DeviceICChongzhi(&device);
DeviceICKouFei(&device);
DeviceWelcome(&device);
}
4.3、获取IC卡号
//==========================================================
// 函数名称: ReadICCard
//
// 函数功能: 读取IC卡的卡号
//
// 入口参数: 无
//
// 返回参数: 无
//
// 说明:
//==========================================================
static bool DeviceReadICCard(Device *c_this) {
if(PcdRequest(0x52, c_this->temp_)==MI_OK) { //读取到卡
if(PcdAnticoll(c_this->uid_)==MI_OK) { //卡号获取成功
if(((c_this->uid_[0] == c_this->ic_card_[c_this->ic_num].idCard[0]) && (c_this->uid_[2] == c_this->ic_card_[c_this->ic_num].idCard[2]) && c_this->uid_[1] == c_this->ic_card_[c_this->ic_num].idCard[1])) {//匹配卡号
if(c_this->jiemian_ != 0) {
c_this->ic_card_[c_this->ic_num].is_read_ = 1;
OLED_CLS();
} else {
if(c_this->ic_card_[c_this->ic_num].time_start_ == 0) {
//语音播报 欢迎停车
u3_printf("欢迎停车\r\n");
}
c_this->ic_card_[c_this->ic_num].time_start_ = 1;
}
return true;
}
}
}
}