基于stm32mini实现bh1750测光照。
串口通信,波特率9600
接线说明:
SDA <-> PA3
SCL <-> PA2
VCC <-> VCC
GND <-> GND
ADDR <-> GND (取决于slave address )这里接地
完整源码
stm32_bh1750测光照程序.7z
(262.93 KB, 售价: 1 E币)
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
复制代码
【必读】版权免责声明
1、本主题所有言论和内容纯属会员个人意见,与本论坛立场无关。2、本站对所发内容真实性、客观性、可用性不做任何保证也不负任何责任,网友之间仅出于学习目的进行交流。3、对提供的数字内容不拥有任何权利,其版权归原著者拥有。请勿将该数字内容进行商业交易、转载等行为,该内容只为学习所提供,使用后发生的一切问题与本站无关。 4、本网站不保证本站提供的下载资源的准确性、安全性和完整性;同时本网站也不承担用户因使用这些下载资源对自己和他人造成任何形式的损失或伤害。 5、本网站所有软件和资料均为网友推荐收集整理而来,仅供学习用途使用,请务必下载后两小时内删除,禁止商用。6、如有侵犯你版权的,请及时联系我们(电子邮箱1370723259@qq.com)指出,本站将立即改正。
|
|