标题:
stm32mini+bh1750测光照源程序
[打印本页]
作者:
Tracytra
时间:
2020-5-27 04:13
标题:
stm32mini+bh1750测光照源程序
基于stm32mini实现bh1750测光照。
串口通信,波特率9600
接线说明:
SDA <-> PA3
SCL <-> PA2
VCC <-> VCC
GND <-> GND
ADDR <-> GND (取决于slave address )这里接地
main.c文件如下:
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "BH1750.h"
#include "lcd.h"
int main(void)
{
// float light;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
delay_init(); //延时函数初始化
uart_init(9600); //串口初始化为9600
LED_Init(); //初始化与LED连接的硬件接口
Init_BH1750(); //初始化BH1750
LCD_Init(); //初始化LED
LCD_Clear(WHITE); //清屏
while(1)
{
// light=read_BH1750(); //读取BH1750的光强数据
extern float temp_integer;
extern float temp_fractions;
read_BH1750();
LCD_ShowString(20,50,72,12,12,"light:");
LCD_ShowNum(60,50,temp_integer,4,12);
LCD_ShowString(84,50,12,12,12,".");
LCD_ShowNum(90,50,temp_fractions,2,12);
LCD_ShowString(110,50,12,12,12,"lx");
if(temp_integer<100)
{
LED1=0;
LCD_ShowString(50,2,72,12,12,"LED-ON");
}
else
{
LED1=1;
LCD_ShowString(50,2,72,12,12,"LED-OFF");
}
}
}
复制代码
bh1750.c如下:
/**************************************************************************
* 文件名 :bh1750.c
* 描述 :光强传感模块
****************************************************************************/
#include "BH1750.h"
#include "delay.h"
#include "lcd.h"
float temp_integer;
float temp_fractions;
uchar BUF[8]; //接收数据缓存区
int mcy; //进位标志
/***开始信号***/
void BH1750_Start()
{
SDA=1; //拉高数据线
SCL=1; //拉高时钟线
delay_us(5); //延时
GPIO_ResetBits(bh1750_PORT, sda); //产生下降沿
delay_us(5); //延时
GPIO_ResetBits(bh1750_PORT, scl); //拉低时钟线
}
/*****停止信号******/
void BH1750_Stop()
{
SDA=0; //拉低数据线
SCL=1; //拉高时钟线
delay_us(5); //延时
GPIO_SetBits(bh1750_PORT, sda); //产生上升沿
delay_us(5); //延时
}
/**************************************
发送应答信号
入口参数:ack (0:ACK 1:NAK)
**************************************/
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(bh1750_PORT, &GPIO_InitStruct);
if(ack == 1) //写应答信号
SDA=1;
else if(ack == 0)
SDA=0;
else
return;
SCL=1; //拉高时钟线
delay_us(5); //延时
SCL=0; //拉低时钟线
delay_us(5); //延时
}
/**************************************
接收应答信号
**************************************/
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(bh1750_PORT,&GPIO_InitStruct);
SCL=1; //拉高时钟线
delay_us(5); //延时
if(GPIO_ReadInputDataBit(GPIOA,sda)==1)//读应答信号
mcy = 1 ;
else
mcy = 0 ;
SCL=0; //拉低时钟线
delay_us(5); //延时
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(bh1750_PORT,&GPIO_InitStruct);
return mcy;
}
/**************************************
向IIC总线发送一个字节数据
**************************************/
void BH1750_SendByte(uchar dat)
{
uchar i;
for (i=0; i<8; i++) //8位计数器
{
if( 0X80 & dat )
GPIO_SetBits(bh1750_PORT,sda);
else
GPIO_ResetBits(bh1750_PORT,sda);
dat <<= 1;
SCL=1; //拉高时钟线
delay_us(5); //延时
SCL=0; //拉低时钟线
delay_us(5); //延时
}
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(bh1750_PORT,&GPIO_InitStruct );
GPIO_SetBits(bh1750_PORT,sda); //使能内部上拉,准备读取数据,
for (i=0; i<8; i++) //8位计数器
{
dat <<= 1;
SCL=1; //拉高时钟线
delay_us(5); //延时
if( SET == GPIO_ReadInputDataBit(bh1750_PORT,sda))
bit = 0X01;
else
bit = 0x00;
dat |= bit; //读数据
SCL=0; //拉低时钟线
delay_us(5); //延时
}
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(bh1750_PORT, &GPIO_InitStruct );
return dat;
}
void Single_Write_BH1750(uchar REG_Address)
{
BH1750_Start(); //起始信号
BH1750_SendByte(SlaveAddress); //发送设备地址+写信号
BH1750_SendByte(REG_Address); //内部寄存器地址,请参考中文pdf22页
// BH1750_SendByte(REG_data); //内部寄存器数据,请参考中文pdf22页
BH1750_Stop(); //发送停止信号
}
//初始化BH1750,根据需要请参考pdf进行修改****
void Init_BH1750()
{
GPIO_InitTypeDef GPIO_InitStruct;
/*开启GPIOB的外设时钟*/
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Pin = sda | scl ;
GPIO_Init(bh1750_PORT,&GPIO_InitStruct);
Single_Write_BH1750(0x01);
delay_ms(180); //延时180ms
}
//连续读出BH1750内部数据
void mread(void)
{
uchar i;
BH1750_Start(); //起始信号
BH1750_SendByte(SlaveAddress+1); //发送设备地址+读信号
for (i=0; i<3; i++) //连续读取6个地址数据,存储中BUF
{
BUF[i] = BH1750_RecvByte(); //BUF[0]存储0x32地址中的数据
if (i == 3)
{
BH1750_SendACK(1); //最后一个数据需要回NOACK
}
else
{
BH1750_SendACK(0); //回应ACK
}
}
BH1750_Stop(); //停止信号
delay_ms(5);
}
void read_BH1750(void)
{
int dis_data; //变量
// float temp_integer;
// float temp_fractions;
Single_Write_BH1750(0x01); // power on
Single_Write_BH1750(0x10); // H- resolution mode
delay_ms(180); //延时180ms
mread(); //连续读出数据,存储在BUF中
dis_data=BUF[0];
dis_data=(dis_data<<8)+BUF[1]; //合成数据
temp_integer=dis_data/1.2;
temp_fractions=10*dis_data/1.2;
temp_fractions=(int)temp_fractions%10;
// return temp_integer;
}
复制代码
bh1750.h文件如下
#ifndef __BH1750_H__
#define __BH1750_H__
#include "sys.h"
#define uchar unsigned char
#define uint unsigned int
#define SDA PAout(3)
#define SCL PAout(2)
#define sda GPIO_Pin_3
#define scl GPIO_Pin_2
#define bh1750_PORT GPIOA
#define SlaveAddress 0x46 //定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改
//ALT ADDRESS引脚接地时地址为0x46,接电源时地址为0xB8
extern uchar BUF[8]; //接收数据缓存区
extern int dis_data; //变量
extern int mcy; //表示进位标志位
void Init_BH1750(void);
void conversion(uint temp_data);
void Single_Write_BH1750(uchar REG_Address);//单个写入数据
uchar Single_Read_BH1750(uchar REG_Address); //单个读取内部寄存器数据
void mread(void); //连续的读取内部寄存器数据
void read_BH1750(void);
#endif
复制代码
全部程序51hei下载地址:
bh1750程序.7z
(262.93 KB, 下载次数: 68)
2020-5-27 14:29 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
yy3900636
时间:
2020-6-5 10:30
多谢楼主,这里正好有用
作者:
wyqf
时间:
2021-12-6 22:05
感谢楼主,实测可用
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1