发 帖  
原厂入驻New
[问答]

如何读取一个传感器的数据?

71 传感器
分享
我最近刚在弄一下ZigBee的无线通信 想读取一个传感器的数据 GY-30 无奈好像I2C协议老有问题 有没有有经验的大侠可以给我解释一下的。
二楼是这个GY-30的驱动程序 请大家能够帮我看看。
0
2020-8-20 08:00:27   评论 分享淘帖 邀请回答
3个回答
#include <ioCC2530.h>
#include <math.h>
#include <stdio.h>
#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);
  
  }
}
2020-8-20 07:17:03 评论

举报

CC2530不支持开漏输出,因此你要想读SDA,需先把SDA设置为输入模式。
2020-8-20 07:42:39 评论

举报

只有小组成员才能发言,加入小组>>

127个成员聚集在这个小组

加入小组

热门话题

创建小组步骤

关闭

站长推荐 上一条 /7 下一条

快速回复 返回顶部 返回列表