标题:
STM32的BH1750程序
[打印本页]
作者:
@yy
时间:
2019-10-12 20:44
标题:
STM32的BH1750程序
单片机源程序如下:
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "usart.h"
#include "hard_i2c_driver.h"
#include "arc_lcd.h"
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
extern I2C_INIT_INFO I2C_Info; ///<I2C控制器相关信息
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
/**
* @brief 延时函数
* @param Time 延时时间参数
* @retval None
*/
void Delay(uint32_t Time)
{
while(Time--);
}
/**
* @brief 串口打印输出温度和湿度
* @param None
* @retval None
*/
int main(void)
{
uint8_t I2C_Data[10],ret;
uint8_t DataString[100];
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000); //重新映射中断向量表
SystemInit();//系统时钟初始化
USART_Configuration(115200);//串口1初始化
printf("\x0c\0");printf("\x0c\0");//超级终端清屏
printf("\033[1;40;32m");//设置超级终端背景为黑色,字符为绿色
printf("\r\n*******************************************************************************");
printf("\r\n************************ Copyright 2009-2012, ViewTool ************************");
printf("\r\n************************* viewtoolcom *************************");
printf("\r\n***************************** All Rights Reserved *****************************");
printf("\r\n*******************************************************************************");
printf("\r\n");
ARC_LCD_Init();//初始化LCD
ARC_LCD_Clear(LCD_COLOR_BLACK);
//根据BH1750FVI传感器设置I2C初始化数据
I2C_Info.controlMode = 1;//硬件控制
I2C_Info.speed=100000;//100K
I2C_Info.subAddrMode=2;//无子地址模式
I2C_Info.subAddrWidth=0;//子地址为0字节宽度
I2C_Info.slaveAddr=0x46;//BH1750FVI传感器I2C地址
I2C_Info.channel=1;//使用I2C2
VT_I2C_HardInit(&I2C_Info);
I2C_Data[0]=0x01;
VT_I2C_HardWriteNByte(I2C2,0,I2C_Data,1);//传感器芯片上电命令
while(1)
{
I2C_Data[0]=0x11;
ret = VT_I2C_HardWriteNByte(I2C2,0,I2C_Data,1);//发送测量命令
if(ret){
printf("I2C写数据错误 %d\n\r",ret);
}
Delay(3000000);//等待大于120ms,必须加这个延时,否则传感器没准备好数据会出现读数据错误
ret = VT_I2C_HardReadNByte(I2C2,0,I2C_Data,2);//读取光照强度值
if(ret){
printf("I2C读数据错误 %d\n\r",ret);
}else{
printf("光强度:%f lx\n\r",((I2C_Data[0]<<8)+I2C_Data[1])/(1.2*2));
sprintf((char *)DataString,"%0.1f",((I2C_Data[0]<<8)+I2C_Data[1])/(1.2*2));
ARC_LCD_DispMyString(0,70,DataString);//将测得的温度值在LCD上显示
}
Delay(1000000);
}
}
#ifdef USE_FULL_ASSERT
/**
* @brief 报告在检查参数发生错误时的源文件名和错误行数
* @param file 源文件名
* @param line 错误所在行数
* @retval None
*/
void assert_failed(uint8_t* file, uint32_t line)
{
/* 用户可以增加自己的代码用于报告错误的文件名和所在行数,
例如:printf("错误参数值: 文件名 %s 在 %d行\r\n", file, line) */
/* 无限循环 */
while (1)
{
}
}
#endif
/*********************************END OF FILE**********************************/
复制代码
所有资料51hei提供下载:
光照.7z
(732.92 KB, 下载次数: 54)
2019-10-12 21:56 上传
点击文件名下载附件
32的BH1750程序
下载积分: 黑币 -5
作者:
admin
时间:
2019-10-12 23:47
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
作者:
@yy
时间:
2019-10-13 21:25
#include "BH1750.h"
#include "stdio.h"
uchar BUF[8];
int mcy;
uint date[4];
uint dis_data;
void GPIOConfig(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Pin = sda | scl;
void Delay_5us(void)
{
uint16_t i=0;
uint16_t timer = 5;
while(timer--)
{
i=10;
while(i--);
}
}
void Delay_mms(uint16_t tmp)
{
uint16_t i=0;
while(tmp--)
{
i=12000;
while(i--);
}
}
void BH1750_Start()
{
GPIO_SetBits(GPIOB, sda);
GPIO_SetBits(GPIOB, scl);
Delay_5us();
GPIO_ResetBits(GPIOB, sda);
Delay_5us();
}
void BH1750_Stop()
{
GPIO_ResetBits(GPIOB, scl);
GPIO_ResetBits(GPIOB, sda);
GPIO_SetBits(GPIOB, scl);
Delay_5us();
GPIO_SetBits(GPIOB, sda);
Delay_5us();
}
void BH1750_SendACK(int ack)
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Pin = sda;
GPIO_Init(GPIOB, &GPIO_InitStruct);
if(ack == 1)
GPIO_SetBits(GPIOB, sda);
else if(ack == 0)
GPIO_ResetBits(GPIOB, sda);
else
return;
GPIO_SetBits(GPIOB, scl);
Delay_5us();
GPIO_ResetBits(GPIOB, scl);
Delay_5us();
}
int BH1750_RecvACK()
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Pin = sda;
GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIO_SetBits(GPIOB, scl);
Delay_5us();
if(GPIO_ReadInputDataBit( GPIOB, sda ) ==1 )
mcy = 1 ;
else
mcy = 0 ;
GPIO_ResetBits(GPIOB, scl);
Delay_5us();
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init( GPIOB, &GPIO_InitStruct );
return mcy;
}
void BH1750_SendByte(uchar dat)
{
uchar i;
for (i=0; i<8; i++)
{
if( 0X80 & dat )
GPIO_SetBits( GPIOB, sda);
else
GPIO_ResetBits( GPIOB, sda);
dat <<= 1;
GPIO_SetBits(GPIOB, scl);
Delay_5us();
GPIO_ResetBits(GPIOB, scl);
Delay_5us();
}
BH1750_RecvACK();
}
uchar BH1750_RecvByte()
{
uchar i;
uchar dat = 0;
uchar bit;
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStruct.GPIO_Pin = sda;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init( GPIOB, &GPIO_InitStruct );
GPIO_SetBits( GPIOB, sda);
for (i=0; i<8; i++)
{
dat <<= 1;
GPIO_SetBits( GPIOB, scl);
Delay_5us();
if( SET == GPIO_ReadInputDataBit( GPIOB, sda ) )
bit = 0X01;
else
bit = 0x00;
dat |= bit;
GPIO_ResetBits( GPIOB, scl);
Delay_5us();
}
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init( GPIOB, &GPIO_InitStruct );
return dat;
}
void Single_Write_BH1750(uchar REG_Address)
{
BH1750_Start();
BH1750_SendByte(SlaveAddress);
BH1750_SendByte(REG_Address);
// BH1750_SendByte(REG_data);
BH1750_Stop();
}
void Init_BH1750()
{
//Single_Write_BH1750(0x01);
Single_Write_BH1750(0x01);
Single_Write_BH1750(0x10);
Delay_mms(180);
}
void mread(void)
{
uchar i;
BH1750_Start();
BH1750_SendByte(SlaveAddress+1);
for (i=0; i<3; i++)
{
BUF[i] = BH1750_RecvByte();
dis_data=BUF[i];
date[i]=(dis_data<<8)+BUF[i];
if (i == 3)
{
BH1750_SendACK(1);
}
else
{
BH1750_SendACK(0);
}
Delay_mms(5);
}
date[0]=(date[0]+date[1]+date[2])/3;
BH1750_Stop();
Delay_mms(5);
}
BH1750光强传感器.pdf
2019-10-13 21:11 上传
点击文件名下载附件
下载积分: 黑币 -5
433.63 KB, 下载次数: 12, 下载积分: 黑币 -5
模块详细资料
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1