BH1750FVI模块,
单片机用的是ATMEGA128,数据能显示,但不刷新,请高手们帮忙分析一下,谢谢!
程序:
/*****************************************
* BH1750FVI驱动程序 *
* 功 能:IIC读取光强数据并显示 *
* 时钟频率:11.0592M *
* 设 计: *
* 修改日期:2014年3月20日 *
* 编译环境:ICC-AVR7.14 *
* 实验环境:ATmega128+12864 *
*****************************************/
#include <iom128v.h>
#include <macros.h>
#include "config.h"
#define SLA_W 0x46 //定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改
#define SLA_R 0x47 //ALT ADDRESS引脚接地时地址为0100011,接
电源时地址为1011100
#define BH1750_On 0x01 //定义1750指令:通电,等待测量指令
#define BH1750_Reset 0x07 //定义1750指令:重置寄存器
#define BH1750_Config 0x10 //定义1750工作模式:一次H分辨率模式,读取时间120ms
#define I2C_ERR 0 //出错返回0
#define I2C_CRR 1 //正确返回1
unsigned char display[8]={0,0,0,0,0,' ','l','x'};//显示数据
unsigned char buffer[3]={0,0,0};//显示数据
void BH1750_Read(void);
void conversion(unsigned int i);
void conversion1(unsigned int i);
void BH1750_init(void);
/*********************************************
IIC读取BH1750程序
**********************************************/
void BH1750_Read(void)
{
unsigned char dbh,dbl;
// I2C_Stop(); //释放IIC总线控制
if( I2C_Start()==I2C_ERR ) //重新开始IIC,之前没有STOP,IIC总线控制权保持
return;
if( I2C_SendWrDAdr(SLA_W)==I2C_ERR ) //发送从机写地址
return;
if( I2C_SendDat(BH1750_Config)==I2C_ERR ) //发送1750工作模式指令
return;
I2C_Stop(); //释放IIC总线控制
Delay_nms(180); //延时120ms等待读取
if( I2C_Start()==I2C_ERR ) //开始IIC
通信
return;
if( I2C_SendRdDAdr(SLA_R)==I2C_ERR ) //发送从机读地址
return;
if( I2C_RcvAckDat(dbh)==I2C_ERR ) //读高8位数据,主机发送ACK
return;
if( I2C_RcvNAckDat(dbl)==I2C_ERR ) //读低8位数据,主机发送非ACK
return;
I2C_Stop();
conversion1(dbh); //数据转换出个,十,百,位
LCD_Write_string(3,6,buffer);//显示数值,从第6列开始
conversion1(dbl); //数据转换出个,十,百,位
LCD_Write_string(4,6,buffer);//显示数值,从第6列开始
conversion((dbh<<8)|dbl); //数据转换出个,十,百,千 位
LCD_Write_string(1,4,display);//显示数值,从第4列开始
conversion(((dbh<<8)|dbl)/1.2+0.5); //数据转换出个,十,百,千 位
LCD_Write_string(2,4,display);//显示数值,从第9列开始
//return (dbh<<8)|dbl;
}
/*********************************************
数据转换,十六进制数据转换成10进制
输入十六进制范围:0x00-0xff(0-255)
结果分成个十百位,以ascii存入显示区
**********************************************/
void conversion1(unsigned int i)
{
buffer[0]=(i%1000)/100+0x30 ;
buffer[1]=(i%100)/10+0x30 ;
buffer[2]=i%10+0x30;
}
/*********************************************
数据转换,十六进制数据转换成10进制
输入十六进制范围:0x0000-0x270f(0-9999)
结果分成个十百千位,以ascii存入显示区
**********************************************/
void conversion(unsigned int i)
{
display[0]=i/10000+0x30 ;
display[1]=(i%10000)/1000+0x30 ;
display[2]=(i%1000)/100+0x30 ;
display[3]=(i%100)/10+0x30 ;
display[4]=i%10+0x30;
}
/*********************************************
BH1750初始化,上电,清寄存器
**********************************************/
void BH1750_init(void)
{
if( I2C_Start()==I2C_ERR ) //开始IIC通信
return;
if( I2C_SendWrDAdr(SLA_W)==I2C_ERR ) //发送从机写地址
return;
if( I2C_SendDat(BH1750_On)==I2C_ERR ) //发送1750通电指令
return;
if( I2C_Restart()==I2C_ERR ) //重复开始IIC通信
return;
if( I2C_SendWrDAdr(SLA_W)==I2C_ERR ) //发送从机写地址
return;
if( I2C_SendDat(BH1750_Reset)==I2C_ERR ) //发送1750清寄存器指令
return;
I2C_Stop();
}
一周热门 更多>