![]() |
發(fā)布時間: 2021-8-12 17:00
正文摘要:#include "delay.h" #include "sys.h" #include "usart.h" #include "hcsr04.h" int main(void) { ... |
我這里有一個工程你看一下 #include "wave.h" #include "delay.h" #include "sys.h" #include "usart.h" #define Trig GPIO_Pin_7//超聲發(fā)射引腳pb7 #define Echo GPIO_Pin_6//超聲波接受引腳pb6 void Wave_SRD_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; EXTI_InitTypeDef EXTI_InitStruct; NVIC_InitTypeDef NVIC_InitStruct; //初始化超聲波 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOB,ENABLE); GPIO_InitStruct.GPIO_Pin=Trig; GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_InitStruct); GPIO_InitStruct.GPIO_Pin=Echo; GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPD; GPIO_Init(GPIOB,&GPIO_InitStruct); //外部中斷與引腳的配置,中斷與端口6的映射 GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource6); //外部中斷配置 EXTI_InitStruct.EXTI_Line=EXTI_Line6; EXTI_InitStruct.EXTI_LineCmd= ENABLE; EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt; EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising; EXTI_Init(&EXTI_InitStruct); //中斷優(yōu)先級管理 NVIC_InitStruct.NVIC_IRQChannel=EXTI9_5_IRQn; NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0; NVIC_InitStruct.NVIC_IRQChannelSubPriority=0; NVIC_Init(&NVIC_InitStruct); } //外部中斷服務函數(shù) void EXTI9_5_IRQHandler(void) { delay_us(10); if(EXTI_GetITStatus(EXTI_Line6)!=RESET)//Echo檢測到高電平 { TIM_SetCounter(TIM3,0);//開啟定時器 TIM_Cmd(TIM3,ENABLE);//使能定時器 while(GPIO_ReadInputDataBit(GPIOB,Echo));//等待Echo出現(xiàn)低電平 TIM_Cmd(TIM3,DISABLE);//關閉定時器 EXTI_ClearITPendingBit(EXTI_Line6);//清除中斷標志 } } //超聲波工作條件 //Trig產生一個不低于10us的高電平信號 u8 Wave_SRD_Strat(u8 time) { if(time>10) { GPIO_SetBits(GPIOB,Trig);//設置Trig為高電平輸出 delay_us(time); GPIO_ResetBits(GPIOB,Trig); return 0;//產生高于10us高電平,返回0 } else return 1;//為產生高于10us高電平返回1 } 主函數(shù)里 初始化: Wave_SRD_Init();//初始化超聲波 while(Wave_SRD_Strat(t)) { } while循環(huán): //距離計算 Wave_SRD_Strat(t); //產生高于10Us的高電平與OLED上顯示超聲波所測距離 Juli = TIM_GetCounter(TIM3)*340/200.0; printf("%f",Juli); |
u8 combuff[2048]; u8 combuff1[2048]; int main(void) { double cm_length = 0; u8 i = 0; delay_init(); USART1_Init(9600); TIM3_Init(1,1);//1ms TIM16_Init(1,1);//1ms HC_RC04_Init(); while(1) { delay_ms(1000);delay_ms(1000);delay_ms(1000);delay_ms(1000);delay_ms(1000); for(i = 0;i<5;i++) { cm_length += (Start_HC_RC04()/5); } //length * 2 /340 cm_length = (cm_length / 170) * 100; u1_printf("距離 = %1f\r\n",cm_length); cm_length=0; delay_ms(1000);delay_ms(1000);delay_ms(1000);delay_ms(1000);delay_ms(1000); } } /* GPIO 初始化 VCC = 3.3V GND = 0V TRIG = PA7 ECHO = PA6 */ void HC_RC04_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); //使能GPIOA的時鐘 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStructure); } u16 msHC_RC04; /* 1ms中斷 */ void TIM3_IRQHandler(void) { u8 i; if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) { msHC_RC04+=1; TIM_ClearFlag(TIM3, TIM_FLAG_Update); } } /* ECHO(PA6) 先確保 ECH處于低電平 TRIG(PA7) 先拉高20us以上、 ECHO (PA6) 電平被拉高后開啟定時器 ECHO (PA6) 電平拉低后關閉定時器并且讀取時間 測試距離 = (高電平時間(S) * 340M/S)/2 模塊測距范圍2-400cm 因此高電平時間范圍0.1ms - 23ms */ u32 Start_HC_RC04(void) { u16 time_out = 0; u32 usTime = 0; GPIO_ResetBits(GPIOA,GPIO_Pin_7); delay_us(20); while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6) != 0) { delay_ms(1); time_out += 1; if(time_out >= 1000) u1_printf("超時\r\t"); return 0; } GPIO_SetBits(GPIOA,GPIO_Pin_7); delay_us(20); GPIO_ResetBits(GPIOA,GPIO_Pin_7);//觸發(fā)信號 while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6) == 0) { ; } msHC_RC04 = 0; TIM_Cmd(TIM3, ENABLE); while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6) == 1) { ; } TIM_Cmd(TIM3, DISABLE); usTime = msHC_RC04 * 1000; usTime += (TIM_GetCounter(TIM3)*100);//時鐘1S 10000節(jié)拍。1節(jié)拍0.1ms 100us TIM1->CNT = 0; return usTime; } 時間和距離的轉換沒您好,也沒怎么濾波。 |
51hei截圖20210814122750.png (22.81 KB, 下載次數(shù): 116)
123689 發(fā)表于 2021-8-13 16:34 我找時間試一下。買了買還用 |
P10813-202936.jpg (2.46 MB, 下載次數(shù): 114)
黃youhui 發(fā)表于 2021-8-13 13:38 這個連最開始的“超聲波初始化”都沒得! |
黃youhui 發(fā)表于 2021-8-13 13:38 就算加上return t,串口助手還是沒得反應 |
length=gettime(); printf("距離為:%.3f cm\n",length);//打印總的距離 u32 gettime(void)//時間獲取函數(shù) { u32 t=0; t=msHcCount*1000; t+=TIM_GetCounter(TIM2); TIM2->CNT=0; delay_ms(50); } 沒有renturn數(shù)值 你獲取時間獲取了個寂寞 |
具體請用邏輯分析儀檢測一下波形、時序是否正確。 |
Powered by 單片機教程網(wǎng)