#ifndef __LIGHT_H
#define __LIGHT_H#include "system.h"
#include "delay.h"//IO方向设置
#define SDA_IN()  {IIC_SDA_GPIO_Port->CRH&=0XFFFFFF0F;IIC_SDA_GPIO_Port->CRH|=(u32)8<<4;}
#define SDA_OUT() {IIC_SDA_GPIO_Port->CRH&=0XFFFFFF0F;IIC_SDA_GPIO_Port->CRH|=(u32)3<<4;}#define IIC_SCL    PCout(8) //SCL
#define IIC_SDA    PCout(9) //SDA
#define READ_SDA   PCin(9)  //输入SDA
#define ADDR 0x23           //0100011#define BHAddWrite     0x46      // 从机地址+最后写方向位
#define BHAddRead      0x47      // 从机地址+最后读方向位
#define BHPowDown      0x00      // 关闭模块
#define BHPowOn        0x01      // 打开模块等待测量指令
#define BHReset        0x07      // 重置数据寄存器值在PowerOn模式下有效
#define BHModeH1       0x10      // 高分辨率 单位1lx 测量时间120ms
#define BHModeH2       0x11      // 高分辨率模式2 单位0.5lx 测量时间120ms
#define BHModeL        0x13      // 低分辨率 单位4lx 测量时间16ms
#define BHSigModeH     0x20      // 一次高分辨率 测量 测量后模块转到 PowerDown模式
#define BHSigModeH2    0x21      // 同上类似
#define BHSigModeL     0x23      // 上类似void Single_Write_BH1750(u8 REG_Address);
void Light_Init(void);
void bh_data_send(u8 command);
u16 bh_data_read(void);//IIC所有操作函数
void IIC_Init(void);                //初始化IIC的IO口
void IIC_Start(void);               //发送IIC开始信号
void IIC_Stop(void);                //发送IIC停止信号
void IIC_Send_Byte(u8 txd);         //IIC发送一个字节
u8 IIC_Read_Byte(u8 ack);           //IIC读取一个字节
u8 IIC_Wait_Ack(void);              //IIC等待ACK信号
void IIC_Ack(void);                 //IIC发送ACK信号
void IIC_NAck(void);                //IIC不发送ACK信号void IIC_Write_One_Byte(u8 daddr,u8 addr,u8 data);
u8 IIC_Read_One_Byte(u8 daddr,u8 addr);#endif
#include "bh1750.h"void Single_Write_BH1750(u8 REG_Address)
{IIC_Start();                  // 起始信号IIC_Send_Byte(BHAddWrite);    // 发送设备地址+写信号IIC_Send_Byte(REG_Address);   // 内部寄存器地址,
//  BH1750_SendByte(REG_data);       // 内部寄存器数据,IIC_Stop();                   // 发送停止信号
}void Light_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};// 使能GPIOD时钟__HAL_RCC_GPIOD_CLK_ENABLE();// PD6和7引脚置高HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14|GPIO_PIN_15, GPIO_PIN_SET);// 初始化引脚GPIO_InitStruct.Pin = GPIO_PIN_14|GPIO_PIN_15;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);Single_Write_BH1750(0x01);bh_data_send(BHPowOn);bh_data_send(BHReset);bh_data_send(BHModeL);          //选择的是分辨率是4lx,测量时间是16ms的delay_ms(180);
}//产生IIC起始信号
void IIC_Start(void)
{SDA_OUT();     //sda线输出IIC_SDA=1;IIC_SCL=1;delay_us(4);IIC_SDA=0;//START:when CLK is high,DATA change form high to lowdelay_us(4);IIC_SCL=0;//钳住I2C总线,准备发送或接收数据
}//产生IIC停止信号
void IIC_Stop(void)
{SDA_OUT();//sda线输出IIC_SCL=0;IIC_SDA=0;//STOP:when CLK is high DATA change form low to highdelay_us(4);IIC_SCL=1;IIC_SDA=1;//发送I2C总线结束信号delay_us(4);
}//等待应答信号到来
//返回值:1,接收应答失败
//        0,接收应答成功
u8 IIC_Wait_Ack(void)
{u8 ucErrTime=0;SDA_IN();      //SDA设置为输入IIC_SDA=1;delay_us(1);IIC_SCL=1;delay_us(1);while(READ_SDA){ucErrTime++;if(ucErrTime>250){IIC_Stop();return 1;}}IIC_SCL=0;//时钟输出0return 0;
}//产生ACK应答
void IIC_Ack(void)
{IIC_SCL=0;SDA_OUT();IIC_SDA=0;delay_us(2);IIC_SCL=1;delay_us(2);IIC_SCL=0;
}//不产生ACK应答
void IIC_NAck(void)
{IIC_SCL=0;SDA_OUT();IIC_SDA=1;delay_us(2);IIC_SCL=1;delay_us(2);IIC_SCL=0;
}//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答
void IIC_Send_Byte(u8 txd)
{u8 t;SDA_OUT();IIC_SCL=0;//拉低时钟开始数据传输for(t=0; t<8; t++){//IIC_SDA=(txd&0x80)>>7;if((txd&0x80)>>7)IIC_SDA=1;elseIIC_SDA=0;txd<<=1;delay_us(2);   //对TEA5767这三个延时都是必须的IIC_SCL=1;delay_us(2);IIC_SCL=0;delay_us(2);}
}//读1个字节,ack=1时,发送ACK,ack=0,发送nACK
u8 IIC_Read_Byte(unsigned char ack)
{unsigned char i,receive=0;SDA_IN();//SDA设置为输入for(i=0; i<8; i++ ){IIC_SCL=0;delay_us(2);IIC_SCL=1;receive<<=1;if(READ_SDA)receive++;delay_us(1);}if (!ack)IIC_NAck();//发送nACKelseIIC_Ack(); //发送ACKreturn receive;
}void bh_data_send(u8 command)
{do{IIC_Start();                      //iic起始信号IIC_Send_Byte(BHAddWrite);       //发送器件地址}while(IIC_Wait_Ack());            //等待从机应答IIC_Send_Byte(command);          //发送指令IIC_Wait_Ack();                   //等待从机应答IIC_Stop();                       //iic停止信号
}u16 bh_data_read(void)
{u16 buf;IIC_Start();                       //iic起始信号IIC_Send_Byte(BHAddRead);         //发送器件地址+读标志位IIC_Wait_Ack();                     //等待从机应答buf=IIC_Read_Byte(1);              //读取数据buf=buf<<8;                        //读取并保存高八位数据buf+=0x00ff&IIC_Read_Byte(0);      //读取并保存第八位数据IIC_Stop();                        //发送停止信号return buf;
}

STM32 HAL库BH1750光强检测器驱动代码相关推荐

  1. [stm32 HAL库] RTC和BKP驱动

    CubeMX 配置 打开外部时钟 激活时钟和日历 更改RCC时钟为外部低速时钟 以上在CubeMX中的配置就已经完成,点击生成代码即可. 4.这里我需要使用串口进行调试,因此打开了串口一 工程修改 以 ...

  2. HIH8121(HIH8000系列)温湿度传感器驱动代码-基于STM32 HAL库

    HIH8121温湿度传感器代码基于STM32 HAL库 HIH8121传感器简介 驱动代码.c 驱动代码.h main函数 HIH8121传感器简介 HIH8121是霍尼韦尔公司生产的测量温湿度参数一 ...

  3. STM32 HAL库PID控制电机 第二章 TB6612FNG芯片驱动GB37-520电机

    STM32 HAL库PID控制电机 第二章 TB6612FNG芯片驱动GB37-520电机(HAL库) 1 电路图 2 TB6612简介 TB6612是双驱动,可同时驱动两个电机 STBY:接单片机的 ...

  4. VL6810X驱动 距离和光线传感器 stm32 HAL库

    VL6810X驱动 距离和光线传感器 stm32 HAL库 代码 库文件和官方文档 注意事项 1. 2. 3. 这是一款ST出品的传感器,感觉用的人不多 网上没什么驱动代码,所以自己根据st的官方资料 ...

  5. STM32 HAL库 驱动 MT6701 磁编码器

    写在前面: MT6701 是 MagnTek 推出的新一代基于差分霍尔感应原理的磁性角度编码器芯片.值得一提的是 MT6701不仅提供 0~360° 的角度信号,而且还提供了一个"按压&qu ...

  6. 【春节歌曲回味 | STM32小音乐盒 】PWM+定时器驱动无源蜂鸣器(STM32 HAL库)

    l  STM32通过PWM与定时器方式控制无源蜂鸣器鸣响 l  STM32小音乐盒,歌曲进度条图形显示与百分比显示,歌曲切换 l  编程使用STM32 HAL库 l  IIC OLED界面编程,动画实 ...

  7. 基于STM32 HAL库的遥控小车

    目录 前言 一.材料清单 二.系统概述 三.硬件设计 1.HC-SR04超声波模块 2.HC-05/06蓝牙模块 3.L298n电机驱动模块 四.代码 1.引脚设置 2.遥控部分 3.超声波报警部分 ...

  8. 温湿度传感器驱动SHT85 单片机STM32 HAL库

    功能介绍:读取传感器SHT85数据,转换成温度.湿度 .饱和水蒸气含量. 注意事项: SDA脚设置为开漏输出,外部上拉电阻10k.或者设置成推挽,软件切换SDA输入输出. 调试时可适当加长延时时间. ...

  9. STM32 HAL库学习笔记1-HAL库简介

    STM32 HAL库学习笔记1-HAL库简介 HAL库 SPL 库 和 HAL 库两者相互独立,互不兼容.几种库的比较如下 目前几种库对不同芯片的支持情况如下 ST 中文官网上有一篇<关于ST库 ...

最新文章

  1. iRank: 基于互联网类脑架构的阿尔法鹰眼发展趋势评估
  2. sql server修改索引名称_索引基本知识和索引优化
  3. 构建高性能ASP.NET站点 网站优化需要考虑的方面
  4. SQL Server聚集索引的选择
  5. 纪·阿晶的首次AWS之行!
  6. python2 使用matplotlib
  7. Spring Boot 应用监控
  8. 2020 Pwn2Own东京大赛落幕,Master of Pwn 诞生
  9. mqtt之C++编译
  10. W5500调试的部分问题和注意点
  11. mysql注入转义绕过_SQL注入防御绕过
  12. Android 11适配指南之系统相机拍照、打开相册
  13. Python分析【崩坏学园2】凝魔纹心所输出
  14. 南丁格尔图文字颜色跟随
  15. 黑马day15作业2,3
  16. python scapy 抓包_python+scapy 抓包与解析
  17. 完美解决网页中Flash狂闪的问题
  18. 计算机网络第三章——数据链路层
  19. TypeError: can‘t subtract offset-naive and offset-aware datetimes
  20. 工作流之activiti6新手上路

热门文章

  1. 二维码活码源码(含数据库脚本)
  2. java中 enum什么意思_enum在java中是什么意思
  3. Linux的用户和用户组
  4. 水星路由app服务器无响应,手机登录不了水星路由器的管理界面解决方法
  5. 人人网登录并写留言板(Requests,js逆向)
  6. 第二类换元法之倒代换习题
  7. 劳务员培训建筑八大员培训劳务员对劳务分包企业管理的建议
  8. 打印机150nw报错不能打印
  9. 数学物理方法·复数/模/辐角引导题目
  10. mysql怎么查询借阅相同图书_MySQL查询练习2