完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
BH1750FVI模块,单片机用的是ATMEGA128,数据能显示,但不刷新,请高手们帮忙分析一下,谢谢!
程序: /***************************************** * BH1750FVI驱动程序 * * 功 能:IIC读取光强数据并显示 * * 时钟频率:11.0592M * * 设 计: * * 修改日期:2014年3月20日 * * 编译环境:ICC-AVR7.14 * * 实验环境:ATmega128+12864 * *****************************************/ #include #include #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(); } |
|
相关推荐
1个回答
|
|
刚开始学这个 不懂得位置还希望多多指教!!
|
|
|
|
只有小组成员才能发言,加入小组>>
3029个成员聚集在这个小组
加入小组2917 浏览 1 评论
MSP430FR5994 使用库函数 定时器触发AD问题请教
3576 浏览 2 评论
请问怎么把下面51单片机的代码改成msp430 g2 pocket的代码,还有改下时间变成30秒
2336 浏览 1 评论
4795 浏览 1 评论
2571 浏览 1 评论
1317浏览 3评论
MSP430FR5994 使用库函数 定时器触发AD问题请教
3577浏览 2评论
2917浏览 1评论
1495浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 13:14 , Processed in 1.528950 second(s), Total 78, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号