零基础学会制作 基于STM32的车牌识别系统的设计/车牌识别/停车场计费/计费/识别

项目介绍

本设计旨在基于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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值