//***************************************// BH1750FVI IIC测试程序#include #include //Keil library #include //Keil library #include #define uchar unsigned char#define uint unsigned int sbit SCL=P1^1; //IIC时钟引脚定义sbit SDA=P1^2; //IIC数据引脚定义sbit ADD=P1^3;#define SlaveAddress 0x46 //定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改 //ALT ADDRESS引脚接地时地址为0x46,接电源时地址为0xB8typedef unsigned char BYTE;typedef unsigned short WORD;BYTE BUF[8]; //接收数据缓存区 uchar ge,shi,bai,qian,wan; //显示变量int dis_data; //变量void delay_nms(unsigned int k);void InitLcd();void Init_BH1750(void);void conversion(uint temp_data);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); //应答ACKbit BH1750_RecvACK(); //读ackvoid BH1750_SendByte(BYTE dat); //IIC单个字节写BYTE BH1750_RecvByte(); //IIC单个字节读//毫秒延时**************************void delay_nms(unsigned int xms) { unsigned int i,j; for(i=xms;i>0;i--) for(j=110;j>0;j--); }/*******************************/ /*******************************/ /*******************************/ /***********************************/ /***********************************//**************************************延时5微秒(STC90C52RC@12M)不同的工作环境,需要调整此函数,注意时钟过快时需要修改当改用1T的MCU时,请调整此延时函数**************************************/void Delay5us(){ _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();}/**************************************延时5毫秒(STC90C52RC@12M)不同的工作环境,需要调整此函数当改用1T的MCU时,请调整此延时函数**************************************/void delay(unsigned int a) //延时约1ms{delay_nms(a);}void Delay5ms(){// WORD n = 560; delay(5);// while (n--);}/**************************************起始信号**************************************/void BH1750_Start(){ SDA = 1; //拉高数据线 SCL = 1; //拉高时钟线 Delay5us(); //延时 SDA = 0; //产生下降沿 Delay5us(); //延时 SCL = 0; //拉低时钟线}/**************************************停止信号**************************************/void BH1750_Stop(){ SDA = 0; //拉低数据线 SCL = 1; //拉高时钟线 Delay5us(); //延时 SDA = 1; //产生上升沿 Delay5us(); //延时}/**************************************发送应答信号入口参数:ack (0:ACK 1:NAK)**************************************/void BH1750_SendACK(bit ack){ SDA = ack; //写应答信号 SCL = 1; //拉高时钟线 Delay5us(); //延时 SCL = 0; //拉低时钟线 Delay5us(); //延时}/**************************************接收应答信号**************************************/bit BH1750_RecvACK(){ SCL = 1; //拉高时钟线 Delay5us(); //延时 CY = SDA; //读应答信号 SCL = 0; //拉低时钟线 Delay5us(); //延时 return CY;}/**************************************向IIC总线发送一个字节数据**************************************/void BH1750_SendByte(BYTE dat){ BYTE i; for (i=0; i<8; i++) //8位计数器 { dat <<= 1; //移出数据的最高位 SDA = CY; //送数据口 SCL = 1; //拉高时钟线 Delay5us(); //延时 SCL = 0; //拉低时钟线 Delay5us(); //延时 } BH1750_RecvACK();}/**************************************从IIC总线接收一个字节数据**************************************/BYTE BH1750_RecvByte(){ BYTE i; BYTE dat = 0; SDA = 1; //使能内部上拉,准备读取数据, for (i=0; i<8; i++) //8位计数器 { dat <<= 1; SCL = 1; //拉高时钟线 Delay5us(); //延时 dat |= SDA; //读数据 SCL = 0; //拉低时钟线 Delay5us(); //延时 } return dat;}//*********************************void Single_Write_BH1750(uchar REG_Address){ BH1750_Start(); //起始信号 BH1750_SendByte(SlaveAddress); //发送设备地址+写信号 BH1750_SendByte(REG_Address); //内部寄存器地址, // BH1750_SendByte(REG_data); 。