一、成果圖
說明:本程序的源碼地址:https://github.com/Lfy-YF/Campus-Project
?????????? CSDN下載連接:https://download.csdn.net/download/weixin_58849239/87829470
源碼包含四個(gè)版本,涉及單路測距、三路測距、增加外部中斷(用來版本記錄的~)
運(yùn)行效果:本程序?qū)崿F(xiàn)脫機(jī)測距,共左中右三路超聲波傳感器同時(shí)實(shí)時(shí)工作,數(shù)據(jù)實(shí)時(shí)通過屏幕顯示,并且當(dāng)測距距離小于75cm(正常男性與女性的步幅平均值)時(shí)紅色led燈亮,蜂鳴器報(bào)警。
二、HC-SR04超聲波模塊說明
以上時(shí)序圖表明你只需要提供一個(gè) 10uS 以上脈沖觸發(fā)信號(hào),該模塊內(nèi)部將發(fā)出 8 個(gè) 40kHz 周期電平并檢測回波。一旦檢測到有回波信號(hào)則輸出回響信號(hào)?;仨懶盘?hào)的脈沖寬度與所測的距離成正比。由此通過發(fā)射信號(hào)到收到的回響信號(hào)時(shí)間間隔可以計(jì)算得到距離。公式: uS/58-厘米或者 uS/148=英寸;或是:距離高電平時(shí)間*聲速(340M/S) /2:建議測量周期為 60ms 以上,以防止發(fā)射信號(hào)對(duì)回響信號(hào)的影響。
三、引腳接線
VCC 供 5V電源,GND為地線,TRIG 觸發(fā)控制信號(hào)輸入,ECHO 回響信號(hào)輸出等四個(gè)接口端。
我的接線方式: (不知道怎么接線的可以去看板子的說明)
?????????????????????? 1.一號(hào)超聲波(左側(cè))
??????????????????????????? Trig接IO口PF0
??????????????????????????? Echo接IO口PF1
??????????????????????????? VCC與GND接5V?? ?
??????????????????????? 2.二號(hào)超聲波(右側(cè))
??????????????????????????? Trig接IO口PF2
??????????????????????????? Echo接IO口PF3
??????????????????????????? VCC與GND接5V
??????????????????????? 3.三號(hào)超聲波(中間)
??????????????????????????? Trig接IO口PF4
??????????????????????????? Echo接IO口PF5
??????????????????????????? VCC與GND接5V
四、主函數(shù)
(1)單路
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "hcsr04.h"
#include "lcd.h"
#include "beep.h"
#include "led.h"
float Distance=0;
int main(void)
{
u32 i=0;
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(115200);
LCD_Init();
LED_Init();
BEEP_Init();
Hcsr04Init();
POINT_COLOR=RED; //畫筆顏色
LED0=1;
LED1=~LED0;
BEEP=LED1;
while(1)
{
i++;
Distance = (Hcsr04GetLength());
if(Distance<=60.0 && BEEP==0){
BEEP=1;
LED1=BEEP;
LED0=~LED1;
}
if(Distance>60.0 && BEEP==1){
BEEP=0;
LED1=BEEP;
LED0=~LED1;
}
LCD_ShowString(30,40,210,24,24,"The distance is :");
LCD_ShowNum(30,60,Distance,5,24);
LCD_ShowString(120,60,210,24,24," cm");
delay_ms(100);
if(i==100)
{
LCD_Clear(WHITE);
POINT_COLOR=RED;
i=0;
}
}
}
(2)三路
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "hcsr04.h"
#include "lcd.h"
#include "beep.h"
#include "led.h"
float Distance=0; //定義距離變量1(左)
float Distance1=0; //定義距離變量1(右)
float Distance2=0; //定義距離變量1(中)
int main(void)//主函數(shù)
{
u32 i=0;
delay_init(); //延時(shí)器初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中斷優(yōu)先級(jí)NVIC
uart_init(115200); //串口比特率
LCD_Init(); //LCD初始化
LED_Init(); //LED初始化
BEEP_Init(); //BEEP初始化
Hcsr04Init(); //HC-SR04初始化
POINT_COLOR=RED; //畫筆顏色
LED0=1;//蜂鳴器與LED小燈的邏輯關(guān)系
LED1=~LED0;
BEEP=LED1;
while(1)
{
i++;
Distance = (Hcsr04GetLength());//對(duì)距離變量進(jìn)行賦值(左)
Distance1 = (Hcsr04GetLength1());//對(duì)距離變量進(jìn)行賦值(右)
Distance2 = (Hcsr04GetLength2());//對(duì)距離變量進(jìn)行賦值(中)
if((Distance<=75.0||Distance1<=75.0||Distance2<=75.0) && BEEP==0){ //邏輯關(guān)系
BEEP=1;
LED1=BEEP;
LED0=~LED1;
}
if((Distance>75.0&&Distance1>75.0&&Distance2>75.0) && BEEP==1){ //邏輯關(guān)系
BEEP=0;
LED1=BEEP;
LED0=~LED1;
}
//LCD屏顯示
LCD_ShowString(30,40,210,24,24,"Left distance:");
LCD_ShowNum(30,70,Distance,5,24);
LCD_ShowString(120,70,210,24,24," cm");
LCD_ShowString(30,100,210,24,24,"Right distance:");
LCD_ShowNum(30,130,Distance1,5,24);
LCD_ShowString(120,130,210,24,24," cm");
LCD_ShowString(30,160,210,24,24,"Middle distance:");
LCD_ShowNum(30,190,Distance2,5,24);
LCD_ShowString(120,190,210,24,24," cm");
delay_ms(100);//延時(shí)設(shè)置
if(i==100)
{
LCD_Clear(WHITE);
POINT_COLOR=RED;
i=0;
}
}
}
五、外部中斷函數(shù)
//新增加中斷
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
//HCSR04_ECHO
NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn; //HCSR04_ECHO
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占優(yōu)先級(jí)0級(jí)
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //從優(yōu)先級(jí)3級(jí)
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
EXTI_InitStructure.EXTI_Line = EXTI_Line1;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;//上升下降沿觸發(fā)
EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能外部中斷
EXTI_Init(&EXTI_InitStructure);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOF,GPIO_PinSource1);
//HCSR04_ECHO1
NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn; //HCSR04_ECHO1
NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
EXTI_InitStructure.EXTI_Line = EXTI_Line3;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;//上升下降沿觸發(fā)
EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能外部中斷
EXTI_Init(&EXTI_InitStructure);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOF,GPIO_PinSource3);
//HCSR04_ECH2
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; //HCSR04_ECHO2
NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
EXTI_InitStructure.EXTI_Line = EXTI_Line5;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;//上升下降沿觸發(fā)
EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能外部中斷
EXTI_Init(&EXTI_InitStructure);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOF,GPIO_PinSource5);
//新增加中斷
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定時(shí)器時(shí)鐘
TIM_TimeBaseStructure.TIM_Period = (1000-1); //設(shè)置在下一個(gè)更新事件裝入活動(dòng)的自動(dòng)重裝載寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =(72-1); //設(shè)置用來作為TIM3時(shí)鐘頻率除數(shù)的預(yù)分頻
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; //設(shè)置時(shí)鐘分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //根據(jù)指定的參數(shù)初始化TIMx的時(shí)間基數(shù)單位
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //使能指定的TIM3中斷,允許更新中斷
//中斷優(yōu)先級(jí)NVIC設(shè)置
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中斷
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占優(yōu)先級(jí)0級(jí)
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //從優(yōu)先級(jí)3級(jí)
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
TIM_Cmd(TIM3,DISABLE);
六、注意事項(xiàng)
1.HC-SR04模塊不宜帶電連接,會(huì)影響模塊的正常工作。(若要帶電連接可以先讓模塊的GND端先連接)文章來源:http://www.zghlxwxcb.cn/news/detail-675369.html
2.HC-SR04的被測物體的面積不要少于0.5平方米并且盡量平整,不然影響測量結(jié)果。(我使用的是A4大小的課本)文章來源地址http://www.zghlxwxcb.cn/news/detail-675369.html
到了這里,關(guān)于基于STM32F103ZET6的(單/三)路HC-SR04超聲波測距+TFTLCD實(shí)時(shí)顯示+距離報(bào)警的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!