中级会员
- 积分
- 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);
}
}
|
|