当前位置: 首页 > news >正文

STM32F103实现激光测距传感器测距WT-VL53L0 L1

目录

本博客将采用标准库和HAL库实现

所用设备选择

引脚说明

与单片机的接线表

标准库实现

 HAL库实现


本博客将采用标准库HAL库实现

所用设备选择

单片机型号:STM32F103C8T6

 激光测距传感器型号:WT-VL53L0 L1

 

采用串口TTL电平输出,可以接USB-TTL串口到电脑,或者直接接MCU的串口,实时输出距离数据(ASCII码)。

该模块可以直接接收串口数据

本博文任务是将数据提取出来,以便其它模块使用。

引脚说明

模块的引脚说明:

序号激光测距模块引脚颜色
1VCC红色
2RXD绿色
3TXD黄色
4SCL-
5SDA-
6GND黑色

与单片机的接线表

序号激光测距模块引脚颜色单片机STM32
1VCC红色VCC/5V
2RXD绿色PA2(USART2_TX)
3TXD黄色PA3(USART2_RX)
4SCL-
5SDA-
6GND黑色GND
7--PA9(USART1_TX)
8--PA10(USART1_RX)

这里选用了两个串口

串口1的作用是将数据测得数据显示在电脑端(串口助手显示)

串口2采集测得的数据,并进行处理。

标准库实现

 usart.c

void uart1_init(u32 bound){
  //GPIO端口设置
  GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);	//使能USART1,GPIOA时钟
  
	//USART1_TX   GPIOA.9
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9
   
  //USART1_RX	  GPIOA.10初始化
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  
 
  //Usart1 NVIC 配置
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子优先级3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器
  
   //USART 初始化设置
 
	USART_InitStructure.USART_BaudRate = bound;//串口波特率
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
	USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式
 
  USART_Init(USART1, &USART_InitStructure); //初始化串口1
  USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);//开启串口接受中断  串口1暂时不需要接收数据,只需要发送数据即可
  USART_Cmd(USART1, ENABLE);                    //使能串口1 
}

void uart2_init(u32 bound){
  //GPIO端口设置
  GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	//使能GPIOA时钟 
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);	//使能USART2时钟 
  
	//USART1_TX   GPIOA.2
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA.2
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.2
   
  //USART1_RX	  GPIOA.3初始化
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA3
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.3  
 
  //Usart1 NVIC 配置
  NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子优先级3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器
  
   //USART 初始化设置
 
	USART_InitStructure.USART_BaudRate = bound;//串口波特率
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
	USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式
 
  USART_Init(USART2, &USART_InitStructure); //初始化串口1
  USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启串口接受中断
  USART_Cmd(USART2, ENABLE);                    //使能串口1 
}

void USART2_IRQHandler(void)                	//串口2中断服务程序
{
	int i = 0;	//	循环变量
	int n = 0;	//	循环变量
	int Dis = 0;		//	距离
	char InStr[20]="";     //	存放整数字符串
	
	if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
	{
		USART_ClearITPendingBit(USART2, USART_IT_RXNE);//清除标志位
		aRxBuffer =USART_ReceiveData(USART2);//(USART1->DR);	//读取接收到的数据
		RxBuffer[Uart1_Rx_Cnt++] = aRxBuffer;			//	接收数据
		
		if( 'm' == RxBuffer[Uart1_Rx_Cnt-1] && 'm' == RxBuffer[Uart1_Rx_Cnt-2] )
		{
			USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);//关闭串口接受中断  为了处理数据
			if(NULL != strstr(RxBuffer, "Valid"))			//	判断是否是有效数据
			{	
//				for(i=0;i<strlen(RxBuffer);i++)				///	调试代码 可删除
//				{
//					USART_SendData(USART1, RxBuffer[i]);	
//					delay_ms(1);
//				}		
				
				for(i = 15;i<strlen(RxBuffer);i++)
				{
					TxBuffer[i-15] = RxBuffer[i];
				}
				
				for(i = 0;i<strlen(TxBuffer);i++)
				{
					if(TxBuffer[i]<='9' && TxBuffer[i]>='0')
					{
						InStr[n++] = TxBuffer[i];
					}
				}
				Dis = atoi(InStr);					//	距离 一个整数 可以直接使用
				///****调试 串口1 输出**开始**********
				sprintf(TxBuffer,"%d\r\n",Dis); 
				for(i=0;i<strlen(TxBuffer);i++)
				{
					USART_SendData(USART1, TxBuffer[i]);	
					delay_ms(1);
				}
				///****调试 串口1 输出**结束**********	
			}
			memset(RxBuffer,0x00,sizeof(RxBuffer)); //清空数组
			memset(TxBuffer,0x00,sizeof(TxBuffer)); //清空数组
			memset(InStr,0x00,sizeof(InStr)); //清空数组
			Uart1_Rx_Cnt = 0;
			n = 0;
			
			USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启串口接受中断  为了处理数据
		}
  		 
	}
}

实现效果:

 HAL库实现

 核心代码就在回调函数这个地方:


void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	int i = 0;	//	循环变量
	int n = 0;	//	循环变量
	int Dis = 0;		//	距离
	char InStr[20]="";     //	存放整数字符串
  /* Prevent unused argument(s) compilation warning */
  UNUSED(huart);
  /* NOTE: This function Should not be modified, when the callback is needed,
           the HAL_UART_TxCpltCallback could be implemented in the user file
   */
	if(aRxBuffer != 0)
	{
		RxBuffer[Uart1_Rx_Cnt++] = aRxBuffer;			//	接收数据
	}
	
	if( 'm' == RxBuffer[Uart1_Rx_Cnt-1] && 'm' == RxBuffer[Uart1_Rx_Cnt-2] )
	{
		if(NULL != strstr(RxBuffer, "Valid"))			//	判断是否是有效数据
		{	
//			HAL_UART_Transmit(&huart1, (uint8_t *)RxBuffer, strlen(RxBuffer),0xFFFF); 	//将收到的信息发送出去
//			while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);								//检测UART发送结束
//			HAL_UART_Transmit(&huart1, (uint8_t *)"\r\n", strlen("\r\n"),0xFFFF); 			//将收到的信息发送出去
//			while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);								//检测UART发送结束		
			for(i = 15;i<strlen(RxBuffer);i++)
			{
				TxBuffer[i-15] = RxBuffer[i];
			}
			
			for(i = 0;i<strlen(TxBuffer);i++)
			{
				if(TxBuffer[i]<='9' && TxBuffer[i]>='0')
				{
					InStr[n++] = TxBuffer[i];
				}
			}
			Dis = atoi(InStr);					//	距离 一个整数 可以直接使用
			sprintf(TxBuffer,"%d\r\n",Dis); 
			HAL_UART_Transmit(&huart1, (uint8_t *)TxBuffer, strlen(TxBuffer),0xFFFF); //将收到的信息发送出去
			while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);//检测UART发送结束
		}
		memset(RxBuffer,0x00,sizeof(RxBuffer)); //清空数组
		memset(TxBuffer,0x00,sizeof(TxBuffer)); //清空数组
		memset(InStr,0x00,sizeof(InStr)); //清空数组
		Uart1_Rx_Cnt = 0;
		n = 0;
	}
	
	while(HAL_OK != HAL_UART_Receive_IT(&huart2, (uint8_t *)&aRxBuffer, 1));   //开启接收中断,并保证开启成功
	
}

实现效果如下:

如有问题或需求可私信交流

源码链接(标准库与HAL库):

(1条消息) STM32F103实现激光测距传感器测距WT-VL53L0L1-C文档类资源-CSDN文库
吾芯电子工作室

相关文章:

  • Python高级_第6章_Python简单爬虫实践案例
  • C++ 引用的数组和数组的引用
  • LQ0134 最大降雨量【中位数】
  • 大数据随记 —— 利用Python分析快手APP全国大学生用户数据(2022 年初赛第四题 )
  • 【转载】分布式训练和集合通信
  • 【K8S系列】Kubernetes的网络模型
  • CTFHub | 报错注入
  • Python-代码封装思想
  • 基于MATLAB的指纹识别算法仿真实现
  • Spring Boot中异步消息JMS的讲解与通信实例
  • JeecgBoot 3.4.3-GA 版本发布,开源免费的企业级低代码平台
  • 代码随想录38——动态规划:动态规划理论基础、509斐波那契数列、70爬楼梯、746使用最小花费爬楼梯
  • 基于大数据平台的毕业设计01:基于Docker的HDP集群搭建
  • YOLOv5剪枝 | 模型剪枝理论篇 | 1/2
  • 结构体、枚举类型和联合体
  • Android 架构优化~MVP 架构改造
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • Date型的使用
  • ES6语法详解(一)
  • interface和setter,getter
  • iOS | NSProxy
  • JS 面试题总结
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • Spring Boot快速入门(一):Hello Spring Boot
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 搭建gitbook 和 访问权限认证
  • 开源SQL-on-Hadoop系统一览
  • 前端js -- this指向总结。
  • 前端自动化解决方案
  • 使用API自动生成工具优化前端工作流
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 小程序button引导用户授权
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 白色的风信子
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • !!java web学习笔记(一到五)
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • (1)虚拟机的安装与使用,linux系统安装
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (windows2012共享文件夹和防火墙设置
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (三)elasticsearch 源码之启动流程分析
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (转)ORM
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET 8.0 发布到 IIS