04.HC_SR04超声波测距

main函数

#include "stm32f10x.h" 
#include "./led/bsp_led.h"
#include "./systick/bsp_systick.h"
#include "./beep/bsp_beep.h"
#include "./key/bsp_key.h"
#include "./usart/bsp_usart.h"
#include "./HC_SR04/bsp_hcsr04.h"

//软件延时函数
void  Soft_Delay(unsigned int time)
{
	while(time--);
}

int main(void)
{
	int32_t d = 0;//距离
	LED_GPIO_Init();
	Beep_Init();
	KEY_GPIO_Init();
	USARTX_Config();
	HC_SR04_GPIO_Init();
	
	printf("HC_SR04测试模块\r\n");
	
	while(1)
	{
		d = HC_SR04_Config();
		if(d > 0)
		{
			if(d >= 20 && d<= 4000)//超声波模块测距范围:2cm~400cm
			{
				printf("超声波所测距离=%d mm\r\n",d);
				if(d > 450)//距离大于45mm,灯全灭、蜂鸣器也不叫
				{
					Red_Led_OFF;
					Green_Led_OFF;
					Blue_Led_OFF;
					Beep_OFF;
				}
				else if(350 <= d && d <= 450)//距离大于35mm小于45mm,亮绿灯,蜂鸣器不叫
				{
					Red_Led_OFF;
					Green_Led_ON;
					Blue_Led_OFF;
					Beep_OFF;					
				}
				else if(250 <= d && d <= 350)//距离大于25mm小于35mm,亮红灯,蜂鸣器不叫
				{
					Red_Led_ON;
					Green_Led_OFF;
					Blue_Led_OFF;
					Beep_OFF;					
				}				
				else if(150 <= d && d <= 250)//距离大于15mm小于25mm,亮红绿等,蜂鸣器不叫
				{
					Red_Led_ON;
					Green_Led_ON;
					Blue_Led_OFF;
					Beep_OFF;					
				}	
				else if(d <= 150)//距离小于15mm,亮红绿蓝等,蜂鸣器叫
				{
					Red_Led_ON;
					Green_Led_ON;
					Blue_Led_ON;
					Beep_ON;					
				}					
			}
		}
		Delay_ms(2000);//2s测一次
	}
	
}


LED

#include "./led/bsp_led.h"


//LED_GPIO配置
void LED_GPIO_Init(void)
{
	GPIO_InitTypeDef 	GPIO_InitStructure={0};
	//开启时钟
	Led_RCC_CLK_ENABLE(Led_RCC_CLK_PERIPH,ENABLE);
	//作为普通的IO口,普通推挽输出即可
	//开漏输出,无法输出高电平,必须以来外围电路拉高IO口
	GPIO_InitStructure.GPIO_Pin =Red_Led_GPIO_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_Init(Red_Led_GPIO_PORT,&GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin =Green_Led_GPIO_PIN;
	GPIO_Init(Green_Led_GPIO_PORT,&GPIO_InitStructure);


	GPIO_InitStructure.GPIO_Pin =Blue_Led_GPIO_PIN;
	GPIO_Init(Blue_Led_GPIO_PORT,&GPIO_InitStructure);	
	//首先先关闭所有LED
	Red_Led_OFF;
	Green_Led_OFF;
	Blue_Led_OFF;
}

#ifndef  __BSP_LED_H
#define  __BSP_LED_H
#include "stm32f10x.h"
#define    Led_RCC_CLK_ENABLE			RCC_APB2PeriphClockCmd
#define    Led_RCC_CLK_PERIPH			RCC_APB2Periph_GPIOB
//红灯宏定义
#define    Red_Led_RCC_CLK_ENABLE		RCC_APB2PeriphClockCmd
#define    Red_Led_RCC_CLK_PERIPH		RCC_APB2Periph_GPIOB
#define    Red_Led_GPIO_PORT			GPIOB
#define    Red_Led_GPIO_PIN				GPIO_Pin_5

#define    Red_Led_ON					GPIO_ResetBits(Red_Led_GPIO_PORT,Red_Led_GPIO_PIN)
#define    Red_Led_OFF					GPIO_SetBits(Red_Led_GPIO_PORT, Red_Led_GPIO_PIN)
#define    Red_Led_TOGGLE				{Red_Led_GPIO_PORT->ODR ^= Red_Led_GPIO_PIN;}
//绿灯宏定义
#define    Green_Led_RCC_CLK_ENABLE		RCC_APB2PeriphClockCmd
#define    Green_Led_RCC_CLK_PERIPH		RCC_APB2Periph_GPIOB
#define    Green_Led_GPIO_PORT			GPIOB
#define    Green_Led_GPIO_PIN			GPIO_Pin_0

#define    Green_Led_ON					GPIO_ResetBits(Green_Led_GPIO_PORT,Green_Led_GPIO_PIN)
#define    Green_Led_OFF				GPIO_SetBits(Green_Led_GPIO_PORT, Green_Led_GPIO_PIN)
#define    Green_Led_TOGGLE				{Green_Led_GPIO_PORT->ODR ^= Green_Led_GPIO_PIN;}
//蓝灯宏定义
#define    Blue_Led_RCC_CLK_ENABLE		RCC_APB2PeriphClockCmd
#define    Blue_Led_RCC_CLK_PERIPH		RCC_APB2Periph_GPIOB
#define    Blue_Led_GPIO_PORT			GPIOB
#define    Blue_Led_GPIO_PIN			GPIO_Pin_1

#define    Blue_Led_ON					GPIO_ResetBits(Blue_Led_GPIO_PORT,Blue_Led_GPIO_PIN)
#define    Blue_Led_OFF					GPIO_SetBits(Blue_Led_GPIO_PORT, Blue_Led_GPIO_PIN)
#define    Blue_Led_TOGGLE				{Blue_Led_GPIO_PORT->ODR ^= Blue_Led_GPIO_PIN;}

extern void LED_GPIO_Init(void);
#endif


SysTick

#include "./systick/bsp_systick.h"

//static __INLINE uint32_t SysTick_Config(uint32_t ticks)
//{ 
//  if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* Reload value impossible */
//                                                               
//  SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* set reload register */
//  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Cortex-M0 System Interrupts */
//  SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */
//  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk | 
//                   SysTick_CTRL_TICKINT_Msk   | 
//                   SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */
//  return (0);                                                  /* Function successful */
//}

//调用SysTick_Config时其中的形参是24位的自减滴答定时器---->>>>>最大值是:2^24-1 == 16777216-1 == 16777215
int32_t Delay_us(uint32_t us)
{
	uint32_t temp1 = 0;
	SysTick->CTRL = 0;//先关闭系统滴答定时器,然后再配置
	SysTick->VAL = 0;//清零
	SysTick->LOAD = ((us*72)-1);
	SysTick->CTRL = 0x05;//使能系统滴答定时器并且使用内部时钟72MHz
	//做一个检测信息
	while(1)
	{
		temp1 = SysTick->CTRL;
		//检测第16位的标志位:Counting位,如果计数值减到0,该为会变为1,读取它会自动变为零
		if(temp1 & 0x10000)
		{
			break;
		}
		//检测系统滴答定时器是否意外关闭
		if((temp1 & 0x01) == 0)
		{
			return -1;
		}		
	}
	SysTick->CTRL = 0;//关闭系统滴答定时器
	return 0;
}

int32_t Delay_ms(uint32_t ms)
{
	uint32_t temp2 = 0;	
	while(ms--)
	{
		SysTick->CTRL = 0;//先关闭系统滴答定时器,然后再配置
		SysTick->VAL = 0;//清零
		SysTick->LOAD = (72000-1);//1ms计数一次
		SysTick->CTRL = 0x05;//使能系统滴答定时器并且使用内部时钟72MHz
		//做一个检测信息
		while(1)
		{
			temp2 = SysTick->CTRL;
			//检测第16位的标志位:Counting位,如果计数值减到0,该为会变为1,读取它会自动变为零
			if(temp2 & 0x10000)
			{
				break;
			}
			//检测系统滴答定时器是否意外关闭
			if((temp2 & 0x01) == 0)
			{
				return -1;
			}		
		}
	}
	SysTick->CTRL = 0;//关闭系统滴答定时器
	return 0;
}

#ifndef  __BSP_SYSTICK_H
#define  __BSP_SYSTICK_H
#include "stm32f10x.h"
#include "core_cm3.h"

extern int32_t Delay_us(uint32_t us);
extern int32_t Delay_ms(uint32_t ms);
#endif


Beep

#include "./beep/bsp_beep.h"

//Beep_Init配置
void Beep_Init(void)
{
	GPIO_InitTypeDef 	GPIO_InitStructure={0};
	//开启时钟
	Beep_RCC_CLK_ENABLE(Beep_RCC_CLK_PERIPH,ENABLE);
	//作为普通的IO口,普通推挽输出即可
	//开漏输出,无法输出高电平,必须以来外围电路拉高IO口
	GPIO_InitStructure.GPIO_Pin =Beep_GPIO_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_Init(Beep_GPIO_PORT,&GPIO_InitStructure);
	
	//首先先关闭所有Beep
	Beep_OFF;
}

#ifndef  __BSP_BEEP_H
#define  __BSP_BEEP_H
#include "stm32f10x.h"


//有源蜂鸣器宏定义
#define    Beep_RCC_CLK_ENABLE			RCC_APB2PeriphClockCmd
#define    Beep_RCC_CLK_PERIPH			RCC_APB2Periph_GPIOA
#define    Beep_GPIO_PORT				GPIOA
#define    Beep_GPIO_PIN				GPIO_Pin_8

#define    Beep_OFF					GPIO_ResetBits(Beep_GPIO_PORT,Beep_GPIO_PIN)
#define    Beep_ON					GPIO_SetBits(Beep_GPIO_PORT, Beep_GPIO_PIN)

extern void Beep_Init(void);
#endif


Key

#include "./key/bsp_key.h"
#include "./systick/bsp_systick.h"

//KEY_GPIO配置
void KEY_GPIO_Init(void)
{
	GPIO_InitTypeDef 	GPIO_InitStructure={0};
	//开启时钟
	Key1_RCC_CLK_ENABLE(Key1_RCC_CLK_PERIPH,ENABLE);	
	Key2_RCC_CLK_ENABLE(Key2_RCC_CLK_PERIPH,ENABLE);
	//作为普通的IO口,
	//根据原理图,没按下是低电平,按下是高电平.
	GPIO_InitStructure.GPIO_Pin = Key1_GPIO_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(Key1_GPIO_PORT,&GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = Key2_GPIO_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(Key2_GPIO_PORT,&GPIO_InitStructure);
}
//按键状态扫描函数
uint8_t Key_State_Scan(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
	if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == Key_Down)//如果第一次读取的是高电平
	{
		Delay_ms(20);//消抖
		if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == Key_Down)//如果第二次读取的是高电平,那就是真的高电平
		{
			while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == Key_Down);//等按键松开再变化
			return Key_Down;
		}
		else
		{
			return Key_Up;
		}
	}
	else
	{
		return Key_Up;
	}
}
#ifndef  __BSP_KEY_H
#define  __BSP_KEY_H
#include "stm32f10x.h"

#define    Key_Down		1
#define    Key_Up		0
//Key1宏定义
#define    Key1_RCC_CLK_ENABLE			RCC_APB2PeriphClockCmd
#define    Key1_RCC_CLK_PERIPH			RCC_APB2Periph_GPIOA
#define    Key1_GPIO_PORT				GPIOA
#define    Key1_GPIO_PIN				GPIO_Pin_0

//Key2宏定义
#define    Key2_RCC_CLK_ENABLE			RCC_APB2PeriphClockCmd
#define    Key2_RCC_CLK_PERIPH			RCC_APB2Periph_GPIOC
#define    Key2_GPIO_PORT				GPIOC
#define    Key2_GPIO_PIN				GPIO_Pin_13

extern void KEY_GPIO_Init(void);
extern uint8_t Key_State_Scan(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
#endif

USART

#include "./usart/bsp_usart.h"

//USART1配置
static void USARTX_GPIO_Init(void)
{
	GPIO_InitTypeDef 	GPIO_InitStructure = {0};
	//开启时钟
	USARTX_TX_RX_RCC_CLK_ENABLE(USARTX_TX_RX_RCC_CLK_PERIPH,ENABLE);	
	//Tx  复用推挽输出
	GPIO_InitStructure.GPIO_Pin = USARTX_TX_GPIO_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(USARTX_TX_GPIO_PORT,&GPIO_InitStructure);
	//Rx  浮空输入
	GPIO_InitStructure.GPIO_Pin = USARTX_RX_GPIO_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(USARTX_RX_GPIO_PORT,&GPIO_InitStructure);
}
static void USARSTX_NVIC_Init(void)
{
	NVIC_InitTypeDef		NVIC_InitStructure = {0};
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//配置中断分组为2
	NVIC_InitStructure.NVIC_IRQChannel = USARTX_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
}	
static void USARTX_Mode_Init(void)
{
	USART_InitTypeDef	USART_InitStructure = {0};
	//开启时钟
	USARTX_RCC_CLK_ENABLE(USARTX_RCC_CLK_PERIPH,ENABLE);	
	USART_InitStructure.USART_BaudRate = USARTX_Baudrate;//波特率:115200
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无需硬件流,如果需要硬件流,需要加上CTS、RTS位
	USART_InitStructure.USART_Mode = (USART_Mode_Tx|USART_Mode_Rx);//接收和发送模式
	USART_InitStructure.USART_Parity = USART_Parity_No;//没有奇偶检验位
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//1位停止位.
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	USART_Init(USARTX,&USART_InitStructure);

	USARSTX_NVIC_Init();
	//使能串口,并使能接收中断
	USART_ITConfig(USARTX,USART_IT_RXNE,ENABLE);
	//使能串口
	USART_Cmd(USARTX,ENABLE);
}
 
void USARTX_Config(void)
{
	USARTX_GPIO_Init();
	USARTX_Mode_Init();
}
/*****************  发送一个字节 **********************/
//形参1:哪个串口发送
//形参2:发送的数据是什么,因为我们规定8个数据位,所有定义uint8_t即可
void Usart_SendByte(USART_TypeDef * pUSARTx,uint8_t ch)
{
	USART_SendData(pUSARTx,ch);
	while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TXE) == RESET);
}
/****************** 发送8位的数组 ************************/
//形参1:哪个串口发送
//形参2:发送的数据是什么,因为我们规定8个数据位,所有定义uint8_t即可
//形参3:发送多少个数据
void Usart_SendArray(USART_TypeDef *pUSARTx,uint8_t *array,uint16_t num)
{
	uint8_t  i = 0;
	for(i=0 ; i<8 ;i++)
	{
		Usart_SendByte(pUSARTx,array[i]);			
	}
	while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC) == RESET);
}
/*****************  发送字符串 **********************/
void Usart_SendString( USART_TypeDef * pUSARTx, char *str)
{
	unsigned int k = 0;
	do
	{
		Usart_SendByte(pUSARTx,*(str+k));
		k++;
	}while(*(str+k) != '\0');
	while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC) == RESET);
}
/*****************  发送一个16位数 **********************/
void Usart_SendHalfWord( USART_TypeDef * pUSARTx, uint16_t ch)
{
	uint8_t High_Temp = 0,Low_Temp = 0;
	High_Temp = ((ch&0xff00)>>8);
	Low_Temp = (ch&0xff);
	/* 发送高八位 */
	USART_SendData(pUSARTx,High_Temp);	
	while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
	/* 发送低八位 */
	USART_SendData(pUSARTx,Low_Temp);	
	while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
}
///重定向c库函数printf到串口,重定向后可使用printf函数
int fputc(int ch,FILE *f)
{
	USART_SendData(USARTX,(uint8_t)ch);
	while (USART_GetFlagStatus(USARTX, USART_FLAG_TXE) == RESET);
	return (ch);
}
///重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数
int fgetc(FILE *f)
{
	int Receive_Date = 0;
	while (USART_GetFlagStatus(USARTX, USART_FLAG_RXNE) == RESET);
	Receive_Date = (int)USART_ReceiveData(USARTX);	
	return (Receive_Date);
}

#ifndef  __BSP_USART_H
#define  __BSP_USART_H
#include "stm32f10x.h"
#include <stdio.h>

//USART1 宏定义
#define    USARTX_RCC_CLK_ENABLE			RCC_APB2PeriphClockCmd
#define    USARTX_RCC_CLK_PERIPH			RCC_APB2Periph_USART1
#define    USARTX							USART1
#define    USARTX_Baudrate					115200
#define    USARTX_IRQn						USART1_IRQn
#define    USARTX_IRQHandler				USART1_IRQHandler

#define    USARTX_TX_RX_RCC_CLK_ENABLE		RCC_APB2PeriphClockCmd
#define    USARTX_TX_RX_RCC_CLK_PERIPH		RCC_APB2Periph_GPIOA
//USART1_TX宏定义
#define    USARTX_TX_RCC_CLK_ENABLE			RCC_APB2PeriphClockCmd
#define    USARTX_TX_RCC_CLK_PERIPH			RCC_APB2Periph_GPIOA
#define    USARTX_TX_GPIO_PORT				GPIOA
#define    USARTX_TX_GPIO_PIN				GPIO_Pin_9

//USART1_RX宏定义
#define    USARTX_RX_RCC_CLK_ENABLE			RCC_APB2PeriphClockCmd
#define    USARTX_RX_RCC_CLK_PERIPH			RCC_APB2Periph_GPIOA
#define    USARTX_RX_GPIO_PORT				GPIOA
#define    USARTX_RX_GPIO_PIN				GPIO_Pin_10


extern void USARTX_Config(void);
extern void Usart_SendByte(USART_TypeDef * pUSARTx,uint8_t ch);
extern void Usart_SendArray(USART_TypeDef *pUSARTx,uint8_t *array,uint16_t num);
extern void Usart_SendString( USART_TypeDef * pUSARTx, char *str);
extern void Usart_SendHalfWord( USART_TypeDef * pUSARTx, uint16_t ch);
extern int fputc(int ch,FILE *f);
extern int fgetc(FILE *f);
#endif


HC_SR04

#include "./HC_SR04/bsp_hcsr04.h"
#include "./systick/bsp_systick.h"
/************* 超声波模块,工作电压是:DC 5V **********/
//超声波模块有:触发信号接口,回响信号接口
//我们利用开发板的PB6接触发信号接口、PB7接回响信号接口(这个接口随便选)
//HC_SR04配置
void HC_SR04_GPIO_Init(void)
{
	GPIO_InitTypeDef 	GPIO_InitStructure={0};
	//开启时钟
	HC_SR04_RCC_CLK_ENABLE(HC_SR04_CLK_PERIPH,ENABLE);
	//作为普通的IO口,普通推挽输出即可
	GPIO_InitStructure.GPIO_Pin = HC_SR04_TRIG_GPIO_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(HC_SR04_TRIG_GPIO_PORT,&GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = HC_SR04_ECHO_GPIO_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(HC_SR04_ECHO_GPIO_PORT,&GPIO_InitStructure);
	//默认触发信号为低电平,拉低
	HC_SR04_TRIG_State_Low;
}
//HC_SR04的时序图配置
int32_t HC_SR04_Config(void)
{
	uint32_t time = 0;//延时次数
	int32_t Distance = 0;//距离
	//拉高触发信号,准备开始
	HC_SR04_TRIG_State_High;
	//10us
	Delay_us(20);
	HC_SR04_TRIG_State_Low;
	//如果此时一直检测不到高电平,我们还是做个超时处理比较好
	while(HC_SR04_ECHO_ReadState == HC_SR04_ECHO_LOW)
	{
		time++;
		Delay_us(1);
		if(time >= 1000000)
		{
			return -1;
		}
	}
	//此时,模块内部会自动 循环发出8个4KHz的脉冲.
	//为了检测发送完毕,我们只需要检测输出回响信号是否为高电平
	//检测回响信号是否为高电平
	time = 0;
	while(HC_SR04_ECHO_ReadState == HC_SR04_ECHO_HIGH)
	{
		//距离 = 高电平时间*声速(340m/s)/2
		//340m=340000mm --->>> 1s=10^6us
		//而HC_SR04模块测距的误差是3mm,也就是如果我测到距离是9.7~10.3,系统均认为是10
		//那3mm距离,需要多久时间tus?
		//则有公式:340 000mm    对应于 10^6 us
		//		   3mm					tus
		// ---》》》 t = 10^6 * 3 / 340 000 ≈ 8.8us = 9us
		//意味着,如果我延时9us,就代表距离是3mm,那我们看有几个9us,就可以知道距离了
		time++;
		Delay_us(9);
		//如果一直高电平,那也有问题
		if(time >= 1000000)
		{
			return -2;
		}
	}
	time = time/2;//因为time属于发出信号到收到信号的总时间,距离的时间是总的一半
	Distance = time*3;//时间us乘以距离3mm
	return (Distance);
}

#ifndef  __BSP_HCSR04_H
#define  __BSP_HCSR04_H
#include "stm32f10x.h"
#define    HC_SR04_RCC_CLK_ENABLE		RCC_APB2PeriphClockCmd
#define    HC_SR04_CLK_PERIPH			RCC_APB2Periph_GPIOB
//触发控制信号TRIG宏定义
#define    HC_SR04_TRIG_RCC_CLK_ENABLE		RCC_APB2PeriphClockCmd
#define    HC_SR04_TRIG_RCC_CLK_PERIPH		RCC_APB2Periph_GPIOB
#define    HC_SR04_TRIG_GPIO_PORT			GPIOB
#define    HC_SR04_TRIG_GPIO_PIN			GPIO_Pin_6

#define    HC_SR04_TRIG_State_Low			GPIO_ResetBits(HC_SR04_TRIG_GPIO_PORT,HC_SR04_TRIG_GPIO_PIN)
#define    HC_SR04_TRIG_State_High			GPIO_SetBits(HC_SR04_TRIG_GPIO_PORT,HC_SR04_TRIG_GPIO_PIN)
		
//回响信号ECHO宏定义
#define    HC_SR04_ECHO_RCC_CLK_ENABLE		RCC_APB2PeriphClockCmd
#define    HC_SR04_ECHO_RCC_CLK_PERIPH		RCC_APB2Periph_GPIOB
#define    HC_SR04_ECHO_GPIO_PORT			GPIOB
#define    HC_SR04_ECHO_GPIO_PIN			GPIO_Pin_7

#define    HC_SR04_ECHO_ReadState			GPIO_ReadInputDataBit(HC_SR04_ECHO_GPIO_PORT,HC_SR04_ECHO_GPIO_PIN)

#define    HC_SR04_ECHO_HIGH		1
#define    HC_SR04_ECHO_LOW			0

extern void HC_SR04_GPIO_Init(void);
extern int32_t HC_SR04_Config(void);
#endif

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值