目录
元器件类型选择
接线表设计
实现过程
?标准库实现
?HAL库实现
代码下载
元器件类型选择
单片机选择:STM32F103
光照度模块:维特智能出品的 BH1750
模块被企业封装过,将采集的光照度数据直接串口显示,显示效果如下:
?
?我们需要实现的就比较简单了,只需要将串口数据通过单片机采集出来即可。
接线表设计
序号 | 光照度模块 | 单片机STM32 | 1 | VCC | 3.3V/5V | 2 | RXD | PA2(USART2_TX) | 3 | TXD | PA3(USART2_RX) | 4 | GND | GND | 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文库
吾芯电子工作室
|