链接:https://pan.baidu.com/s/1qQ8AC6V8a4dp8aqpMWCa-A?pwd=e0yo
提取码:e0yo
以stm32为最小系统电路进行连接,按钮控制系统开关,使用SRF04采集倒车,LM016L液晶显示屏显示汽车距离障碍物的实时距离。当距离障碍物大于100cm时,小车自由倒退,蜂鸣器、LED提示灯关闭,车辆正常倒退;当距离障碍物大于50cm小于100cm时,蜂鸣器报警,LED灯关闭,车辆正常倒退;当距离障碍物大于30cm小于50cm时,蜂鸣器报警,LED灯闪烁提示,车辆正常倒退;当距离障碍物小于30cm时,蜂鸣器报警,LED灯关闭,小车停止。
链接:https://pan.baidu.com/s/1qQ8AC6V8a4dp8aqpMWCa-A?pwd=e0yo
提取码:e0yo
该系统主要由stm32f103r6作为单片机最小系统、SRF04超声波传感器、LM016L显示屏、L298驱动直流电机、电容、二极管、蜂鸣器、LED灯、按键等硬件组成。
tm32f103r6作为单片机最小系统进行其他部件的连接;按键控制倒车测距系统的开关;SRF04超声波传感器进行小车距障碍物的距离测量;LM016L液晶显示屏显示实时距离;L298驱动直流电机对小车提供动力,驱动小车倒车的动力;led灯和蜂鸣器对倒车距离情况进行反馈。
链接:https://pan.baidu.com/s/1qQ8AC6V8a4dp8aqpMWCa-A?pwd=e0yo
提取码:e0yo
部分源代码
#include "delay.h"
#define PRESCALER_US 1e6
#define PRESCALER_MS 1e3
void delay_ms(int32_t ms){
uint32_t temp,temp1;
SysTick->LOAD=(uint32_t)ms*(SystemCoreClock/PRESCALER_MS); //时间加载(SysTick->LOAD为24bit)
SysTick->VAL =0x00; //清空计数器
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数
temp1=SysTick->VAL;
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16))); //等待时间到达
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
void delay_us(uint32_t time) //3.5us+1.5us*(time-1)
{
time=2*time;
while(time--);
}
2.LCD液晶显示屏配置:
#include "main.h"
//使能1602液晶使用的引脚
void LCD1602_PORT_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx,ENABLE); //使能PC端口时钟
GPIO_InitStructure.GPIO_Pin = GPIOx_Pin; //端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; //IO口速度为10MHz
GPIO_Init(GPIOx, &GPIO_InitStructure); //根据设定参数初始化
}
void delay_nus(uint16_t n)
{
delay_nms(5);
LCD_cmd(0x38);//16*2显示,5*7点阵,8数据
delay_nms(1);
LCD_cmd(0x38);//16*2显示,5*7点阵,8数据
delay_nms(1);
LCD_cmd(0x38);//16*2显示,5*7点阵,8数据
delay_nms(1);
LCD_cmd(0x08);//先关显示,后开显示
delay_nms(1);
LCD_cmd(0x01);//清屏
delay_nms(1);
LCD_cmd(0x06);//写命令,注意
delay_nms(1);
LCD_cmd(0x0c);//显示开,关光标
delay_nms(1);
}
//清屏
void LCD_clr(void)
{
LCD_cmd(0x01);
}
//写命令
void LCD_cmd(uint16_t cmd)
{
//LCD1602_WaitReady();
delay_nms(1);
LCD_RS_0;
delay_nus(1);
LCD_RW_0;
delay_nus(1);
LCD_EN_0;
delay_nus(1);
GPIO_SetBits(LCDPORT, LCD_DATA_PORT & cmd);
GPIO_ResetBits(LCDPORT, LCD_DATA_PORT &(~cmd));
LCD_EN_1;
delay_nus(1);
LCD_EN_0;
}
//写数据
void LCD_dat(uint8_t dat)
{
LCD_RS_1;
delay_nus(1);
LCD_RW_0;
delay_nus(1);
LCD_EN_0;
delay_nus(1);
GPIO_SetBits(LCDPORT, LCD_DATA_PORT & dat);
GPIO_ResetBits(LCDPORT, LCD_DATA_PORT &(~dat));
LCD_dat(c);
}
void LCD_prints(uint16_t x,uint16_t y,uint8_t *s)//显示字符串,不需要修改
{
LCD_pos(x,y);
while(*s!='\0')
{
LCD_dat(*s);
s++;
//delay_nms(1);
}
}
3.主函数函数的配置(其包含超声波的使用、LCD的使用、中断的使用、按键的开关、电机的运行、蜂鸣器的开关等):
#include "main.h"
/****全局变量******************************************/
uint8_t dis0[20];//液晶显示数组
float JuLi[4]; //距离0正常前进时候的距离
uchar start_stop_bit=0;
/**********函数申明****************************************/
void Tim1_Init(void);//定时器1初始化 计算超声波距离
void TIM1_UP_IRQHandler(void) ; //TIM1中断
void Tim2_Init(void);//定时器2初始化,0.5更新中断
void TIM2_IRQHandler(void);
void GPIO_MOTOR_INIT(void);//电机引脚初始化
void GPIO_SRF04_INIT(void);//超声波引脚初始化
void SRF04(unsigned char ch); //超声波测量函数
void GPIO_SRF04_INIT(void);// 超声波引脚初始化
void car_f(void); //前进
void car_b(void); //后退
void car_s(void); //停止
void car_bizhang(void);
void GPIO_KEY_INIT(void);//按键引脚初始化
/*****************************************
Main函数
*****************************************/
int main(void){
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断向量分组2
//io初始化
GPIO_MOTOR_INIT();//电机引脚,led,蜂鸣器初始化
GPIO_SRF04_INIT();//超声波引脚
GPIO_KEY_INIT();//按键引脚
//定时器初始化
Tim1_Init();
Tim2_Init();
//1602液晶
LCD_init(); //LCD1602初始化
LCD_clr();//LCD清屏
//主循环
while (1)
{
if(!k1)//开始停止按键
{
while(!k1);
LCD_clr();//清屏
start_stop_bit=!start_stop_bit;//切换模式
if(start_stop_bit)///运行状态下显示下面字符
{
sprintf(dis0,"====Reverse====\n");//更新显示
LCD_Write_String(0,0,dis0);//
}
else
{
beep =0;//关闭蜂鸣器
TIM_Cmd(TIM2,DISABLE);//关闭定时器2
LED = 1;//关led
}
}
if(start_stop_bit) //运行状态
{
//超声波测距
SRF04(0);
car_bizhang(); //小车状态函数
sprintf(dis0,"%3.0fCM\n",JuLi[0]);//更新显示
LCD_Write_String(5,1,dis0);
delay_ms(500);
}
}
}
void SRF04(unsigned char ch) //超声波测试函数
{
int delay=0xFf;
u16 tim;
GPIO_ResetBits(SRF04_PORT,SRF04_TR_PIN);
delay_us(20);
GPIO_SetBits(SRF04_PORT,SRF04_TR_PIN);
while(!GPIO_ReadInputDataBit(GPIOA,SRF04_ECHO_PIN));
TIM_Cmd(TIM1,ENABLE);
while(GPIO_ReadInputDataBit(GPIOA,SRF04_ECHO_PIN));
TIM_Cmd(TIM1,DISABLE);
tim = TIM_GetCounter(TIM1);
JuLi[ch]=tim/58.0;
TIM1->CNT=0;
}
void car_f(void) //前进
{
ena =1;
ena1=1;
in_b = 0;
in_b1=0;
in_f=1;
{
beep =1;//蜂鸣器开
TIM_Cmd(TIM2,ENABLE);//使能定时器2,led闪烁
car_s();
}
else if(JuLi[0]<50)//小车距离小于50,蜂鸣器开启,led闪烁
{
beep =1;//蜂鸣器开
TIM_Cmd(TIM2,ENABLE);//使能定时器2,led闪烁
}
else if(JuLi[0]<100)//小车距离小于100,蜂鸣器开启
{
beep =1;//蜂鸣器开
TIM_Cmd(TIM2,DISABLE);//关闭定时器2
LED = 1;//关led
}
else
{
beep =0;//关闭蜂鸣器
TIM_Cmd(TIM2,DISABLE);//关闭定时器2
LED = 1;//关led
}
}
void TIM1_UP_IRQHandler(void) //TIM1中断
{
if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) //检查指定的tim中断发生与否
{
TIM_ClearITPendingBit(TIM1, TIM_IT_Update ); //清除timx的中断待处理位
}
}
void TIM2_IRQHandler(void)//定时器2,捕获中断和更新中断0.5s
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update))//0.5s更新中断
{
LED=!LED;
}
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
}
void GPIO_SRF04_INIT(void)//超声波引脚初始化
{
GPIO_InitTypeDef GPIO_InitStructure;
/trig触发信号/
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin=SRF04_TR_PIN;
GPIO_Init(SRF04_PORT, &GPIO_InitStructure);
/*ECOH回响信号/
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Pin=SRF04_ECHO_PIN;
GPIO_Init(SRF04_PORT, & GPIO_InitStructure);
}
void GPIO_MOTOR_INIT(void)//电机引脚初始化
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//打开时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3
|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
beep=0;LED=1;
}
void GPIO_KEY_INIT(void)//按键引脚初始化
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//打开时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void Tim1_Init(void)//定时器1初始化,计算超声波距离
{
TIM_TimeBaseInitTypeDef TIM_InitStructure;
NVIC_InitTypeDef NVIC_InitStructer;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
//定时器tim2初始化
TIM_DeInit(TIM1);
TIM_InitStructure.TIM_Period = 0xffff;
TIM_InitStructure.TIM_Prescaler = SystemCoreClock/1000000-1; //lus一个计数
TIM_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1; //不分频
TIM_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;//ÏòÉϼÆÊý
TIM_TimeBaseInit(TIM1,&TIM_InitStructure);
//开启更新中断
TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE);
//中断参数设置
NVIC_InitStructer.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructer.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructer.NVIC_IRQChannel =TIM1_UP_IRQn;
NVIC_InitStructer.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructer);
//关闭定时器使能
TIM_Cmd(TIM1,DISABLE);
}
void Tim2_Init(void)//定时器2初始化,捕获和0.5更新中断
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_InitStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE); //使能PA端口时钟和复用时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); //使能tim2时钟
//写初值(预分频寄存器psc,自动重装载寄存器arr,计数模板cr1.Bit4)
TIM_InitStructure.TIM_Prescaler = SystemCoreClock/10000-1;
TIM_InitStructure.TIM_Period = 5000-1;
TIM_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_InitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2,&TIM_InitStructure);
//使能中断允许位 DIER.BIT0
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
//中断通道使能
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;//使能tim2
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //设置抢占优先级2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//设置响应优先级2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//开启计数器CR1.BIT0
//TIM_Cmd(TIM2,ENABLE);
}
源文件链接:https://pan.baidu.com/s/1fU4isp7UXTtUFHwpt76zzw?pwd=9x7t
提取码:9x7t