这是我前段时间调的光照模块,感觉还行,基本使用一下没问题,代码在压缩包里
单片机源程序如下:
- #include "sys.h"
- #include "delay.h"
- #include "usart.h"
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include "stm32f4xx.h"
- #include "BH1750.h"
- u8 t;
- u8 len;
- u16 times=0;
- unsigned char BUF[8]; /* 读取光强中间量 */
- int dis_data; /* 读取光强中间量 */
- int mcy; /* 读取光强中间量 */
- float lightPower; /* 存储光强的变量 */
- extern struct ds1302time time; /* 1302时间 */
- char xianshi[30];
- u8 tmp_buf[33]; /* 24l02接受buf */
- int main( void )
- {
- u8 t = 0;
- NVIC_PriorityGroupConfig( NVIC_PriorityGroup_2 ); /* 设置NVIC中断分组2:2位抢占优先级,2位响应优先级 */
- delay_init(168); /* 延时函数初始化 */
- uart_init( 115200 ); /* uart */
- Init_BH1750(); /* init BH1750 */
- while ( 1 )
- {
-
- delay_ms( 5 );
- t++;
- if ( t > 40 )
- {
-
- mread(); /* 连续读取gy30数据 */
- dis_data = BUF[0];
- dis_data = (dis_data << 8) + BUF[1]; /* 合成数据 */
- lightPower = (float) dis_data / 1.2; /* 得出光强 单位是lx */
- Single_Write_BH1750( 0x01 ); /* power on */
- Single_Write_BH1750( 0x10 ); /* H- resolution mode */
- t = 0;
- if(USART_RX_STA&0x8000)
- {
- len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
- for(t=0;t<len;t++)
- {
- USART_SendData(USART1, USART_RX_BUF[t]); //向串口2发送数据
- while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
- }
- printf("\r\n lightPower:%f",lightPower);//插入换行
- USART_RX_STA=0;
- delay_ms(5);
- }
- }
-
-
- }
- }
复制代码- #include "BH1750.h"
- void GPIOConfig( void )
- {
- GPIO_InitTypeDef GPIO_InitStruct;
- /*开启GPIOB的外设时钟*/
- RCC_AHB1PeriphClockCmd ( RCC_AHB1Periph_GPIOB, ENABLE );
- GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
- GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
- GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStruct.GPIO_Pin = sda | scl;
- GPIO_Init( GPIOB, &GPIO_InitStruct );
- }
- void Delay_5us( void )
- {
- delay_us(5);
- }
- void Delay_mms( unsigned int tmp )
- {
- unsigned int i = 0;
- while ( tmp-- )
- {
- delay_us(5);
- }
- }
- /***开始信号***/
- void BH1750_Start()
- {
- GPIO_SetBits( GPIOB, sda ); /* 拉高数据线 */
- GPIO_SetBits( GPIOB, scl ); /* 拉高时钟线 */
- Delay_5us(); /* 延时 */
- GPIO_ResetBits( GPIOB, sda ); /* 产生下降沿 */
- Delay_5us(); /* 延时 */
- GPIO_ResetBits( GPIOB, scl ); /* 拉低时钟线 */
- }
- /*****停止信号******/
- void BH1750_Stop()
- {
- GPIO_ResetBits( GPIOB, sda ); /* 拉低数据线 */
- GPIO_SetBits( GPIOB, scl ); /* 拉高时钟线 */
- Delay_5us(); /* 延时 */
- GPIO_SetBits( GPIOB, sda ); /* 产生上升沿 */
- Delay_5us(); /* 延时 */
- }
- /**************************************
- * 发送应答信号
- * 入口参数:ack (0:ACK 1:NAK)
- **************************************/
- void BH1750_SendACK( unsigned int ack )
- {
- GPIO_InitTypeDef GPIO_InitStruct;
- GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
- GPIO_InitStruct.GPIO_OType=GPIO_OType_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(); /* 延时 */
- }
- /**************************************
- * 接收应答信号
- **************************************/
- unsigned int BH1750_RecvACK()
- {
- GPIO_InitTypeDef GPIO_InitStruct;
- GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN; /*这里一定要设成输入上拉,否则不能读出数据*/
- GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;
- 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;
- GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
- GPIO_Init( GPIOB, &GPIO_InitStruct );
- return(mcy);
- }
- /**************************************
- * 向IIC总线发送一个字节数据
- **************************************/
- void BH1750_SendByte( unsigned char dat )
- {
- unsigned char i;
- for ( i = 0; i < 8; i++ ) /* 8位计数器 */
- {
- 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();
- }
- unsigned char BH1750_RecvByte()
- {
- unsigned char i;
- unsigned char dat = 0;
- unsigned char bit;
- GPIO_InitTypeDef GPIO_InitStruct;
- GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN; /*这里一定要设成输入上拉,否则不能读出数据*/
- GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;
- 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++ ) /* 8位计数器 */
- {
- 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;
- GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
- GPIO_Init( GPIOB, &GPIO_InitStruct );
- return(dat);
- }
- void Single_Write_BH1750( unsigned char REG_Address )
- {
- BH1750_Start(); /* 起始信号 */
- BH1750_SendByte( SlaveAddress ); /* 发送设备地址+写信号 */
- BH1750_SendByte( REG_Address ); /* 内部寄存器地址,请参考中文pdf22页 */
- /* BH1750_SendByte(REG_data); //内部寄存器数据,请参考中文pdf22页 */
- BH1750_Stop(); /* 发送停止信号 */
- }
- /* 初始化BH1750,根据需要请参考pdf进行修改**** */
- void Init_BH1750()
- {
- GPIOConfig();
- Single_Write_BH1750( 0x01 );
- }
- /* 连续读出BH1750内部数据 */
- void mread( void )
- {
- unsigned char 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_mms( 5 );
- }
复制代码
所有资料51hei提供下载:
GY-30_f407.7z
(301.84 KB, 下载次数: 53)
|