项目介绍
本设计旨在基于STM32单片机,通过深入研究控制系统的硬件电路设计和相应的软件程序设计,实现一套完整的车牌识别系统。主要研究内容包括主控模块、电源模块、显示模块、摄像头模块、按键模块和驱动模块等硬件模块的设计和整合。该系统不仅能够显示车牌识别结果和停车费用等实时数据,而且通过摄像头模块捕捉车牌图像,实现车辆自动识别。在识别成功后,开始计费,并通过按键操作方便地查看停车车牌和相关费用。通过此研究,旨在建立一套高效、智能的基于STM32的车牌识别系统,为解决停车场管理问题提供可行性解决方案,推动嵌入式系统在智能交通领域的应用,并为未来的智能交通系统发展提供有力支持
功能介绍
基于STM32的车牌识别系统是一个集成了图像采集、处理和显示的智能系统。该系统通过OV7670摄像头采集车牌图像,利用STM32单片机进行图像处理和车牌识别,并通过TFT液晶屏显示识别结果。图像采集模块使用OV7670摄像头采集现场车牌图像。使用STM32单片机负责执行图像预处理、特征提取、车牌定位和字符识别等任务。TFT液晶屏用于显示车牌识别结果和系统信息,提供用户交互界面。OV7670摄像头用于实时采集车辆车牌的图像数据,通过SCCB接口与STM32单片机连接,传输采集到的图像数据。STM32单片机是核心处理单元,负责整个系统的控制逻辑和图像处理算法的执行。执行此功能要求单片机需要有足够的I/O端口连接摄像头和TFT显示屏,以及必要的内存和处理能力来处理图像数据和运行识别算法。TFT液晶屏用于显示识别出的车牌号码以及系统状态信息,该模块通过SPI接口或其他通信接口与STM32单片机连接。在软件设计方面,进行图像采集与预处理时,需要编写驱动程序控制OV7670摄像头,采集车牌图像,实现图像的预处理操作,如灰度化、二值化,以提高后续处理的准确性和效率。在进行车牌定位与识别时,应用图像处理算法实现车牌区域的精确定位,使用字符分割算法将车牌区域分割为单个字符。使用TFT显示模块来进行结果显示,实时显示车牌识别结果和系统状态。
所用模块
系统原理图
实物图
部分代码
#include “bsp_esp8266.h”
#include “stm32f10x.h”
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include “delay.h”
static void ESP8266_GPIO_Config ( void );
static void ESP8266_USART_Config ( void );
static void ESP8266_USART_NVIC_Configuration ( void );
volatile uint8_t ucTcpClosedFlag = 0; //连接断开标志
struct STRUCT_USARTx_Fram strEsp8266_Fram_Record = { 0 };
/**
-
@brief ESP8266初始化函数
-
@param 无
-
@retval 无
*/
void ESP8266_Init ( void )
{
//ESP8266_GPIO_Config ();ESP8266_USART_Config ();
//macESP8266_RST_HIGH_LEVEL();
//macESP8266_CH_DISABLE();
}
/**
-
@brief 初始化ESP8266用到的GPIO引脚
-
@param 无
-
@retval 无
*/
void ESP8266_GPIO_Config ( void )
{
/定义一个GPIO_InitTypeDef类型的结构体/
GPIO_InitTypeDef GPIO_InitStructure;/* 配置 CH_PD 引脚*/
macESP8266_CH_PD_APBxClock_FUN ( macESP8266_CH_PD_CLK, ENABLE );GPIO_InitStructure.GPIO_Pin = macESP8266_CH_PD_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init ( macESP8266_CH_PD_PORT, & GPIO_InitStructure );
/* 配置 RST 引脚*/
macESP8266_RST_APBxClock_FUN ( macESP8266_RST_CLK, ENABLE );GPIO_InitStructure.GPIO_Pin = macESP8266_RST_PIN;
GPIO_Init ( macESP8266_RST_PORT, & GPIO_InitStructure );
}
/**
-
@brief 初始化ESP8266用到的 USART
-
@param 无
-
@retval 无
*/
static void ESP8266_USART_Config ( void )
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;/* config USART clock */
macESP8266_USART_APBxClock_FUN ( macESP8266_USART_CLK, ENABLE );
macESP8266_USART_GPIO_APBxClock_FUN ( macESP8266_USART_GPIO_CLK, ENABLE );/* USART GPIO config /
/ Configure USART Tx as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = macESP8266_USART_TX_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(macESP8266_USART_TX_PORT, &GPIO_InitStructure);/* Configure USART Rx as input floating */
GPIO_InitStructure.GPIO_Pin = macESP8266_USART_RX_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(macESP8266_USART_RX_PORT, &GPIO_InitStructure);/* USART1 mode config */
USART_InitStructure.USART_BaudRate = macESP8266_USART_BAUD_RATE;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No ;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(macESP8266_USARTx, &USART_InitStructure);/* 中断配置 */
USART_ITConfig ( macESP8266_USARTx, USART_IT_RXNE, ENABLE ); //使能串口接收中断
USART_ITConfig ( macESP8266_USARTx, USART_IT_IDLE, ENABLE ); //使能串口总线空闲中断ESP8266_USART_NVIC_Configuration ();
USART_Cmd(macESP8266_USARTx, ENABLE);
}
/**
-
@brief 配置 ESP8266 USART 的 NVIC 中断
-
@param 无
-
@retval 无
*/
static void ESP8266_USART_NVIC_Configuration ( void )
{
NVIC_InitTypeDef NVIC_InitStructure;/* Configure the NVIC Preemption Priority Bits */
NVIC_PriorityGroupConfig ( macNVIC_PriorityGroup_x );/* Enable the USART2 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = macESP8266_USART_IRQ;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/*
-
函数名:ESP8266_Rst
-
描述 :重启WF-ESP8266模块
-
输入 :无
-
返回 : 无
-
调用 :被 ESP8266_AT_Test 调用
*/
void ESP8266_Rst ( void )
{
#if 0
ESP8266_Cmd ( “AT+RST”, “OK”, “ready”, 2500 );#else
macESP8266_RST_LOW_LEVEL();
delay_ms ( 500 );
macESP8266_RST_HIGH_LEVEL();
#endif
}
/*
-
函数名:ESP8266_Cmd
-
描述 :对WF-ESP8266模块发送AT指令
-
输入 :cmd,待发送的指令
-
reply1,reply2,期待的响应,为NULL表不需响应,两者为或逻辑关系
-
waittime,等待响应的时间
-
返回 : 1,指令发送成功
-
0,指令发送失败
-
调用 :被外部调用
*/
bool ESP8266_Cmd ( char * cmd, char * reply1, char * reply2, u32 waittime )
{
strEsp8266_Fram_Record .InfBit .FramLength = 0; //从新开始接收新的数据包macESP8266_Usart ( “%s\r\n”, cmd );
if ( USART_GetITStatus ( macESP8266_USARTx, USART_IT_RXNE ) != RESET )
{
ucCh = USART_ReceiveData( macESP8266_USARTx );
if ( strEsp8266_Fram_Record .InfBit .FramLength < ( RX_BUF_MAX_LEN - 1 ) ) //预留1个字节写结束符
strEsp8266_Fram_Record .Data_RX_BUF [ strEsp8266_Fram_Record .InfBit .FramLength ++ ] = ucCh;
}
/*
-
函数名:ESP8266_Cmd
-
描述 :对WF-ESP8266模块发送AT指令
-
输入 :cmd,待发送的指令
-
reply1,reply2,期待的响应,为NULL表不需响应,两者为或逻辑关系
-
waittime,等待响应的时间
-
返回 : 1,指令发送成功
-
0,指令发送失败
-
调用 :被外部调用
*/
bool ESP8266_Cmd ( char * cmd, char * reply1, char * reply2, u32 waittime )
{
strEsp8266_Fram_Record .InfBit .FramLength = 0; //从新开始接收新的数据包macESP8266_Usart ( “%s\r\n”, cmd );
if ( USART_GetITStatus( macESP8266_USARTx, USART_IT_IDLE ) == SET ) //数据帧接收完毕
{
strEsp8266_Fram_Record .InfBit .FramFinishFlag = 1;ucCh = USART_ReceiveData( macESP8266_USARTx ); //由软件序列清除中断标志位(先读USART_SR,然后读USART_DR) ucTcpClosedFlag = strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "CLOSED\r\n" ) ? 1 : 0;
}
}
资料下载链接
「实物制作资料.rar」,来自夸克网盘分享。
夸克网盘无需下载在线播放视频,畅享原画5倍速,支持电视投屏。
/928a345o9V😕
链接:https://pan.quark.cn/s/fa4fa3fc4e7b
提取码:p88k