一、功能介绍
本次项目使用了芯片为STM32F407VET6,利用OV2640摄像头实现对画面的捕捉,然后在3.2寸TFT触摸屏上显示,并利用HCSR04超声波模块实现对物体距离的探测功能,当物体距离超声波模块小于一定值时,蜂鸣器将会报警,此时如果物体远离超声波模块,蜂鸣器将停止鸣叫。
二、所用器件介绍
STM32F407VET6:主控芯片,用于各类传感器数据的采集以及处理。
OV264摄像头:收集倒车模式时的图片数据并转为RGB565格式。
3.2寸TFT触摸屏:显示OV2640摄像头采集到的图像数据。
HCSR04超声波模块:检测与障碍物的距离,发送到主控芯片进行处理
蜂鸣器:当超声波模块检查出报警范围时,发出警报
三、实现思路
hc_sr04.c
void init_sr04(void)
{
GPIO_InitTypeDef GPIO_InitStruct; // GPIO的参数
// 初始化时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA , ENABLE);// 设置GPIO参数====ECHO
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6; // 设置第6个引脚
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN; // 设置第6个引脚为输出模式
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; // 设置为推挽输出
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; // 设置为上拉输出
GPIO_InitStruct.GPIO_Speed = GPIO_High_Speed; // 设置速度为100M
GPIO_Init(GPIOA, &GPIO_InitStruct);// 设置GPIO参数=====TRIG
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12; // 设置第12个引脚
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; // 设置第12个引脚为输出模式
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; // 设置为推挽输出
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; // 设置为上拉输出
GPIO_InitStruct.GPIO_Speed = GPIO_High_Speed; // 设置速度为100M
GPIO_Init(GPIOA, &GPIO_InitStruct);
}
int get_sr04_distance(void)
{
u32 tim = 0;
// 1.发送触发信号:给PB6引脚输出高电平,至少10us
PAout(12) = 1;
delay_us(20);
PAout(12) = 0;
// 2. 等待输出回响信号为高电平
while(PAin(11) == 0);
// 3.根据回响信号高电平持续时间得到距离:每8.8us表示3mm
while(PAin(11))
{
//每8us获取3mm的距离
delay_us(10);
tim++;
}
//输入输出的总时间
tim = tim / 2;
//每8us是3mm,计算总共的距离
return (tim * 3);
}
sccb.c部分
//读寄存器
//返回值:读到的寄存器值
u8 SCCB_RD_Reg(u8 reg)
{
u8 val=0;
SCCB_Start(); //启动SCCB传输
SCCB_WR_Byte(SCCB_ID); //写器件ID
delay_us(100);
SCCB_WR_Byte(reg); //写寄存器地址
delay_us(100);
SCCB_Stop();
delay_us(100);
//设置寄存器地址后,才是读
SCCB_Start();
SCCB_WR_Byte(SCCB_ID|0X01); //发送读命令
delay_us(100);
val=SCCB_RD_Byte(); //读取数据
SCCB_No_Ack();
SCCB_Stop();
return val;
}
main.c
int main(void)
{
u8 flag = 0;
int DistanceDate = 0,KeyVal;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
delay_init(168); //初始化延时函数
uart_init(115200); //初始化串口波特率为115200
LED_Init(); //初始化LED
BEEP_Init(); //蜂鸣器初始化
KEY_Init(); //按键初始化
init_sr04(); //超声波初始化LCD_Init(); //初始化LCD FSMC接口
LCD_Clear(BLACK); //清屏
POINT_COLOR=RED; //画笔颜色:红色
OV2640_Init(); //摄像头初始化
My_DCMI_Init(); //DCMI配置
DCMI_DMA_Init((u32)&LCD->LCD_RAM,1,DMA_MemoryDataSize_HalfWord,DMA_MemoryInc_Disable);//DCMI DMA配置
OV2640_OutSize_Set(lcddev.width,lcddev.height);
DCMI_Stop(); //关闭传输
while(1)
{
KeyVal = KEY_Scan(0);
if(KeyVal == KEY0_PRES)
{
printf("KEY0 PRE\r\n");
flag = 1;
DCMI_Start(); //开始传送图像
}
else if(KeyVal == KEY1_PRES)
{
flag = 0;
printf("KEY1 PRE\r\n");
DCMI_Stop(); //关闭传送图像
LCD_Clear(BLACK);
BEEP = 1;
}
delay_ms(200);
DistanceDate = get_sr04_distance();
if(flag == 1)
{
if(DistanceDate<100)
BEEP = 0;
else if(DistanceDate > 1000)
BEEP = 1;
}
}
}
OV2640摄像头代码过多不予展示,同时我也是借鉴商家附带的OV2640摄像头所完成。