stm32F4倒车雷达

一、功能介绍

        本次项目使用了芯片为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摄像头所完成。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值