[HAL]STM32F1光照度测量BH1750 串口输出
[HAL]STM32F1光照度测量BH1750 串口输出
硬件连接:
使用到的硬件有:STM32F103C8T6最小系统板,USB转TTL模块(串口通信),光照度小球(主芯片BH1750)
连接图:
使用到的引脚:
除了RCC和下载方式SYS外只需要配置IIC和USARTSTM32CubeMX配置:
具体配置都默认
时钟框图:
生成工程后先搞一下printf函数重定义:
把以下代码粘贴在usart.c最后
/* USER CODE BEGIN 1 */
#ifdef __GNUC__/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printfset to 'Yes') calls __io_putchar() */#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
/**1. @brief Retargets the C library printf function to the USART.2. @param None3. @retval None*/
PUTCHAR_PROTOTYPE
{/* Place your implementation of fputc here *//* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);return ch;
}
/* USER CODE END 1 */
在usart.c和main.c里添加头文件:stdio.h
4. 添加BH1750.c和BH1750.h文件
BH1750.c
#include "BH1750.h"uint8_t mcy=0;
uint8_t BUF[3];
/***开始信号**/
void BH1750_Start()
{HAL_GPIO_WritePin(GPIOB, sda,GPIO_PIN_SET); //拉高数据线HAL_GPIO_WritePin(GPIOB, scl,GPIO_PIN_SET); //拉高时钟线delay_us(5); HAL_GPIO_WritePin(GPIOB, sda,GPIO_PIN_RESET); //产生下降沿delay_us(5); HAL_GPIO_WritePin(GPIOB, scl,GPIO_PIN_RESET); //拉低时钟线
}/*****停止信号******/
void BH1750_Stop()
{HAL_GPIO_WritePin(GPIOB, sda,GPIO_PIN_RESET); //拉低数据线HAL_GPIO_WritePin(GPIOB, scl,GPIO_PIN_SET); //拉高时钟线delay_us(5); HAL_GPIO_WritePin(GPIOB, sda,GPIO_PIN_SET); //产生上升沿delay_us(5);
}
/*****初始化BH1750******/
void Init_BH1750()
{BH1750_Start(); //起始信号BH1750_SendByte(SlaveAddress); //发送设备地址+写信号BH1750_SendByte(0x01); //内部寄存器地址BH1750_Stop(); //停止信号}//连续读出BH1750内部数据
uint16_t mread(void)
{ uint8_t i; BH1750_Start(); //起始信号BH1750_SendByte(SlaveAddress+1); //发送设备地址·+读信号for (i=0; i<3; i++) //连续读取6个地址数据到BUF{BUF[i] = BH1750_RecvByte(); if (i == 3){BH1750_SendACK(1); //最后一个数据需要回NOACK}else{ BH1750_SendACK(0); //回应ACK}}BH1750_Stop(); //停止信号Delay_mms(5);}uint32_t Value_GY30(void)
{uint16_t dis_data;uint16_t Value_GY_30;Single_Write_BH1750(0x01); // power onSingle_Write_BH1750(0x10); // H- resolution mode HAL_Delay(180); //延时180ms mread(); //连续读出数据,存储在BUF中dis_data=BUF[0];dis_data=(dis_data<<8)+BUF[1];//字节合成数据Value_GY_30=(float)dis_data/1.2;return Value_GY_30;
}
//系统主频72MHZ
void delay_us(uint16_t us)
{while(us--){__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();}
}
void Delay_mms(uint16_t tmp)
{uint16_t i=0;while(tmp--){i=12000;while(i--);}
}/**************************************
发送应答信号
入口参数:ack (0:ACK 1:NAK)
**************************************/
void BH1750_SendACK(int ack)
{GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.Pin = scl|sda;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); if(ack == 1) //写应答信号HAL_GPIO_WritePin(GPIOB, sda,GPIO_PIN_SET); else if(ack == 0)HAL_GPIO_WritePin(GPIOB, sda,GPIO_PIN_RESET);elsereturn;HAL_GPIO_WritePin(GPIOB, scl,GPIO_PIN_SET); delay_us(5); HAL_GPIO_WritePin(GPIOB, scl,GPIO_PIN_RESET); delay_us(5);
}/**************************************
接收应答信号
**************************************/
int BH1750_RecvACK()
{ GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.Mode = GPIO_MODE_INPUT; /*输入上拉*/GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;GPIO_InitStruct.Pin = sda;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); HAL_GPIO_WritePin(GPIOB, scl,GPIO_PIN_SET); //拉高时钟线delay_us(5); if(HAL_GPIO_ReadPin( GPIOB, sda ) == 1 )//读应答信号mcy = 1 ; elsemcy = 0 ; HAL_GPIO_WritePin(GPIOB, scl,GPIO_PIN_RESET); //拉低时钟线delay_us(5); GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;HAL_GPIO_Init( GPIOB, &GPIO_InitStruct );return mcy;
}/**************************************
向iic总线发送一个字节数据
**************************************/
void BH1750_SendByte(uint8_t dat)
{uint8_t i;for (i=0; i<8; i++) //8位计数器{if( 0X80 & dat )HAL_GPIO_WritePin(GPIOB, sda,GPIO_PIN_SET);elseHAL_GPIO_WritePin(GPIOB, sda,GPIO_PIN_RESET);dat <<= 1;HAL_GPIO_WritePin(GPIOB, scl,GPIO_PIN_SET); //拉高时钟线delay_us(5); HAL_GPIO_WritePin(GPIOB, scl,GPIO_PIN_RESET); //拉低时钟线delay_us(5); }BH1750_RecvACK();
}//我们对BH1750发送命令时,要先发送器件地址+写入位,然后发送指令
//读取数据的时候,需要先发送器件地址+读入位,然后读取两字节数据//写入指令
void Single_Write_BH1750(uint8_t REG_Address)//REG_Address是要写入的指令
{BH1750_Start(); //起始信号BH1750_SendByte(SlaveAddress); //发送器件地址+写信号BH1750_SendByte(REG_Address); //写入指令,内部寄存器地址BH1750_Stop(); //结束信号
}
/**************************************
从iic总线读取一个字节地址
**************************************/
uint8_t BH1750_RecvByte()
{uint8_t i;uint8_t dat = 0;uint8_t bit;GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.Mode = GPIO_MODE_INPUT; /*上拉输入*/GPIO_InitStruct.Pin = sda;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init( GPIOB, &GPIO_InitStruct );HAL_GPIO_WritePin(GPIOB, sda,GPIO_PIN_SET); //准备读取数据for (i=0; i<8; i++) //8位计数器{dat <<= 1;HAL_GPIO_WritePin(GPIOB, scl,GPIO_PIN_SET); //拉高时钟线delay_us(5); if( SET == HAL_GPIO_ReadPin( GPIOB, sda ) )bit = 0X01;elsebit = 0x00; dat |= bit; //读数据 HAL_GPIO_WritePin(GPIOB, scl,GPIO_PIN_RESET); //拉低时钟线delay_us(5); }GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;HAL_GPIO_Init( GPIOB, &GPIO_InitStruct );return dat;
}
BH1750.h
#ifndef __BH1750_H
#define __BH1750_H
#include "main.h"
#define scl GPIO_PIN_6
#define sda GPIO_PIN_7#define SlaveAddress 0x46 //ADDR接GND时的器件地址
#define BH1750_PWR_DOWN 0x00 //关闭模块
#define BH1750_PWR_ON 0x01 //打开模块等待测量命令
#define BH1750_RST 0x07 //重置数据寄存器值在PowerOn模式下有效
#define BH1750_CON_H 0x10 // 连续高分辨率模式,1lx,120ms
#define BH1750_CON_H2 0x11 // 连续高分辨率模式.5lx,120ms
#define BH1750_CON_L 0x13 // 连续低分辨率模式,4lx,16ms
#define BH1750_ONE_H 0x20 // 一次高分辨率模式,1lx,120ms,测量后模块转到PowerDown模式
#define BH1750_ONE_H2 0x21 // 一次高分辨率模式,0.5lx,120ms,测量后模块转到PowerDown模式
#define BH1750_ONE_L 0x23 // 一次低分辨率模式,4lx,16ms,测量后模块转到PowerDown模式void BH1750_Start();
void BH1750_Stop();
void Init_BH1750();
uint16_t mread(void);
uint32_t Value_GY30(void);
void delay_us(uint16_t us);
void Delay_mms(uint16_t tmp);
void BH1750_SendACK(int ack);
int BH1750_RecvACK();
void BH1750_SendByte(uint8_t dat);
uint8_t BH1750_RecvByte();
int I2C_ReadData(uint8_t slaveAddr, uint8_t regAddr, uint8_t *pData, uint16_t dataLen);
void Single_Write_BH1750(uint8_t REG_Address);#endif
- main.c
添加如下代码:
/* USER CODE BEGIN Includes */
#include "stdio.h"
#include "BH1750.h"
/* USER CODE END Includes */
/* USER CODE BEGIN 2 */Init_BH1750();printf("\n\r UART already\n\r");/* USER CODE END 2 */
while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */printf("\n\r 光照强度:%d lx\n\r",Value_GY30());HAL_Delay(1000);}
- 效果展示:
晚上开着灯的室内:
用手在小球前方6厘米左右挡着光:
整个工程已上传到我的资源,需要的朋友可以康康
[HAL]STM32F1光照度测量BH1750 串口输出相关推荐
- HAL库中断方式实现串口通信操作
文章目录 一.实验工具 二.CubeMX配置项目 1.引脚配置 2.RCC设置 3.SYS设置 4.USART设置 5.NVIC设置 6.创建项目 三.keil中配置代码 1.main函数前定义全局变 ...
- Arduino驱动VL53L0X V2激光测距(串口输出)
Arduino驱动VL53L0X V2激光测距(串口输出) 一.简介 二.使用前准备 三.测试方法 四.实验现象 总结 一.简介 激光测距传感器模块功耗小,体积小,安装方便.它是根据红外LED发光,照 ...
- STM32获取GY-25A倾角传感器串口输出数据
STM32获取GY-25A倾角传感器串口输出数据 GY-25A模块是新型的倾角传感器模块,具有X和Y两轴模拟角度输出和串口角度输出的功能.这里介绍STM32获取GY-25A串口输出的角度数据.(获取模 ...
- 基于STM32F1的超级终端串口控制程序思路分析
基于STM32F1的超级终端串口控制程序思路分析(洋桃派M1) 一.准备 洋桃电子 M1 核心板: 用户程序中的"1-2-11-超级终端串口控制程序": HyperTerminal ...
- stm32 串口输出 中文乱码
使用hal库函数 情况: 在使用串口输出中英文混合字符时, 遇到了英文和数字正常显示, 中文出现乱码的情况, 进一步查看,发现串口调试助手显示16进制时,相同位置中文和乱码的16进制都是一样的,所以并 ...
- STM32F103C8T6制作舵机测试仪详细图文教程 | 定时器触发ADC | DMA传输 | PWM输出 | RTC实时时钟 | USART串口输出 | OLED IIC显示
自主学习STM32已有一周,先实现一个小demo,算是给自己一个动力叭,有目标的学习收获会更多.虽然本科也修了嵌入式课程,但那种走马观花式的学习,最后真正得到的知识实在寥寥无几.个人理解,学习STM3 ...
- 休眠 关闭串口输出_C#实例:串口通讯
先看下运行结果: 最近在研究串口通讯,其中有几个比较重要的概念,RS-232这种适配于上位机和PC端进行连接,RS-232只限于PC串口和设备间点对点的通信.它很简单的就可以进行连接,由于串口通讯是异 ...
- android蓝牙串口 hc06,Android手机通过蓝牙模块HC-06连接Arduino串口输出
通过手机进行通信是可以实现很多遥控功能,虽然距离是比较短,一般是10米,但对于我这种新手做测试,比起买一个几百块的多通道遥控器成本要低很多. 实验目的:用Android实现蓝牙连接通过Arduino串 ...
- 串口输出换行_stm32初学者必会操作----usart串口调试工具
stm32初学者必会操作----usart串口调试工具 今天笔者介绍stm32初学者必会的工具 usart的串口设备. usart很重要,可以传输数据,可以检查代码的错误位置,查看输出数据. 下图就是 ...
- STM32串口输出字符串
目录 串口 步骤 1.确定 IO 口并初始化 2.初始化 UATR 3.UART 中断配置 4.编写 UART 中断服务函数 5.1.方法一:重定向 fputc() 5.2.方法二:将字符串分割成一个 ...
最新文章
- spring 源码 找不到 taskprovider_一步一步构建Spring5源码
- 第四次作业,孙保平034
- Shall的变量功能
- 集成开发环境(IDE)
- opencv视频模糊处理
- MyTask - old implementation - getEntitySet
- C++知识分享之STL容器:set 容器与 map 容器的简单应用
- Java面试题:高并发环境下,jdk7 HashMap可能出现的致命问题。注意:是在jdk7与及以下版本
- MATLAB xlswrite 写数据 到 Excel文件
- 网管学习日记-MPLS-手工配置LSP
- PhotoShop 2022 mac版新增功能
- 关于分卷压缩文件打不开的问题
- 解决 nvcc: command not found
- 电路原理 第一章 电路模型和电路定律(一)
- 利用Python对非接触式IC卡的读写操作
- mysql strlength_mySQL教程 第7章 存储过程和函数
- cesium.js官网教程之中文版本~~~~第一篇
- Linux驱动开发: 杂项字符设备
- 图灵热点之阅读篇——七月图书推荐
- 饥荒开服(含各种踩雷)
热门文章
- 医院挂号系统代码_人脸识别+身份绑定!高科技精准打击医院号贩子
- python中base函数_详细的python basemap中各函数的所有参量注释
- 什么是运算计算机科学的基础概念,【软件设计师】笔记一:计算机科学基础知识...
- python练手经典100例项目-Python 的练手项目有哪些值得推荐?
- cocos creator使用anysdk接入admob广告教程
- 如何维持手机电池寿命_如何延长手机电池寿命?总有些事你不知道
- conventional-changelog 参数含义
- 父子组件传值——静态传值、动态传值
- 解决iText 5.0.1生成pdf,加入iTextAsian.jar 出现异常 Font 'STSong-Light' with 'UniGB-UCS2-H'...
- Excel VBA单元格数据自增1