stm32蓝牙模块和超声波测距模块

  • 蓝牙
  1. 蓝牙概念

蓝牙技术是一种无线数据和语音通信开放的全球规范,它是基于低成本的近距离无线连接,为固定和移动设备建立通信环境的一种特殊的近距离无线技术连接。 [1] 

蓝牙使当前的一些便携移动设备和计算机设备能够不需要电缆就能连接到互联网,并且可以无线接入互联网

蓝牙是一种支持设备短距离通信(一般10m内)的无线电技术,能在包括移动电话、PDA、无线耳机、笔记本电脑、相关外设等众多设备之间进行无线信息交换。利用蓝牙技术,能够有效地简化移动通信终端设备之间的通信,也能够成功地简化设备与因特网Internet之间的通信,从而数据传输变得更加迅速高效,为无线通信拓宽道路。 [2] 

蓝牙作为一种小范围无线连接技术,能在设备间实现方便快捷、灵活安全、低成本、低功耗的数据通信和语音通信,因此它是实现无线个域网通信的主流技术之一。与其他网络相连接可以带来更广泛的应用。是一种尖端的开放式无线通信,能够让各种数码设备无线沟通,是无线网络传输技术的一种,原本用来取代红外线通信。 [3] 

蓝牙技术是一种无线数据与语音通信的开放性全球规范,它以低成本的近距离无线连接为基础,为固定与移动设备通信环境建立一个特别连接。其实质内容是为固定设备或移动设备之间的通信环境建立通用的无线电空中接口(Radio Air Interface),将通信技术与计算机技术进一步结合起来,使各种3C设备在没有电线或电缆相互连接的情况下,能在近距离范围内实现相互通信或操作。简单的说,蓝牙技术是一种利用低功率无线电在各种3C设备间彼此传输数据的技术。蓝牙工作在全球通用的2.4GHz ISM(即工业、科学、医学)频段,使用IEEE802.15协议。作为一种新兴的短距离无线通信技术,正有力地推动着低速率无线个人区域网络的发展。

 

  1. 蓝牙模块使用
  1. 下载蓝牙开发资料
  2. 安装USB转TTL驱动(它的驱动与串口驱动是一致的),再按USB转TTL与蓝牙连接图.jpg连接好,并将USB转TTL模块插入电脑

 

  1. 打开串口助手软件及蓝牙HC-06AT命令详解.pdf资料,配置串口软件波特率:9600(有可能不一定是9600,可能是115200或者是38400),需要修改蓝牙的名字,修改指令如下:

AT+NAMECHEN(AT+NAME:AT指令  CHEN:蓝牙名字) 

  1. 安装APP(安卓手机):xnj.lazydog.btcontroller.apk,使用手机连接蓝牙,密码:1234

打开手机上蓝牙串口助手软件,并连接蓝牙。即可手机与蓝牙通信。

  • 超声波
  1. 超声波传感器

产品特点:
HC-SR04 超声波测距模块可提供 2cm-400cm 的非接触式距离感测功能, 测距精度可达高到 3mm;模块包括超声波发射器、接收器与控制电路

工作原理:
(1)采用 IO 口 TRIG 触发测距,给最少 10us 的高电平信号。
(2)模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回;
(3)有信号返回, 通过 IO 口 ECHO 输出一个高电平, 高电平持续的时间就是超声
波从发射到返回的时间。 测量距离=(高电平时间*声速(340M/S))/2;

2、超声波引脚说明

触发信号输入:TRIG(STM32做输出  超声波做输入)

回响信号输出:ECHO(STM32做输入  超声波做输出)

3、超声波框架分析

4、超声波代码编写思路

  1. 先找两个引脚,连接超声波, PA2  TRIG触发信号  PA3  ECHO回响信号, 并初始化

PA2做为普通输出

PA3做为普通输入

  1. 设置定时器3,计一个数用时1us, 可计最大数为50000,且不用中断不用设置NVIC

TIM_TimeBaseInitTypeDef  TIM_TimeBaseInitStruct;

//1、能定时器时钟

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

TIM_TimeBaseInitStruct.TIM_Prescaler = 84-1;   // 84分频 84MHZ/84 = 1MHZ

TIM_TimeBaseInitStruct.TIM_Period = 50000-1; TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数

TIM_TimeBaseInitStruct.TIM_ClockDivision= TIM_CKD_DIV1; // 分频因子

//2、初始化定时器,配置ARR,PSC

TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);

//5,不使能定时器

   TIM_Cmd(TIM3, DISABLE);

  1. 根据下面代码框架,完成距离测量

//PA2为低电平

delay_us(10);

//PA2为高电平

delay_us(20);

//PA2为低电平

//设置定时器的CNT为0  TIM3->CNT = 0

//等待高电平到来,参考按键松开代码

//使能定时器开始计数

//等待低电平到来,参考按键松开代码

//获取定时器CNT值,从而得到高电平持续时间    temp = TIM3->CNT;

//关闭定时器

//通过公式计算出超声波测量距离

  • 技术应用
  1. 蓝牙

共享单车内置蓝牙,可通过手机蓝牙进行开锁

智能门锁,通过手机蓝牙进行解锁

  1. 超声波

扫地机器人内置超声波,实时检测前方是否有障碍物

汽车装配超声波雷达,实时监控后方是否有障碍物

#include "usart.h"
#include "stdio.h"

#pragma import(__use_no_semihosting)             
//标准库需要的支持函数                 
struct __FILE 
{ 
	int handle; 
}; 

FILE __stdout;       
//定义_sys_exit()以避免使用半主机模式    
int _sys_exit(int x) 
{ 
	x = x; 
} 
//重定义fputc函数   printf 是一个宏
int fputc(int ch, FILE *f)
{ 	
	USART_SendData(USART1,ch);  //通过串口发送数据
	//等待数据发送完毕
	while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);      
	return ch;
}



/*****************************************
引脚说明
PA9  ---- USART1_TX(发送端)
PA10 ---- USART1_RX(接收端)

******************************************/
void Usart1_Init(int MyBaudRate)
{
	
	GPIO_InitTypeDef  	GPIO_InitStruct;
	USART_InitTypeDef	USART_InitStruct;
	NVIC_InitTypeDef  NVIC_InitStruct;
	
	//串口时钟使能,GPIO 时钟使能。
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
    //使能GPIOA时钟:
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);	
	
	//GPIOA9复用映射到USART1 引脚选定复用的功能
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); 	
	//GPIOA10复用映射到USART1 引脚选定复用的功能
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); 	
	
	//GPIO 初始化设置:要设置模式为复用功能。
	GPIO_InitStruct.GPIO_Pin	= GPIO_Pin_9|GPIO_Pin_10;		//引脚9 10
	GPIO_InitStruct.GPIO_Mode	= GPIO_Mode_AF;		//复用模式
	GPIO_InitStruct.GPIO_OType	= GPIO_OType_PP;	//推挽式
	GPIO_InitStruct.GPIO_PuPd	= GPIO_PuPd_UP;		//上拉
	GPIO_InitStruct.GPIO_Speed	= GPIO_Speed_50MHz;	//50MHZ
	GPIO_Init(GPIOA,&GPIO_InitStruct);	


	USART_InitStruct.USART_BaudRate				= MyBaudRate;					//波特率
	USART_InitStruct.USART_Mode					= USART_Mode_Tx|USART_Mode_Rx;	//全双工模式
	USART_InitStruct.USART_Parity				= USART_Parity_No;				//无奇偶校验位
	USART_InitStruct.USART_WordLength			= USART_WordLength_8b;			//数据位
	USART_InitStruct.USART_StopBits				= USART_StopBits_1;				//停止位
	USART_InitStruct.USART_HardwareFlowControl	= USART_HardwareFlowControl_None;//无硬件控制流
	//串口参数初始化:设置波特率,字长,奇偶校验等参数。
	USART_Init(USART1, &USART_InitStruct);
	
	//开启中断并且初始化 NVIC,
	NVIC_InitStruct.NVIC_IRQChannel						= USART1_IRQn; //中断通道,中断通道在stm32f4xx.h文件当中查找
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority	= 0;		 //抢占优先级			
	NVIC_InitStruct.NVIC_IRQChannelSubPriority			= 0;		 //响应优先级
	NVIC_InitStruct.NVIC_IRQChannelCmd					= ENABLE;	 //使能通道
	//3、启定时器中断,配置NVIC。
    NVIC_Init(&NVIC_InitStruct);		


	//配置为接收中断(表示有数据过来,CPU要中断进行接收)
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);	
	
	
	//使能串口。
	USART_Cmd(USART1, ENABLE);

}


/*****************************************
引脚说明
PA2  ---- USART2_TX(发送端)
PA3  ---- USART2_RX(接收端)

USART2挂在APB1下
******************************************/
void Usart2_Init(int MyBaudRate)
{
	
	GPIO_InitTypeDef  	GPIO_InitStruct;
	USART_InitTypeDef	USART_InitStruct;
	NVIC_InitTypeDef  NVIC_InitStruct;
	
	//串口时钟使能,GPIO 时钟使能。
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
    //使能GPIOA时钟:
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);	
	
	//GPIOA2复用映射到USART1 引脚选定复用的功能
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_USART2); 	
	//GPIOA3复用映射到USART1 引脚选定复用的功能
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_USART2); 	
	
	//GPIO 初始化设置:要设置模式为复用功能。
	GPIO_InitStruct.GPIO_Pin	= GPIO_Pin_2|GPIO_Pin_3;		//引脚2 3
	GPIO_InitStruct.GPIO_Mode	= GPIO_Mode_AF;		//复用模式
	GPIO_InitStruct.GPIO_OType	= GPIO_OType_PP;	//推挽式
	GPIO_InitStruct.GPIO_PuPd	= GPIO_PuPd_UP;		//上拉
	GPIO_InitStruct.GPIO_Speed	= GPIO_Speed_50MHz;	//50MHZ
	GPIO_Init(GPIOA,&GPIO_InitStruct);	


	USART_InitStruct.USART_BaudRate				= MyBaudRate;					//波特率
	USART_InitStruct.USART_Mode					= USART_Mode_Tx|USART_Mode_Rx;	//全双工模式
	USART_InitStruct.USART_Parity				= USART_Parity_No;				//无奇偶校验位
	USART_InitStruct.USART_WordLength			= USART_WordLength_8b;			//数据位
	USART_InitStruct.USART_StopBits				= USART_StopBits_1;				//停止位
	USART_InitStruct.USART_HardwareFlowControl	= USART_HardwareFlowControl_None;//无硬件控制流
	//串口参数初始化:设置波特率,字长,奇偶校验等参数。
	USART_Init(USART2, &USART_InitStruct);
	
	//开启中断并且初始化 NVIC,
	NVIC_InitStruct.NVIC_IRQChannel						= USART2_IRQn; //中断通道,中断通道在stm32f4xx.h文件当中查找
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority	= 0;		 //抢占优先级			
	NVIC_InitStruct.NVIC_IRQChannelSubPriority			= 0;		 //响应优先级
	NVIC_InitStruct.NVIC_IRQChannelCmd					= ENABLE;	 //使能通道
	//3、启定时器中断,配置NVIC。
    NVIC_Init(&NVIC_InitStruct);		


	//配置为接收中断(表示有数据过来,CPU要中断进行接收)
	USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);	
	
	
	//使能串口。
	USART_Cmd(USART2, ENABLE);

}




/*****************************************
引脚说明
PB10  ---- USART3_TX(发送端)
PB11  ---- USART3_RX(接收端)

USART3挂在APB1下
******************************************/
void Usart3_Init(int MyBaudRate)
{
	
	GPIO_InitTypeDef  	GPIO_InitStruct;
	USART_InitTypeDef	USART_InitStruct;
	NVIC_InitTypeDef  NVIC_InitStruct;
	
	//串口时钟使能,GPIO 时钟使能。
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
    //使能GPIOB时钟:
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);	
	
	//GPIOB10复用映射到USART3 引脚选定复用的功能
    GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_USART3); 	
	//GPIOB11复用映射到USART3 引脚选定复用的功能
    GPIO_PinAFConfig(GPIOB,GPIO_PinSource11,GPIO_AF_USART3); 	
	
	//GPIO 初始化设置:要设置模式为复用功能。
	GPIO_InitStruct.GPIO_Pin	= GPIO_Pin_10|GPIO_Pin_11;		//引脚10 11
	GPIO_InitStruct.GPIO_Mode	= GPIO_Mode_AF;		//复用模式
	GPIO_InitStruct.GPIO_OType	= GPIO_OType_PP;	//推挽式
	GPIO_InitStruct.GPIO_PuPd	= GPIO_PuPd_UP;		//上拉
	GPIO_InitStruct.GPIO_Speed	= GPIO_Speed_50MHz;	//50MHZ
	GPIO_Init(GPIOB,&GPIO_InitStruct);	


	USART_InitStruct.USART_BaudRate				= MyBaudRate;					//波特率
	USART_InitStruct.USART_Mode					= USART_Mode_Tx|USART_Mode_Rx;	//全双工模式
	USART_InitStruct.USART_Parity				= USART_Parity_No;				//无奇偶校验位
	USART_InitStruct.USART_WordLength			= USART_WordLength_8b;			//数据位
	USART_InitStruct.USART_StopBits				= USART_StopBits_1;				//停止位
	USART_InitStruct.USART_HardwareFlowControl	= USART_HardwareFlowControl_None;//无硬件控制流
	//串口参数初始化:设置波特率,字长,奇偶校验等参数。
	USART_Init(USART3, &USART_InitStruct);
	
	//开启中断并且初始化 NVIC,
	NVIC_InitStruct.NVIC_IRQChannel						= USART3_IRQn; //中断通道,中断通道在stm32f4xx.h文件当中查找
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority	= 0;		 //抢占优先级			
	NVIC_InitStruct.NVIC_IRQChannelSubPriority			= 0;		 //响应优先级
	NVIC_InitStruct.NVIC_IRQChannelCmd					= ENABLE;	 //使能通道
	//3、启定时器中断,配置NVIC。
    NVIC_Init(&NVIC_InitStruct);		


	//配置为接收中断(表示有数据过来,CPU要中断进行接收)
	USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);	
	
	
	//使能串口。
	USART_Cmd(USART3, ENABLE);

}






void Usart2_Send(u8 *buff, u8 len)
{
	u8 i;
	
	for(i=0; i<len; i++)
	{
	
		USART_SendData(USART2,buff[i]);  //通过串口发送数据
		//等待数据发送完毕
		while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET); 
	}
	
}





#ifndef __USART_H
#define __USART_H

#include "stm32f4xx.h"


void Usart1_Init(int MyBaudRate);
void Usart2_Init(int MyBaudRate);
void Usart3_Init(int MyBaudRate);
void Usart2_Send(u8 *buff, u8 len);

#endif
#include "stm32f4xx.h"
#include "led.h"
#include "key.h"
#include "exti.h"
#include "delay.h"
#include "tim.h"
#include "pwm.h"
#include "usart.h"


u8  buffer[64] = {0};
u8  rx_buffer[64] = {0};
u8  count = 0, rx_i = 0;
u8  rx_flag = 0; //接受标志位,rx_flag = 表示数据帧完毕


void USART1_IRQHandler(void)
{
	


	//判断接收标志位是否为1
	if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
	{
		//清空接受标志位
		USART_ClearITPendingBit(USART1, USART_IT_RXNE);	
		//接受数据 
		buffer[count++] = USART_ReceiveData(USART1);
		//判断数据是否为':',如果是':'数据帧结束
		if(buffer[count-1] == ':')
		{
			//数据赋值到rx_buffer,并过滤帧尾
			for(rx_i=0; rx_i<(count-1); rx_i++)
			{
				rx_buffer[rx_i] = buffer[rx_i];
			}
		
			//清空数组
			memset(buffer, 0, sizeof(buffer));
			
			//标志位置1
			rx_flag = 1;
			//下一帧数据从buffer[0]开始接受
			count = 0; 
					
		
		}
		
	}
}




void USART2_IRQHandler(void)
{
	
	u8 data;
 printf("1\r\n");
	//判断接收标志位是否为1
	if(USART_GetITStatus(USART2, USART_IT_RXNE) == SET)
	{
		//清空接受标志位
		USART_ClearITPendingBit(USART2, USART_IT_RXNE);	
		//接受数据 
		buffer[count++] = USART_ReceiveData(USART2);
		//判断数据是否为':',如果是':'数据帧结束
		if(buffer[count-1] == ':')
		{
			//数据赋值到rx_buffer,并过滤帧尾
			for(rx_i=0; rx_i<(count-1); rx_i++)
			{
				rx_buffer[rx_i] = buffer[rx_i];
			}
		
			//清空数组
			memset(buffer, 0, sizeof(buffer));
			
			//标志位置1
			rx_flag = 1;
			//下一帧数据从buffer[0]开始接受
			count = 0; 
					
		}
		
	}


}


void USART3_IRQHandler(void)
{
	
	u8 data;

	//判断接收标志位是否为1
	if(USART_GetITStatus(USART3, USART_IT_RXNE) == SET)
	{
		//清空接受标志位
		USART_ClearITPendingBit(USART3, USART_IT_RXNE);	
		//接受数据 
		buffer[count++] = USART_ReceiveData(USART3);
		//判断数据是否为':',如果是':'数据帧结束
		if(buffer[count-1] == ':')
		{
			//数据赋值到rx_buffer,并过滤帧尾
			for(rx_i=0; rx_i<(count-1); rx_i++)
			{
				rx_buffer[rx_i] = buffer[rx_i];
			}
		
			//清空数组
			memset(buffer, 0, sizeof(buffer));
			
			//标志位置1
			rx_flag = 1;
			//下一帧数据从buffer[0]开始接受
			count = 0; 
					
		}
		
	}


}


int main(void)
{
	int key_count = 0;
	int j;
	//设置NVIC分组(一个工程只能设置一个分组) 
	//第二分组;抢占优先组取值范围:0~3 响应先组取值范围:0~3
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	Led_Init();
	Delay_Init();
	Exti_Init();
//Usart1_Init(9600);
	//Usart2_Init(9600);
	Usart2_Init(9600);
	
	while(1)
	{
		if(rx_flag == 1)
		{
		
			if(strcmp(rx_buffer, "HCL11") == 0)
			{
				LED0_ON;
			}
			
			if(strcmp(rx_buffer, "HCL10") == 0)
			{
				LED0_OFF;
			}			
		
			memset(rx_buffer, 0, sizeof(rx_buffer));
			rx_flag = 0;
		}
	}
}

超声波模块

#include "sr04.h"

/****************************************
引脚说明
引脚连接超声波, PA2 – TRIG(触发信号)  PA3 – ECHO(回响信号)
PA2做为普通输出
PA3做为普通输入

*****************************************/
void Sr04_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	TIM_TimeBaseInitTypeDef  	TIM_TimeBaseInitStruct;
	
	//使能GPIOA组时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
	//1、能定时器时钟。
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
	
	GPIO_InitStruct.GPIO_Pin	= GPIO_Pin_2;			//引脚2
	GPIO_InitStruct.GPIO_Mode	= GPIO_Mode_OUT;		//输出类型
	GPIO_InitStruct.GPIO_OType	= GPIO_OType_PP;		//输出推挽
	GPIO_InitStruct.GPIO_Speed	= GPIO_Speed_50MHz;		//速度
	GPIO_InitStruct.GPIO_PuPd	= GPIO_PuPd_UP;			//上拉
	GPIO_Init(GPIOA, &GPIO_InitStruct);
	
	
	GPIO_InitStruct.GPIO_Pin	= GPIO_Pin_3;				//引脚3
	GPIO_InitStruct.GPIO_Mode	= GPIO_Mode_IN;				//输入
	GPIO_InitStruct.GPIO_PuPd	= GPIO_PuPd_NOPULL;			//浮空
	GPIO_Init(GPIOA, &GPIO_InitStruct);	
	


	TIM_TimeBaseInitStruct.TIM_Period		= 50000-1; 				//重载寄存器。
	TIM_TimeBaseInitStruct.TIM_Prescaler	= 83;   				//84分频 84MHZ/84 = 1MHZ 计一个数,用1us
	TIM_TimeBaseInitStruct.TIM_CounterMode	= TIM_CounterMode_Up;	//向上计数
	TIM_TimeBaseInitStruct.TIM_ClockDivision= TIM_CKD_DIV1;			//分频因子
	//2、初始化定时器,配置ARR,PSC。
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);

	//5、不使能定时器。
	TIM_Cmd(TIM3, DISABLE);	


}

u16 Get_Sr04_Value(void)
{

	u16 t = 0;
	u16 distance;
	u16 count = 0;
	
	
	
	//触发信号
	TRIG  = 0;
	delay_us(10);
	TRIG  = 1;
	//高电平持续时间为20us
	delay_us(20);
	TRIG  = 0;

	//设置CNT为0
	TIM3->CNT = 0;
	
	//等待高电平到来,并做超时处理
	while( PAin(3) == 0)
	{
		t++;
		delay_us(10);
	
		//如果等待5ms未能等待高电平,则返回
		if(t >= 500)
			return 0;
	}

	//开启定时器
	TIM_Cmd(TIM3, ENABLE);	
	
	t = 0;
	//等待低电平到来,并做超时处理
	while( PAin(3) == 1 )
	{
		t++;
		delay_us(20);
	
		//如果等待24ms(24ms测量的距离为413cm了,手册中说最远为40cmm,故取此值)未能等待低电平,则返回
		if(t >= 1200)
			return 0;		
	}

	//获取定时器的CNT值
	//count = TIM_GetCounter(TIM3);
	count = TIM3->CNT;
	
	//关闭定时器
	TIM_Cmd(TIM3, DISABLE);	
	
	//通过定时器的CNT值计算出距离

	distance = count/58;

	return distance;

}
#ifndef __SR04_H
#define __SR04_H

#include "stm32f4xx.h"
#include "sys.h"
#include "delay.h"

/*******************************
引脚说明:
PA2  -- TRIG(输出)
PA3  -- ECHO(输入)
*******************************/

#define TRIG   PAout(2)
#define ECHO   PAin(3)



void Sr04_Init(void);
u16 Get_Sr04_Value(void);


#endif
#include "stm32f4xx.h"
#include "led.h"
#include "key.h"
#include "exti.h"
#include "delay.h"
#include "tim.h"
#include "pwm.h"
#include "usart.h"
#include "sys.h"
#include "sr04.h"


u8  buffer[64] = {0};
u8  rx_buffer[64] = {0};
u8  count = 0, rx_i = 0;
u8  rx_flag = 0; //接受标志位,rx_flag = 表示数据帧完毕


void USART1_IRQHandler(void)
{
	


	//判断接收标志位是否为1
	if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
	{
		//清空接受标志位
		USART_ClearITPendingBit(USART1, USART_IT_RXNE);	
		//接受数据 
		buffer[count++] = USART_ReceiveData(USART1);
		//判断数据是否为':',如果是':'数据帧结束
		if(buffer[count-1] == ':')
		{
			//数据赋值到rx_buffer,并过滤帧尾
			for(rx_i=0; rx_i<(count-1); rx_i++)
			{
				rx_buffer[rx_i] = buffer[rx_i];
			}
		
			//清空数组
			memset(buffer, 0, sizeof(buffer));
			
			//标志位置1
			rx_flag = 1;
			//下一帧数据从buffer[0]开始接受
			count = 0; 
					
		
		}
		
	}
}




void USART2_IRQHandler(void)
{
	
	u8 data;

	//判断接收标志位是否为1
	if(USART_GetITStatus(USART2, USART_IT_RXNE) == SET)
	{
		//清空接受标志位
		USART_ClearITPendingBit(USART2, USART_IT_RXNE);	
		//接受数据 
		buffer[count++] = USART_ReceiveData(USART2);
		//判断数据是否为':',如果是':'数据帧结束
		if(buffer[count-1] == ':')
		{
			//数据赋值到rx_buffer,并过滤帧尾
			for(rx_i=0; rx_i<(count-1); rx_i++)
			{
				rx_buffer[rx_i] = buffer[rx_i];
			}
		
			//清空数组
			memset(buffer, 0, sizeof(buffer));
			
			//标志位置1
			rx_flag = 1;
			//下一帧数据从buffer[0]开始接受
			count = 0; 
					
		}
		
	}


}


void USART3_IRQHandler(void)
{
	
	u8 data;

	//判断接收标志位是否为1
	if(USART_GetITStatus(USART3, USART_IT_RXNE) == SET)
	{
		//清空接受标志位
		USART_ClearITPendingBit(USART3, USART_IT_RXNE);	
		//接受数据 
		buffer[count++] = USART_ReceiveData(USART3);
		//判断数据是否为':',如果是':'数据帧结束
		if(buffer[count-1] == ':')
		{
			//数据赋值到rx_buffer,并过滤帧尾
			for(rx_i=0; rx_i<(count-1); rx_i++)
			{
				rx_buffer[rx_i] = buffer[rx_i];
			}
		
			//清空数组
			memset(buffer, 0, sizeof(buffer));
			
			//标志位置1
			rx_flag = 1;
			//下一帧数据从buffer[0]开始接受
			count = 0; 
					
		}
		
	}


}


int main(void)
{
	u16 distance;
	
	
	//设置NVIC分组(一个工程只能设置一个分组) 
	//第二分组;抢占优先组取值范围:0~3 响应先组取值范围:0~3
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	Led_Init();
	Delay_Init();
	Exti_Init();
	Usart1_Init(115200);
	Sr04_Init();
	
	while(1)
	{

		distance = Get_Sr04_Value();
		printf("distance:%dcm\r\n", distance);
		delay_s(2);
	}
}

  • 3
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hqb_newfarmer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值