希望對大家有用。
單片機源程序如下:
- #include "stm32f10x.h"
- #include "hcsr04.h"
- #include "sys.h"
- #include "delay.h"
- #include "usart.h"
- #define Trig GPIO_Pin_4
- #define Echo GPIO_Pin_6
- float Distance;
- void HCSR_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitSture;
- EXTI_InitTypeDef EXTI_InitSture;
- NVIC_InitTypeDef NVIC_InitSture;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOE,ENABLE);
-
-
- //配置IO端口
- GPIO_InitSture.GPIO_Mode=GPIO_Mode_Out_PP;
- GPIO_InitSture.GPIO_Pin=Trig; //將PE4于Trig相連
- GPIO_InitSture.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_Init(GPIOE,&GPIO_InitSture);
-
- GPIO_InitSture.GPIO_Mode=GPIO_Mode_IPD;
- GPIO_InitSture.GPIO_Pin=Echo; //將PE6于Echo相連
- GPIO_InitSture.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_Init(GPIOE,&GPIO_InitSture);
-
- //中斷和6端口映射一起
- GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource6);
-
- //外部中斷配置
- EXTI_InitSture.EXTI_Line=EXTI_Line6;
- EXTI_InitSture.EXTI_LineCmd=ENABLE;
- EXTI_InitSture.EXTI_Mode=EXTI_Mode_Interrupt;
- EXTI_InitSture.EXTI_Trigger=EXTI_Trigger_Rising;
- EXTI_Init(&EXTI_InitSture);
-
-
- //中斷優先級管理
- NVIC_InitSture.NVIC_IRQChannel=EXTI9_5_IRQn;
- NVIC_InitSture.NVIC_IRQChannelCmd=ENABLE;
- NVIC_InitSture.NVIC_IRQChannelPreemptionPriority=2;
- NVIC_InitSture.NVIC_IRQChannelSubPriority=2;
- NVIC_Init(&NVIC_InitSture);
- }
- void EXTI9_5_IRQHandler(void)
- {
- delay_us(10);
-
-
- if(EXTI_GetITStatus(EXTI_Line6)!=RESET)
- {
- TIM_SetCounter(TIM3,0);
- TIM_Cmd(TIM3,ENABLE);
-
- while(GPIO_ReadInputDataBit(GPIOE,Echo)); //等待低電平
-
- TIM_Cmd(TIM3,DISABLE);
-
- Distance=TIM_GetCounter(TIM3)*34/2000;
-
- if(Distance>0)
- {
- printf("Distance:%0.1f cm\r\n",Distance);
- }
-
- EXTI_ClearITPendingBit(EXTI_Line6);
- }
- }
- void HCSR_Strat(void)
- {
- GPIO_SetBits(GPIOE,Trig); //將Trig設置為高電平
- delay_us(20); //持續大于10us觸發,觸發超聲波模塊工作
- GPIO_ResetBits(GPIOE,Trig);
-
- }
- void TIM3_LJW_Init(void) //TIM3初始化
- {
- NVIC_InitTypeDef NVIC_Struct; //定義NVIC結構體
- TIM_TimeBaseInitTypeDef TIM_Struct; //定義TIM結構體
-
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3 ,ENABLE); //初始化TIM3時鐘
-
- TIM_Struct.TIM_ClockDivision=TIM_CKD_DIV1; //這里用不到 隨便寫的
- TIM_Struct.TIM_CounterMode=TIM_CounterMode_Up; //向上計數
- TIM_Struct.TIM_Period=65535; //重裝載值4999
- // 72M/(7199+1)=10000->0.1ms * (4999+1) = 500ms
- // (PSC+1)(ARR+1)/CK_PSC = 時間
- TIM_Struct.TIM_Prescaler=71; //預分頻值7199
- TIM_TimeBaseInit(TIM3,&TIM_Struct); //初始化TIM3
-
- TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //使能TIM3的更新中斷
-
- NVIC_Struct.NVIC_IRQChannel=TIM3_IRQn ; //選擇TIM3通道
- NVIC_Struct.NVIC_IRQChannelCmd=ENABLE; //使能通道
- NVIC_Struct.NVIC_IRQChannelPreemptionPriority=1; //搶占優先級
- NVIC_Struct.NVIC_IRQChannelSubPriority=1; //響應優先級
- NVIC_Init(&NVIC_Struct); //初始化NVIC
-
- //TIM_Cmd(TIM3,ENABLE); //啟動定時器
- }
復制代碼
所有資料51hei提供下載:
HC-SR04.7z
(184.71 KB, 下載次數: 99)
2019-2-28 18:58 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|