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

链接: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
 

  • 4
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
Proteus STM32课设是基于STM32微控制器的课程设计项目。STM32是一种高性能的ARM Cortex-M系列微控制器,它广泛应用于嵌入式系统开发和物联网设备。 在Proteus STM32课设中,学生需要使用Proteus软件平台来设计和模拟他们的STM32微控制器项目。Proteus是一款专业的电子电路设计和仿真软件,它可以模拟各种电子元件和微控制器的工作原理和行为。 在这个课设中,学生可以选择自己感兴趣的主题,如智能家居控制系统、机器人控制系统、传感器数据采集系统等。然后,他们将使用STM32的开发工具和Proteus软件来设计和模拟他们的项目。 在设计过程中,学生需要学习和理解STM32的硬件结构和功能,包括处理器核心、外设和接口等。他们还需要熟悉Proteus软件的使用方法,包括电路设计、元件库选择和仿真设置等。 一旦设计完成,学生可以使用Proteus软件来模拟他们的STM32项目的工作情况。他们可以验证项目的电路连接是否正确、元件的功能是否正常以及系统的性能是否达到预期等。 通过Proteus STM32课设,学生能够全面了解和掌握STM32微控制器的应用和Proteus软件的使用。他们可以在课设中实践理论知识,提高电路设计和模拟技能,并加深对嵌入式系统开发和物联网技术的理解。 总而言之,Proteus STM32课设给予学生一个机会,通过使用Proteus软件平台来设计和模拟他们的STM32微控制器项目,从而提高他们的电路设计和模拟能力,并培养他们在嵌入式系统开发和物联网领域的技术能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值