智能可视化倒车系统
想要更多项目私wo!!!
一、系统总体框图
当小车前进时,LCD上可显示小车前进的提示信息等;当小车后退时,开始利用图像传感器实现对小车后侧的图像实时监测,利用距离传感器实现对小车后侧障碍物的距离实时监测,并将测量数据传送至STM32进行处理,然后由控制器根据所检测的各种数据实现在LCD模块上显示出来。根据要求设计要求,可得到系统总体框图如下:
二、总体电路设计
根据总体框图,主控芯片可用STM32F103,再在该主控芯片外部连接晶振电路、复位电路、存储电路、按键电路、电源电路、图像传感器电路、距离传感器电路和声音报警电路等。 因条件限制,系统主控采用STM32F103ZET6开发板,开发板自带了复位电路、电源电路、晶振电路、声音报警电路等,存储器则为微控制器芯片内部系统总线上挂接的外设,系统电源由开发板本身通过一个usb电路供电,也可由提供的5v开关电源提供,显示模块为配套的4.3寸LCD,屏幕分辨率为800x480。距离传感器可以采用HC-SR04超声波传感器模块,图像传感器可以采用OV7670摄像头模块,将它们安装在小车后方,在小车后退时,实时检测后方的图像,以及与小车后方障碍物直接的距离,当距离太小时,发出警告。OV7670摄像头模块,最大能够输出VGA分辨率(640x480)的图像,直接和开发板的摄像头电路连接,HC-SR04超声波传感器能够检测2cm-400cm的距离,可用杜邦线和开发板的IO口相连。系统通过控制按键模块,实现对微控制器控制,同时微控制器控制OV7670图像传感器模块、HC-SR04超声波传感器模块和LCD显示模块,实现小车倒车时的图像显示,和障碍物距离过小报警。
三、运行结果图
四、主代码
/*想要更多项目私wo!!!*/
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"
#include "string.h"
#include "ov7670.h"
#include "tpad.h"
#include "timer.h"
#include "exti.h"
#include "usmart.h"
#include "beep.h"
#include "LcdApi.h"
#include "image.h"
const u8*LMODE_TBL[5]={"Auto","Sunny","Cloudy","Office","Home"};//5种光照模式
const u8*EFFECTS_TBL[7]={"Normal","Negative","B&W","Redish","Greenish","Bluish","Antique"}; //7种特效
extern u8 ov_sta; //在exit.c里 面定义
extern u8 ov_frame; //在timer.c里面定义
u32 ov_window_x,ov_window_y,ov_window_j;
int main(void)
{
u8 key,key_old;
u8 flag = 0;
u8 lightmode=0,saturation=2,brightness=2,contrast=2;
u8 effect=0;
u8 msgbuf[15]; //消息缓存区
u8 tm=0;
TIM5_Cap_Init(0XFFFF,72-1);
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
uart_init(9600); //串口初始化为 115200
LED_Init(); //初始化与LED连接的硬件接口
KEY_Init(); //初始化按键
LCD_Init(); //初始化LCD
BEEP_Init();
TPAD_Init(6); //触摸按键初始化
POINT_COLOR=RED; //设置字体为红色
LCD_ShowString(30,30,200,16,16,"OV7670 Init...");
while(OV7670_Init()) //初始化OV7670
{
LCD_ShowString(30,30,200,16,16,"OV7670 Error!!");
delay_ms(200);
LCD_Fill(30,230,239,246,WHITE);
delay_ms(200);
}
LCD_ShowString(30,30,200,16,16,"OV7670 Init OK");
delay_ms(1500);
TIM6_Int_Init(10000,7199); //10Khz计数频率,1秒钟中断
EXTI8_Init();
ov_window_x=480;
ov_window_y=400;
ov_window_j=192000;
OV7670_Window_Set(12,176,480,400); //设置窗口
OV7670_CS=0;
LCD_Clear(WHITE);
BACK_COLOR=WHITE;
POINT_COLOR=GREEN; //设置字体为绿色
zt=0;
ov_windows=1;
Show_Str(20,100,220,24,"智",24,0); //覆盖显示
delay_ms(200);
POINT_COLOR=BLACK;
Show_Str(70,100,220,24,"能",24,0); //覆盖显示
delay_ms(200);
POINT_COLOR=BLUE;
Show_Str(120,100,220,24,"可",24,0); //覆盖显示
delay_ms(200);
POINT_COLOR=BRED;
Show_Str(170,100,220,24,"视",24,0); //覆盖显示
delay_ms(200);
POINT_COLOR=MAGENTA;
Show_Str(220,100,220,24,"化",24,0); //覆盖显示
delay_ms(200);
POINT_COLOR=BROWN;
Show_Str(270,100,220,24,"倒",24,0); //覆盖显示
delay_ms(200);
POINT_COLOR=GRAY;
Show_Str(320,100,220,24,"车",24,0); //覆盖显示
delay_ms(200);
POINT_COLOR=DARKBLUE;
Show_Str(370,100,220,24,"系",24,0); //覆盖显示
delay_ms(200);
POINT_COLOR=LIGHTGREEN;
Show_Str(420,100,220,24,"统",24,0); //覆盖显示
delay_ms(200);
POINT_COLOR=GREEN;
flash_1();
flash_2();
flash_3();
LCD_Clear(WHITE);
while(1)
{ //更新状态时清屏
if(zt==1||zt==2)
{
zt=0;
LCD_Clear(WHITE);
if(cars=='B')
{
LCD_ShowString(150,90,200,24,24,"000.0CM");
}
}
ov_window_x=320;
ov_window_y=480;
ov_window_j=153600;
OV7670_Window_Set(12,176,320,480); //设置窗口
POINT_COLOR=GREEN; //设置字体为绿色
Show_Str(60,60,220,24,"小车状态:",24,0); //覆盖显示
Show_Str(60,90,220,24,"距离:",24,0); //覆盖显示
POINT_COLOR=GREEN; //设置字体为绿色
LCD_Color_Fill(360,0,480-1,160-1,(u16*)&gImage_1[0]);
if(WK_UP==1) //判断小车状态
{
delay_ms(10);
if(WK_UP==1)
{
cars = 'G';
Show_Str(180,60,220,24,"向前",24,0); //覆盖显示
}
}
if(KEY1==0)
{
delay_ms(10);
if(KEY1==0)
{
cars = 'B';
Back();
Show_Str(180,60,220,24,"向后",24,0); //覆盖显示
}
if(KEY1 == 1)
{
flag = 1;
}
}
if(KEY2==0)
{
delay_ms(10);
if(KEY2==0)
{
cars = 'L';
Show_Str(180,60,220,24,"向左",24,0); //覆盖显示
flash_5();
LCD_Clear(WHITE);
}
}
if(KEY0==0)
{
delay_ms(10);
if(KEY0==0)
{
cars = 'R';
Show_Str(180,60,220,24,"向右",24,0); //覆盖显示
flash_1();
LCD_Clear(WHITE);
}
}
if(flag == 1)
{
LCD_Clear(WHITE);
flag = 0;
}
}
}