以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. 它来了!ROS2从入门到精通:理论与实战
  2. 腾讯投资过 600 多家公司不惊奇,京东也有出手 260+ | 大公司投资并购盘点
  3. ibm750服务器维护,IBM 750服务器.PDF
  4. windbg查看设备栈设备树学习总结
  5. JS面向对象--你真的理解闭包了吗?
  6. 35-面试:如何找出字符串的字典序全排列的第N种
  7. 学习《Building Applications with FME Objects》 之四 从数据集读取要素
  8. 物化视图 sql server 1
  9. mysql 8 启动失败(本地计算机上的mysql服务启动后停止。某些服务再未由其他服务或程序使用时将自动停止)
  10. 将先前的提交分成多个提交
  11. 计算机网络知识学习(核心:网络协议)-- 运输层
  12. 对网上盛传的两千万泄漏数据的简单分析
  13. CS229 Machine Learning 自学与答案
  14. java大师apple_起名大师下载-起名大师app下载 苹果版v8.01-PC6苹果网
  15. 关于AD域和Exchange邮件服务器的学习总结
  16. 8个常见的研究者认知偏误陷阱(转载)
  17. 【文智背后的奥秘】系列篇——自动文本分类
  18. iOS 基于 AVFoundation 制作的用于剪辑视频项目
  19. 如何解决Kerberos问题: Server has invalid Kerberos principal: hdfs/host2@****.COM
  20. JAVA十六进制数据转换

热门文章

  1. 导购网站的SEO优化
  2. 2.9 waitpid函数
  3. JPEG编码过程中的霍夫曼编码
  4. java 图片服务器 上传_Java向服务器上传图片
  5. c语言例题21:约德尔测试
  6. 全球及中国宠物追踪项圈行业投资趋势及产销需求预测报告2022版
  7. 夺命雷公狗---DEDECMS----30dedecms数据dede_archives主表进行查询l操作
  8. 发现了一个四叶的三叶草
  9. python模拟web登录京东
  10. 男朋友想自学python_我在学习鼓励男朋友初篇-百度经验