以stm32为最小系统电路进行连接,按钮控制系统开关,使用SRF04采集倒车,LM016L液晶显示屏显示汽车距离障碍物的实时距离。当距离障碍物大于100cm时,小车自由倒退,蜂鸣器、LED提示灯关闭,车辆正常倒退;当距离障碍物大于50cm小于100cm时,蜂鸣器报警,LED灯关闭,车辆正常倒退;当距离障碍物大于30cm小于50cm时,蜂鸣器报警,LED灯闪烁提示,车辆正常倒退;当距离障碍物小于30cm时,蜂鸣器报警,LED灯关闭,小车停止。

该系统主要由stm32f103r6作为单片机最小系统、SRF04超声波传感器、LM016L显示屏、L298驱动直流电机、电容、二极管、蜂鸣器、LED灯、按键等硬件组成。

tm32f103r6作为单片机最小系统进行其他部件的连接;按键控制倒车测距系统的开关;SRF04超声波传感器进行小车距障碍物的距离测量;LM016L液晶显示屏显示实时距离;L298驱动直流电机对小车提供动力,驱动小车倒车的动力;led灯和蜂鸣器对倒车距离情况进行反馈。

源文件链接:https://pan.baidu.com/s/1JISzXq2Ydl1HaZAcZRLL3g?pwd=yljr 
提取码:yljr

部分源代码

#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);

}

Proteus仿真STM32的课设实例3——汽车倒车测距提示仪相关推荐

  1. proteus仿真STM32时时钟问题解决方案

    问题:在使用proteus仿真STM32时,发现外部时钟启动出错导致时钟频率不对,延时函数不准.影响外设的正常使用: 解决方法:使用STM32内部时钟作为系统时钟,可以解决此问题,但是没办法使用过高的 ...

  2. 使用 Proteus 仿真 STM32

    使用 Proteus 仿真 STM32 创建项目 新建工程 完成 连接元器件 编辑元件 Program File Crystal Frequency 配置供电网 后续 创建项目 新建工程 一直下一步就 ...

  3. 利用Proteus仿真STM32实现按键控制LED灯设计

    1. 前言 Proteus是英国著名的EDA工具(仿真软件),从原理图布图.代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计.是世界上唯一将电路仿真软件.PC ...

  4. 4、Proteus仿真STM32串口通信,发送数据控制LED流水灯的启动和停止

    一.实验说明 本次实验建立在第三个实验基础上,稍加修改,通过串口调试助手发送数据到Proteus来实现对流水灯的启动和停止,所以实验采用2个通信串口,实验原理非常简单,只要熟悉第三次实验的过程,就非常 ...

  5. 【软件相关】Proteus仿真STM32记录

    文章目录 0 前期教程 1 前言 2 先说说建议的流程 3 需要注意的事项 3.1 供电网配置不要忘了 3.2 ADC模块的使用 3.3 元器件查询手册 4 一些小技巧 4.1 快速添加标号 4.2 ...

  6. VSPD+XCOM+Proteus仿真stm32串口通信

    本文说明 功能要求 开机后,向串口1发送"Welcome" 串口1接收字节指令"0xA1",打开LED1,回传"LED1 ON" 串口1接收 ...

  7. Proteus仿真stm32和51单片机,串口通信调试过程记录

    前言 本文所用Proteus版本为8.10,主要内容为在Proteus中仿真stm32和51单片机进行串口通信,记录了仿真过程中遇到的问题和解决办法.        这里要注意的是,在Proteus中 ...

  8. Proteus仿真:C51中断函数实例

    实现目标 要求外部中断INT0和INT1为低电平触发,相应引脚分别接一按钮,按钮按下接地输入低电平,产生中断信号:定时器/计数器T0和定时器/计数器T1设置为外部计数输入,相应引脚接1khz的方波信号 ...

  9. Proteus仿真:外部中断应用实例

    实现目标 因仿真库中无74LS348仿真元件,仿真电路使用74HC148和74HC245模拟74LS348,8路外部中断输入全部为低有效,对应的中断发生时,使用printf函数从串口输出"e ...

最新文章

  1. Spring Boot:自定义starter
  2. Nginx-03:Nginx安装、命令、配置文件
  3. VC++ 显示对话框
  4. Java线程详解(14)-信号量
  5. 水利水电工程管理与实务电子版习题_每日一练:一级建造师案例题(水利水电工程管理与实务)...
  6. 修改octave的editor的背景颜色
  7. Vue项目中使用百度地图API
  8. 重构碎片化知识_荐书|《重构:数字化转型的逻辑》
  9. 34步优化sql语句
  10. 机器学习中的数学(二):参数估计与似然函数(MLE)
  11. git命令的理解与扩展
  12. 没有副业的人,太难了。。。
  13. 无线射频识别问答习题
  14. MATLAB中四阶单位矩阵,matlab-线性代数 创建 N阶数量矩阵 N阶单位矩阵 对角矩阵 范德蒙矩阵 等差数列......
  15. (转帖)ConcurrentHashMap实现原理(3)
  16. Qt 工程下使用 cmake MinGW OpenCV 4.1.1(涵盖 MinGW32 与 MinGW64)
  17. 十大宽带共享组网方式(转)
  18. Linux下安装libgdal库,libjpeg库和libtiff库
  19. 盈一眸恬淡,在明媚的春天等你
  20. 字节有『芯』在跳动,了吗?YOLOv7目标检测实现:确实挺好;伯克利博士找工作的6个月;软件工程资源大列表 | ShowMeAI资讯日报

热门文章

  1. java-split 点号 split(“.“)以及其他特殊符号解决方案
  2. 30s帮你摆脱网课自动暂停烦恼
  3. 数据中心——SDN基本概念
  4. 闷骚型的高级技术员写的SQL注入基础原理(超详细)
  5. 概率论知识回顾(十八):协方差和相关系数
  6. 【PaddleDetection】基于PaddleDetection的齿轮瑕疵检测:从模型训练到部署中的那些坑
  7. Python实现笛卡尔乘积的几种方法
  8. 《加密与解密》ASProtect 2.1x SKE 脱壳过程中遇到的问题与解决方法及脱壳小结
  9. repeater 控件ajax绑定数据源,【ASP.NET】第九课——使用DataList控件和Repeater控件绑定数据...
  10. 2017-05-31--夺命雷公狗发牢骚