[HAL]STM32F1光照度测量BH1750 串口输出

  1. 硬件连接:
    使用到的硬件有:STM32F103C8T6最小系统板,USB转TTL模块(串口通信),光照度小球(主芯片BH1750)
    连接图:

    使用到的引脚:

    除了RCC和下载方式SYS外只需要配置IIC和USART

  2. STM32CubeMX配置:


    具体配置都默认
    时钟框图:

  3. 生成工程后先搞一下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
  1. 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);}
  1. 效果展示:
    晚上开着灯的室内:

    用手在小球前方6厘米左右挡着光:

整个工程已上传到我的资源,需要的朋友可以康康

[HAL]STM32F1光照度测量BH1750 串口输出相关推荐

  1. HAL库中断方式实现串口通信操作

    文章目录 一.实验工具 二.CubeMX配置项目 1.引脚配置 2.RCC设置 3.SYS设置 4.USART设置 5.NVIC设置 6.创建项目 三.keil中配置代码 1.main函数前定义全局变 ...

  2. Arduino驱动VL53L0X V2激光测距(串口输出)

    Arduino驱动VL53L0X V2激光测距(串口输出) 一.简介 二.使用前准备 三.测试方法 四.实验现象 总结 一.简介 激光测距传感器模块功耗小,体积小,安装方便.它是根据红外LED发光,照 ...

  3. STM32获取GY-25A倾角传感器串口输出数据

    STM32获取GY-25A倾角传感器串口输出数据 GY-25A模块是新型的倾角传感器模块,具有X和Y两轴模拟角度输出和串口角度输出的功能.这里介绍STM32获取GY-25A串口输出的角度数据.(获取模 ...

  4. 基于STM32F1的超级终端串口控制程序思路分析

    基于STM32F1的超级终端串口控制程序思路分析(洋桃派M1) 一.准备 洋桃电子 M1 核心板: 用户程序中的"1-2-11-超级终端串口控制程序": HyperTerminal ...

  5. stm32 串口输出 中文乱码

    使用hal库函数 情况: 在使用串口输出中英文混合字符时, 遇到了英文和数字正常显示, 中文出现乱码的情况, 进一步查看,发现串口调试助手显示16进制时,相同位置中文和乱码的16进制都是一样的,所以并 ...

  6. STM32F103C8T6制作舵机测试仪详细图文教程 | 定时器触发ADC | DMA传输 | PWM输出 | RTC实时时钟 | USART串口输出 | OLED IIC显示

    自主学习STM32已有一周,先实现一个小demo,算是给自己一个动力叭,有目标的学习收获会更多.虽然本科也修了嵌入式课程,但那种走马观花式的学习,最后真正得到的知识实在寥寥无几.个人理解,学习STM3 ...

  7. 休眠 关闭串口输出_C#实例:串口通讯

    先看下运行结果: 最近在研究串口通讯,其中有几个比较重要的概念,RS-232这种适配于上位机和PC端进行连接,RS-232只限于PC串口和设备间点对点的通信.它很简单的就可以进行连接,由于串口通讯是异 ...

  8. android蓝牙串口 hc06,Android手机通过蓝牙模块HC-06连接Arduino串口输出

    通过手机进行通信是可以实现很多遥控功能,虽然距离是比较短,一般是10米,但对于我这种新手做测试,比起买一个几百块的多通道遥控器成本要低很多. 实验目的:用Android实现蓝牙连接通过Arduino串 ...

  9. 串口输出换行_stm32初学者必会操作----usart串口调试工具

    stm32初学者必会操作----usart串口调试工具 今天笔者介绍stm32初学者必会的工具 usart的串口设备. usart很重要,可以传输数据,可以检查代码的错误位置,查看输出数据. 下图就是 ...

  10. STM32串口输出字符串

    目录 串口 步骤 1.确定 IO 口并初始化 2.初始化 UATR 3.UART 中断配置 4.编写 UART 中断服务函数 5.1.方法一:重定向 fputc() 5.2.方法二:将字符串分割成一个 ...

最新文章

  1. spring 源码 找不到 taskprovider_一步一步构建Spring5源码
  2. 第四次作业,孙保平034
  3. Shall的变量功能
  4. 集成开发环境(IDE)
  5. opencv视频模糊处理
  6. MyTask - old implementation - getEntitySet
  7. C++知识分享之STL容器:set 容器与 map 容器的简单应用
  8. Java面试题:高并发环境下,jdk7 HashMap可能出现的致命问题。注意:是在jdk7与及以下版本
  9. MATLAB xlswrite 写数据 到 Excel文件
  10. 网管学习日记-MPLS-手工配置LSP
  11. PhotoShop 2022 mac版新增功能
  12. 关于分卷压缩文件打不开的问题
  13. 解决 nvcc: command not found
  14. 电路原理 第一章 电路模型和电路定律(一)
  15. 利用Python对非接触式IC卡的读写操作
  16. mysql strlength_mySQL教程 第7章 存储过程和函数
  17. cesium.js官网教程之中文版本~~~~第一篇
  18. Linux驱动开发: 杂项字符设备
  19. 图灵热点之阅读篇——七月图书推荐
  20. 饥荒开服(含各种踩雷)

热门文章

  1. 医院挂号系统代码_人脸识别+身份绑定!高科技精准打击医院号贩子
  2. python中base函数_详细的python basemap中各函数的所有参量注释
  3. 什么是运算计算机科学的基础概念,【软件设计师】笔记一:计算机科学基础知识...
  4. python练手经典100例项目-Python 的练手项目有哪些值得推荐?
  5. cocos creator使用anysdk接入admob广告教程
  6. 如何维持手机电池寿命_如何延长手机电池寿命?总有些事你不知道
  7. conventional-changelog 参数含义
  8. 父子组件传值——静态传值、动态传值
  9. 解决iText 5.0.1生成pdf,加入iTextAsian.jar 出现异常 Font 'STSong-Light' with 'UniGB-UCS2-H'...
  10. Excel VBA单元格数据自增1