完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我最近刚在弄一下ZigBee的无线通信 想读取一个传感器的数据 GY-30 无奈好像I2C协议老有问题 有没有有经验的大侠可以给我解释一下的。
二楼是这个GY-30的驱动程序 请大家能够帮我看看。 |
|
相关推荐
3个回答
|
|
#include
#include #include #include "delay.h" #include "I2C.h" #define SCL P1_4 #define SDA P1_5 #define SlaveAddress 0x46 //定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改 //ALT ADDRESS引脚接地时地址为0x46,接电源时地址为0xB8 #define Data_size 20 unsigned int dis_data; //变量 BYTE BUF[8]; //接收数据缓存区 unsigned int ge,shi,bai,qian,wan; //显示变量 unsigned int BH1750Data[Data_size]; void Delay5us() { __asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop"); __asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop"); __asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop"); __asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop"); __asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop"); __asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop"); __asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop"); __asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop"); __asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop"); __asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop"); __asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop"); __asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop"); __asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop"); __asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop"); __asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop"); __asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop"); __asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop"); __asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop"); __asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop"); __asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop");__asm("nop"); } 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; } void BH1750_Start() { SDA = 1; //拉高数据线 SCL = 1; //拉高时钟线 Delay5us(); //延时 SDA = 0; //产生下降沿 Delay5us(); //延时 SCL = 0; //拉低时钟线 } void BH1750_Stop() { SDA = 0; //拉低数据线 SCL = 1; //拉高时钟线 Delay5us(); //延时 SDA = 1; //产生上升沿 Delay5us(); //延时 } void BH1750_SendACK(unsigned char ack) { P1DIR &=0x03; SDA = ack; //写应答信号 SCL = 1; //拉高时钟线 Delay5us(); //延时 SCL = 0; //拉低时钟线 Delay5us(); //延时 } unsigned char BH1750_RecvACK() { P1DIR &=0x01; SCL = 1; //拉高时钟线 Delay5us(); //延时 CY = SDA; //读应答信号 SCL = 0; //拉低时钟线 Delay5us(); //延时 return CY; } void BH1750_SendByte(BYTE dat) { P1DIR &=0x03; BYTE i; for (i=0; i<8; i++) //8位计数器 { dat <<= 1; //移出数据的最高位 SDA = CY; //送数据口 SCL = 1; //拉高时钟线 Delay5us(); //延时 SCL = 0; //拉低时钟线 Delay5us(); //延时 } BH1750_RecvACK(); } BYTE BH1750_RecvByte() { P1DIR &=0x01; 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) { P1DIR &=0x03; BH1750_Start(); //起始信号 BH1750_SendByte(SlaveAddress); //发送设备地址+写信号 BH1750_SendByte(REG_Address); //内部寄存器地址, // BH1750_SendByte(REG_data); //内部寄存器数据, BH1750_Stop(); //发送停止信号 } unsigned char Single_Read_BH1750(uchar REG_Address) { P1DIR &=0x01; uchar REG_data; BH1750_Start(); //起始信号 BH1750_SendByte(SlaveAddress); //发送设备地址+写信号 BH1750_SendByte(REG_Address); //发送存储单元地址,从0开始 BH1750_Start(); //起始信号 BH1750_SendByte(SlaveAddress+1); //发送设备地址+读信号 REG_data=BH1750_RecvByte(); //读出寄存器数据 BH1750_SendACK(1); BH1750_Stop(); //停止信号 return REG_data; } void Multiple_Read_BH1750(void) { P1DIR &=0x01; unsigned char i; BH1750_Start(); //起始信号 BH1750_SendByte(SlaveAddress+1); //发送设备地址+读信号 for (i=0; i<3; i++) //连续读取2个地址数据,存储中BUF { BUF = BH1750_RecvByte(); //BUF[0]存储0x32地址中的数据 if (i == 3) { BH1750_SendACK(1); //最后一个数据需要回NOACK } else { BH1750_SendACK(0); //回应ACK } } BH1750_Stop(); //停止信号 DelayMS(5); } //初始化BH1750,根据需要请参考pdf进行修改**** void Init_BH1750() { Single_Write_BH1750(0x01); } void UartSendString2(unsigned int *Data,int len) { uint i; for(i=0;*Data != '#';i++) { U0DBUF=*Data++; while(UTX0IF==0); UTX0IF=0; } } void UartSendString3(char *Data,int len) { uint i; for(i=0;*Data != '#';i++) { U0DBUF=*Data++; while(UTX0IF==0); UTX0IF=0; } } void LightDataDis() { unsigned int k=0; float temp; DelayMS(100); //延时100ms Init_BH1750(); //初始化BH1750 while(1) { Single_Write_BH1750(0x01); // power on Single_Write_BH1750(0x10); // H- resolution mode DelayMS(180); //延时180ms Multiple_Read_BH1750(); //连续读出数据,存储在BUF中 dis_data=BUF[0]; dis_data=(dis_data<<8)+BUF[1];//合成数据,即光照数据 temp=(float)dis_data/1.2; conversion(temp); //计算数据和显示 BH1750Data[0]=wan; BH1750Data[1]=qian; BH1750Data[2]=bai; BH1750Data[3]=shi; BH1750Data[4]=ge; BH1750Data[5]='n'; BH1750Data[6]='#'; DelayMS(5); UartSendString2(BH1750Data,sizeof(BH1750Data)); DelayMS(500); } } |
|
|
|
|
|
CC2530不支持开漏输出,因此你要想读SDA,需先把SDA设置为输入模式。
|
|
|
|
只有小组成员才能发言,加入小组>>
如何使用STM32+nrf24l01架构把有线USB设备无线化?
2574 浏览 7 评论
请问能利用51单片机和nRF24L01模块实现实时语音无线传输吗?
2367 浏览 5 评论
3219 浏览 3 评论
2841 浏览 8 评论
为什么ucosii上移植lwip后系统进入了HardFault_Handler?
2795 浏览 4 评论
请教各位大咖:有没有接收频率32M左右的芯片推荐的?先感谢啦!
674浏览 1评论
912浏览 0评论
1033浏览 0评论
676浏览 0评论
508浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-27 05:14 , Processed in 1.167973 second(s), Total 84, Slave 67 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号