IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32实现光照强度传感器(BH1750)(标准库与HAL库实现) -> 正文阅读

[嵌入式]STM32实现光照强度传感器(BH1750)(标准库与HAL库实现)

目录

元器件类型选择

接线表设计

实现过程

?标准库实现

?HAL库实现

代码下载


元器件类型选择

单片机选择:STM32F103

光照度模块:维特智能出品的 BH1750

模块被企业封装过,将采集的光照度数据直接串口显示,显示效果如下:

?

?我们需要实现的就比较简单了,只需要将串口数据通过单片机采集出来即可。

接线表设计

序号光照度模块单片机STM32
1VCC3.3V/5V
2RXDPA2(USART2_TX)
3TXDPA3(USART2_RX)
4GNDGND
5-PA9(USART1_TX)
6-PA10(USART1_RX)

串口1是为了在电脑端显示串口2所采集的数据。

实现过程

我们将从标准库和HAL库两个方面实现

?标准库实现

核心代码如下:

void USART2_IRQHandler(void)                	//串口2中断服务程序
{
	int i = 0;	//	循环变量
	int n = 0;	//	循环变量
	int Ligth = 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('L' != RxBuffer[0])			//	如果第一个数据接收的不是L,则数据接收错误
		{
			Uart1_Rx_Cnt = 0;
			return;
		}	
		
		if( 0X0A == RxBuffer[Uart1_Rx_Cnt-1] && 0X0D == RxBuffer[Uart1_Rx_Cnt-2] && 'L' == RxBuffer[0] )
		{
			USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);//关闭串口接受中断  为了处理数据
			if(NULL != strstr(RxBuffer, "Ligth"))			//	判断是否是有效数据
			{	
//				for(i=0;i<strlen(RxBuffer);i++)				///	调试代码 可删除
//				{
//					USART_SendData(USART1, RxBuffer[i]);	
//					delay_ms(1);
//				}		
				
				for(i = 0;i<strlen(RxBuffer);i++)
				{
					if(RxBuffer[i]<='9' && RxBuffer[i]>='0')
					{
						InStr[n++] = RxBuffer[i];
					}
				}
				Ligth = atoi(InStr);					//	距离 一个整数 可以直接使用
				///****调试 串口1 输出**开始**********
				sprintf(TxBuffer,"%d\r\n",Ligth); 
				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('L' != RxBuffer[0])
		{
			Uart1_Rx_Cnt = 0;
			while(HAL_OK != HAL_UART_Receive_IT(&huart2, (uint8_t *)&aRxBuffer, 1));   //开启接收中断,并保证开启成功
			return;
		}
	}
	
	if( 0X0A == RxBuffer[Uart1_Rx_Cnt-1] && 0X0D == RxBuffer[Uart1_Rx_Cnt-2]  && 'L' == RxBuffer[0] )
	{
		if(NULL != strstr(RxBuffer, "Ligth"))			//	判断是否是有效数据
		{	
//			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 = 0;i<strlen(RxBuffer);i++)
			{
				if(RxBuffer[i]<='9' && RxBuffer[i]>='0')
				{
					InStr[n++] = RxBuffer[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条消息) STM32实现光照强度传感器(BH1750)(标准库与HAL库实现)-C文档类资源-CSDN文库

吾芯电子工作室

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-11-05 00:42:58  更:2022-11-05 00:43:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 20:45:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码