123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215 |
- #include "bh1750.h"
- #include "public.h"
- #define bh1750_SlaveAddress 0x46
- unsigned char bh1750_buffer[4]={0};
- //void system_delay_us(unsigned int n);
- //void system_delay_ms(int x);
- /***************************************************************
- ** 功能: IIC端口初始化
- ** 参数: 无参数
- ** 返回值: 无
- ****************************************************************/
- void BH1750IO_Init(void)
- {
- BH1750_SCL_PIN_OUT();
- BH1750_SDA_PIN_OUT();
- }
- /***************************************************************
- ** 功能: 产生IIC起始信号
- ** 参数: 无参数
- ** 返回值: 无
- ****************************************************************/
- void BH1750_Start(void)
- {
- BH1750_SDA_PIN_OUT(); //sda线输出
- SETSDA;
- SETSCL;
- system_delay_us(4);
- CLRSDA;//START:when CLK is high,DATA change form high to low
- system_delay_us(4);
- CLRSCL;//钳住I2C总线,准备发送或接收数据
- }
- /***************************************************************
- ** 功能: 产生IIC停止信号
- ** 参数: 无参数
- ** 返回值: 无
- ****************************************************************/
- void BH1750_Stop(void)
- {
- BH1750_SDA_PIN_OUT();///sda线输出
- CLRSDA;//STOP:when CLK is high DATA change form low to high
- SETSCL;
- system_delay_us(4);
- SETSDA;//发送I2C总线结束信号
- system_delay_us(4);
- }
- /***************************************************************
- ** 功能: 产生IIC应答信号
- ** 参数: 无参数
- ** 返回值: 无
- ****************************************************************/
- void BH1750_SendACK(unsigned char ack)
- {
- BH1750_SDA_PIN_OUT(); //sda线输出
- if(ack)
- {
- SETSDA; //写应答信号
- }
- else
- {
- CLRSDA;
- }
- SETSCL; //拉高时钟线
- system_delay_us(2); //延时
- CLRSCL; //拉低时钟线
- system_delay_us(2); //延时
- }
- /***************************************************************
- ** 功能: 产生IIC接收信号
- ** 参数: 无参数
- ** 返回值: 无
- ****************************************************************/
- unsigned char BH1750_RecvACK(void)
- {
- unsigned char data;
- BH1750_SDA_PIN_IN(); //SDA设置为输入
- SETSCL; //拉高时钟线
- system_delay_us(2); //延时
- data = READ_SDA; //读应答信号
- CLRSCL; //拉低时钟线
- system_delay_us(2); //延时
- return data;
- }
- /***************************************************************
- ** 功能: 向IIC总线发送一个字节数据
- ** 参数: dat:一字节数据
- ** 返回值: 无
- ****************************************************************/
- void BH1750_SendByte(unsigned char dat)
- {
- unsigned char i,bit;
- BH1750_SDA_PIN_OUT();
- for (i=0; i<8; i++)
- {
- bit=dat&0x80;
- if(bit)
- {
- SETSDA;
- }
- else
- CLRSDA;
- dat <<= 1;
- SETSCL;
- system_delay_us(2);
- CLRSCL;
- system_delay_us(2);
- }
- BH1750_RecvACK();
- }
- /***************************************************************
- ** 功能: 从IIC总线接收一个字节数据
- ** 参数: 无参数
- ** 返回值: dat:接收一字节数据
- ****************************************************************/
- unsigned char BH1750_RecvByte(void)
- {
- unsigned char i;
- unsigned char dat = 0;
- unsigned char a;
- BH1750_SDA_PIN_IN(); //SDA设置为输入
- SETSDA;
- for(i=0; i<8; i++)
- {
- dat <<= 1;
- SETSCL;
- system_delay_us(2);
- a=READ_SDA;
- if(a==1)dat+=1;
- CLRSCL;
- system_delay_us(2);
- }
- return dat;
- }
- /***************************************************************
- ** 功能: 向bh1750写入命令
- ** 参数: 无参数
- ** 返回值: 无
- ****************************************************************/
- void Single_Write_BH1750( unsigned char REG_Address)
- {
- BH1750_Start(); //起始信号
- BH1750_SendByte(bh1750_SlaveAddress); //发送设备地址+写信号
- BH1750_SendByte(REG_Address); //内部寄存器地址,
- BH1750_Stop(); //发送停止信号
- }
- /***************************************************************
- ** 功能: 连续读出BH1750内部数据
- ** 参数: 无参数
- ** 返回值: 无
- ****************************************************************/
- void Multiple_Read_BH1750(void)
- {
- unsigned char i;
- BH1750_Start(); //起始信号
- BH1750_SendByte(bh1750_SlaveAddress+1); //发送设备地址+读信号
- for(i=0; i<3; i++) //连续读取2个地址数据,存储中BUF
- {
- bh1750_buffer[i] = BH1750_RecvByte(); //bh1750_buffer[0]存储0x32地址中的数据
- if(i == 3)
- {
- BH1750_SendACK(1); //最后一个数据需要回NOACK
- }
- else
- {
- BH1750_SendACK(0); //回应ACK
- }
- }
- BH1750_Stop(); //停止信号
- }
- /***************************************************************
- ** 功能: 初始化BH1750
- ** 参数: 无参数
- ** 返回值: 无
- ****************************************************************/
- void BH1750_Init()
- {
- BH1750IO_Init();
- Single_Write_BH1750(0x01);
- //CLRADDR; //将ADDR位初始化拉低
- }
- /***************************************************************
- ** 功能: 读取光照度
- ** 参数: 无参数
- ** 返回值: data:返回光照度值
- ****************************************************************/
- unsigned int get_bh1750_value(void)
- {
- static float temp_a;
- unsigned int data_a;
- int dis_data1 ;
- Single_Write_BH1750(0x01); // power on
- Single_Write_BH1750(0x10); // H- resolution mode
- system_delay_ms(200); //延时200ms
- Multiple_Read_BH1750(); //连续读出数据,存储在BUF中
- system_delay_ms(150);
- dis_data1=bh1750_buffer[0];
- dis_data1=(dis_data1<<8)+bh1750_buffer[1];//合成数据,即光照数据
- temp_a=(float)dis_data1/1.2;
- data_a=(int)temp_a;
- return data_a;
- }
|