123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236 |
- #include <REG52.h>
- //#include <math.h> //Keil library
- #include <BH1750.h> //Keil library
- #include <INTRINS.H>
- #define SlaveAddress 0x46 //定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改
- //ALT ADDRESS引脚接地时地址为0x46,接电源时地址为0xB8
- typedef unsigned char BYTE;
- typedef unsigned short WORD;
- BYTE BUF[8]; //接收数据缓存区
- // uchar ge,shi,bai,qian,wan; //显示变量
- //int dis_data; //变量
- void IICdelay_xms(unsigned int k);
- void Init_BH1750(void);
- void Single_Write_BH1750(uchar REG_Address); //单个写入数据
- uchar Single_Read_BH1750(uchar REG_Address); //单个读取内部寄存器数据
- void Multiple_Read_BH1750(); //连续的读取内部寄存器数据
- void Delay5us();
- void Delay5ms();
- void BH1750_Start(); //起始信号
- void BH1750_Stop(); //停止信号
- void BH1750_SendACK(bit ack); //应答ACK
- bit BH1750_RecvACK(); //读ack
- void BH1750_SendByte(BYTE dat); //IIC单个字节写
- BYTE BH1750_RecvByte(); //IIC单个字节读
- //----------------------------------
- //毫秒延时**************************
- void IICdelay_xms(unsigned int k)
- {
- unsigned int i,j;
- for(i=0;i<k;i++)
- {
- for(j=0;j<121;j++)
- {;}
- }
- }
- /**************************************
- 1Tmode
- **************************************/
- void Delay5us() //@11.0592MHz
- {
- unsigned char i;
- _nop_();
- i = 11;
- while (--i);
- }
- void Delay5ms() //@11.0592MHz
- {
- unsigned char i, j;
- i = 54;
- j = 199;
- do
- {
- while (--j);
- } while (--i);
- }
- /**************************************
- 起始信号
- **************************************/
- void BH1750_Start()
- {
- SDA_BH1750 = 1; //拉高数据线
- SCL_BH1750 = 1; //拉高时钟线
- Delay5us(); //延时
- SDA_BH1750 = 0; //产生下降沿
- Delay5us(); //延时
- SCL_BH1750 = 0; //拉低时钟线
- }
- /**************************************
- 停止信号
- **************************************/
- void BH1750_Stop()
- {
- SDA_BH1750 = 0; //拉低数据线
- SCL_BH1750 = 1; //拉高时钟线
- Delay5us(); //延时
- SDA_BH1750 = 1; //产生上升沿
- Delay5us(); //延时
- }
- /**************************************
- 发送应答信号
- 入口参数:ack (0:ACK 1:NAK)
- **************************************/
- void BH1750_SendACK(bit ack)
- {
- SDA_BH1750 = ack; //写应答信号
- SCL_BH1750 = 1; //拉高时钟线
- Delay5us(); //延时
- SCL_BH1750 = 0; //拉低时钟线
- Delay5us(); //延时
- }
- /**************************************
- 接收应答信号
- **************************************/
- bit BH1750_RecvACK()
- {
- SCL_BH1750 = 1; //拉高时钟线
- Delay5us(); //延时
- CY = SDA_BH1750; //读应答信号
- SCL_BH1750 = 0; //拉低时钟线
- Delay5us(); //延时
- return CY;
- }
- /**************************************
- 向IIC总线发送一个字节数据
- **************************************/
- void BH1750_SendByte(BYTE dat)
- {
- BYTE i;
- for (i=0; i<8; i++) //8位计数器
- {
- dat <<= 1; //移出数据的最高位
- SDA_BH1750 = CY; //送数据口
- SCL_BH1750 = 1; //拉高时钟线
- Delay5us(); //延时
- SCL_BH1750 = 0; //拉低时钟线
- Delay5us(); //延时
- }
- BH1750_RecvACK();
- }
- /**************************************
- 从IIC总线接收一个字节数据
- **************************************/
- BYTE BH1750_RecvByte()
- {
- BYTE i;
- BYTE dat = 0;
- SDA_BH1750 = 1; //使能内部上拉,准备读取数据,
- for (i=0; i<8; i++) //8位计数器
- {
- dat <<= 1;
- SCL_BH1750 = 1; //拉高时钟线
- Delay5us(); //延时
- dat |= SDA_BH1750; //读数据
- SCL_BH1750 = 0; //拉低时钟线
- Delay5us(); //延时
- }
- return dat;
- }
- //*********************************
- void Single_Write_BH1750(uchar REG_Address)
- {
- BH1750_Start(); //起始信号
- BH1750_SendByte(SlaveAddress); //发送设备地址+写信号
- BH1750_SendByte(REG_Address); //内部寄存器地址,
- // BH1750_SendByte(REG_data); //内部寄存器数据,
- BH1750_Stop(); //发送停止信号
- }
- //********单字节读取*****************************************
- /*
- uchar Single_Read_BH1750(uchar REG_Address)
- { uchar REG_data;
- BH1750_Start(); //起始信号
- BH1750_SendByte(SlaveAddress); //发送设备地址+写信号
- BH1750_SendByte(REG_Address); //发送存储单元地址,从0开始
- BH1750_Start(); //起始信号
- BH1750_SendByte(SlaveAddress+1); //发送设备地址+读信号
- REG_data=BH1750_RecvByte(); //读出寄存器数据
- BH1750_SendACK(1);
- BH1750_Stop(); //停止信号
- return REG_data;
- }
- */
- //*********************************************************
- //
- //连续读出BH1750内部数据
- //
- //*********************************************************
- void Multiple_read_BH1750(void)
- {
-
- uchar i;
- BH1750_Start(); //起始信号
- BH1750_SendByte(SlaveAddress+1); //发送设备地址+读信号
- EA=0;
- for (i=0; i<3; i++) //连续读取2个地址数据,存储中BUF
- {
- BUF[i] = BH1750_RecvByte(); //BUF[0]存储0x32地址中的数据
- if (i == 3)
- {
- BH1750_SendACK(1); //最后一个数据需要回NOACK
- }
- else
- {
- BH1750_SendACK(0); //回应ACK
- }
- }
- EA=1;
- BH1750_Stop(); //停止信号
- Delay5ms();
- }
- //初始化BH1750,根据需要请参考pdf进行修改****
- void Init_BH1750()
- {
- Single_Write_BH1750(0x01);
- }
- unsigned int BH1750_temp(void)
- {
- unsigned int dis_data; //变量
- Init_BH1750(); //初始化BH1750
- Single_Write_BH1750(0x01); // power on
- Single_Write_BH1750(0x10); // H- resolution mode
- IICdelay_xms(200); //延时180ms
- Multiple_Read_BH1750(); //连续读出数据,存储在BUF中
- dis_data=BUF[0];
- dis_data=(dis_data<<8)+BUF[1];//合成数据,即光照数据
- return dis_data;
- }
|