1. 程式人生 > >STM32F103 超聲波 串列埠輸出資料

STM32F103 超聲波 串列埠輸出資料

    本人小白一個,正在利用課外時間學習32,不久前剛做過超聲波實驗,但是,幾天沒碰,感覺忘記了很多。在重新學習的路上,我覺得有必要總結一下,防止自己忘記,同時,也希望能幫助到有需要的人。

話不多說,先上硬貨。

#include "cj.h" #include "stm32f10x.h" #include "delay.h" #include "usart.h"

unsigned int overcount=0;

void NVIC_Config(void)//優先順序設定 { NVIC_InitTypeDef NVIC_InitStructer;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

NVIC_InitStructer.NVIC_IRQChannelPreemptionPriority=0; NVIC_InitStructer.NVIC_IRQChannelSubPriority=0; NVIC_InitStructer.NVIC_IRQChannel=TIM2_IRQn;// NVIC_InitStructer.NVIC_IRQChannelCmd=ENABLE;

NVIC_Init(&NVIC_InitStructer); }

void CH_SR04_Init(void)//超聲波模組初始化 { GPIO_InitTypeDef GPIO_InitStructer; TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructer;

RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

GPIO_InitStructer.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStructer.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_InitStructer.GPIO_Pin=GPIO_Pin_8; GPIO_Init(GPIOB, &GPIO_InitStructer);//設定PB8作為觸發引腳

GPIO_InitStructer.GPIO_Mode=GPIO_Mode_IN_FLOATING; GPIO_InitStructer.GPIO_Pin=GPIO_Pin_9; GPIO_Init(GPIOB,&GPIO_InitStructer);//設定PB9作為接受引腳

TIM_DeInit(TIM2); TIM_TimeBaseInitStructer.TIM_Period=65534; TIM_TimeBaseInitStructer.TIM_Prescaler=71; //經過預分頻後,計數器的值,每隔0.5us就加一。 TIM_TimeBaseInitStructer.TIM_ClockDivision=TIM_CKD_DIV1;// TIM_TimeBaseInitStructer.TIM_CounterMode=TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructer);

    //TIM_ITConfig(TIM2,TIM_IT_Update|TIM_IT_CC1,ENABLE);//

TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);// NVIC_Config(); TIM_Cmd(TIM2,DISABLE);//

}

float Senor_Using(void)//測距函式 { float length=0,sum=0; u16 tim; unsigned int i=0;

while(i!=5) {

PBout(8)=1; // delay_us(20); // PBout(8)=0;

while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==RESET); TIM_Cmd(TIM2,ENABLE);// i+=1; while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==SET);// TIM_Cmd(TIM2,DISABLE);//

tim=TIM_GetCounter(TIM2);//

length=(tim+overcount*1000)/58.0;//

sum=length+sum; TIM2->CNT=0; // overcount=0; // delay_ms(100); } length=sum/5; return length;// }

void TIM2_IRQHandler(void) // { if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)   { TIM_ClearITPendingBit(TIM2,TIM_IT_Update);// overcount++;

  } }  

由於是複製貼上過來的,所以只是對部分地方進行了註釋。其實很簡單,就是通過一個引腳輸出超過10us高電平作為脈衝訊號,在設定一個引腳作為接收引腳。當接收到高電平,就開啟定時器計數,當檢測到低電平,就停止計數。將數值取出來,通過公式計算即可得到距離。最後是這個串列埠輸出,直接#include "stdio.h"後直接用pirntf即可。但是不要忘了在此之前還要對編譯器相關配置,這裡請自行百度,很簡單的。如有不對之處,還請各位大佬多多指正,小生在此先謝過了。

我曾許下十年,只為最美的遇見。

我是西伯利亞螂,打不死,凍不壞的小強。