中级会员 
   
	- 积分
 - 249
 
        - 金钱
 - 249 
 
       - 注册时间
 - 2018-1-7
 
      - 在线时间
 - 35 小时
 
 
 
 | 
 
#include  <REG51.H>         
#include  <math.h>    //Keil library   
#include  <stdio.h>   //Keil library         
#include  <INTRINS.H> 
#include  <IIC.H> 
#define   uchar unsigned char 
#define   uint unsigned int         
#define          address   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;                       //变量 
int w_data; 
 
 
void  Multiple_Read_BH1750();                               //连续的读取内部寄存器数据 
//------------------------------------ 
bit  BH1750_RecvACK();                  //读ack 
BYTE BH1750_RecvByte();                 //IIC单个字节读 
 
void conversion(uint temp_data)  //  数据转换出 个,十,百,千,万 
{   
    wan=temp_data/10000+0x30 ; 
    temp_data=temp_data%10000;   //取余运算 
        qian=temp_data/1000+0x30 ; 
    temp_data=temp_data%1000;    //取余运算 
    bai=temp_data/100+0x30   ; 
    temp_data=temp_data%100;     //取余运算 
    shi=temp_data/10+0x30    ; 
    temp_data=temp_data%10;      //取余运算 
    ge=temp_data+0x30;          
} 
//-------------------------------------------------------------------------------------// 
//函数:      wr_BH1750_one_data() 
//功能:      写一位bh1750数据 
//address:   芯片从地址 
//saddress:  写寄存器地址 
//w_data:    待写数据 
//-------------------------------------------------------------------------------------// 
void wr_BH1750_one_data(int saddress) 
{ 
_nop_(); 
iic_start(); 
_nop_(); 
iic_sendbyte(address); 
_nop_(); 
iic_sendbyte(saddress); 
_nop_(); 
iic_sendbyte(w_data); 
_nop_(); 
iic_stop(); 
_nop_(); 
} 
//-------------------------------------------------------------------------------------// 
//函数:      rd_BH1750_one_data() 
//功能:      读一位max30102数据 
//address:   芯片从地址 
//saddress:  读寄存器地址 
//rda:       读出的数据 
//-------------------------------------------------------------------------------------// 
void rd_BH1750_one_data(void)  
{ 
 
iic_start(); 
_nop_(); 
iic_sendbyte(address+1); 
BUF[0] =iic_rcvbyte_nack();          //BUF[0]存储0x32地址中的数据 
_nop_(); 
_nop_(); 
iic_start(); 
_nop_(); 
BUF[1] =iic_rcvbyte_nack(); 
_nop_(); 
_nop_(); 
iic_stop(); 
 
 
} 
 
 
 
void uart_putchar(unsigned char dat) 
{ 
        SBUF=dat; //把数据送给sbuf缓存器中 
        while(TI!=1);//发送标志位 TI如果发送了为1,没发送为0,没发送等待,到了退出循环 
        TI=0; //到了,TI清为0 
 
         
} 
void uart_printf(unsigned char *buff) 
{ 
 
         while(*buff) 
uart_putchar(*buff++); 
} 
 
//-------------------------------------------------------------------------------------// 
//函数:      主程序 
//功能:    
//-------------------------------------------------------------------------------------// 
main() 
{ 
float temp; 
   unsigned char str[5]; 
TMOD=0x21;                   
SCON=0x50; 
TH1=0xFD; 
TL1=0xFD; 
TR1=1;                            
TI=1;    
//设置51的波特率为 9600 N 8 1 
//51主频为11.0592MHz 
wr_BH1750_one_data(0x01); 
while(1) 
{   
 
wr_BH1750_one_data(0x01);   // power on 
wr_BH1750_one_data(0x10);   // H- resolution mode   连续H分辨率模式        在1lx分辨率下开始测量。  测量时间一般为120ms。 
delayms(180);        
rd_BH1750_one_data();  
 
 
 
 
        dis_data=BUF[0]; 
    dis_data=(dis_data<<8)+BUF[1];//合成数据,即光照数据 
 
    temp=(float)dis_data/1.2; 
 
    conversion(temp);         //计算数据和显示 
 
        str[0]=wan; 
        str[1]=qian; 
        str[2]=bai; 
        str[3]=shi; 
        str[4]=ge; 
        uart_printf("light:"); 
        uart_printf(str); 
        uart_printf(" lx"); 
        delayms(200);  
        uart_printf("\r\n"); 
        delayms(100); 
} 
} 
 
 
 |   
 
 
 
 |