打印

MSP430G2553和数字光照传感器BH1750FVI 模块 GY-30

[复制链接]
4745|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 自由呼吸de灵魂 于 2014-7-31 20:28 编辑

大神们,小弟我刚刚接触MSP430G2553,准备用该单片机和BH1750FVI光照传感器获取光强,在网上找了一个程序,编译下载之后无法从传感器上读取数据,请问电路应该如何连接?传感器上有5个端口,分别是VCC,SCL,SDA,ADD和GND,按照程序,SCL是不是应该连P1.3,SDA是不是应该连P1.4啊?VCC接电源,GND接地,但是但是ADD应该接什么啊?(按照BH1750FVI说明书上的介绍,ADD应该是IIC总线的某个地址,不知道对不对),希望大神能够帮帮刚接触单片机每一个星期的我,感激不尽!
下面附上程序:
(将从传感器上读取的数据显示在液晶显示屏12864上,这个显示的程序是对的,就不发了,在下面调用到显示的函数时我会加上注释来说明)

#include "msp430g2553.h"
typedef unsigned int uint;
typedef unsigned char uchar;
/****BH1750 IO定义******/
#define SCL_H P1OUT |= BIT3//此IO在硬件上需要更改
#define SCL_L P1OUT &= ~BIT3
#define SDA_H P1OUT |= BIT4
#define SDA_L P1OUT &= ~BIT4

#define SDA_IN  P1DIR &= ~BIT4   //SDA改成输入模式
#define SDA_OUT P1DIR |= BIT4    //SDA变回输出模式
#define SDA_VAL P1IN&BIT4        //SDA的位值

#define _NOP()  __no_operation()
#define SlaveAddress 0x46//定义器件在IIC总线中的从地址,根据ALT  ADDRESS地址引脚不同修改
                             //ALT  ADDRESS引脚接地时地址为0xA6,接电源时地址为0x3A
unsigned char ge,shi,bai,qian,wan;//显示变量
int dis_data;
uchar BUF[8];

const unsigned char tishi_W[]={"光照:"};

void show_tishi();//函数声明

/******************************************************************************/
/*******************************延时函数***************************************/
/******************************************************************************/

/*******************************************
延时约15us的时间
********************************************/
void Delay5us(void)
{
   uchar i;
  
for(i = 0;i < 15;i++);
_NOP();
}
void Delay5ms(void)
{
   uint i=40000;
   while (i != 0)
   {
       i--;
   }
}

/*******************************************
延时MS的时间
********************************************/

void delay(uint x)
{
uchar i;
while(x--)for(i=0;i<125;i++);
}


/******************************************************************************/
/*******************************BH1750相关函数*********************************/
/******************************************************************************/



/**************************************
起始信号
**************************************/
void BH1750_Start()
{
SDA_H;                    //拉高数据线
SCL_H;                    //拉高时钟线
Delay5us();                 //延时
SDA_L;                    //产生下降沿
Delay5us();                 //延时
SCL_L;                    //拉低时钟线
}

/**************************************
停止信号
**************************************/
void BH1750_Stop()
{
SDA_L;                    //拉低数据线
SCL_H;                    //拉高时钟线
Delay5us();                 //延时
SDA_H;                    //产生上升沿
Delay5us();                 //延时
}

/**************************************
发送应答信号
入口参数:ack (0:ACK 1:NAK)
**************************************/
void BH1750_SendACK(void)
{
SDA_L;                  //写应答信号
_NOP();_NOP();
SCL_H;                    //拉高时钟线
Delay5us();                  //延时
SCL_L;                    //拉低时钟线
_NOP();_NOP();
SDA_H;
Delay5us();                 //延时
}
/********************************************
非应答
********************************************/
void mnack(void)
{
SDA_H;
_NOP(); _NOP();
SCL_H;
Delay5us();
SCL_L;
_NOP(); _NOP();
SDA_L;
Delay5us();     
}
/**************************************
接收应答信号
**************************************/
uchar BH1750_RecvACK()
{
uchar ack;
SDA_H;
_NOP(); _NOP();
SCL_H;
_NOP(); _NOP();
SDA_IN;
_NOP(); _NOP();
ack = SDA_VAL;   //读入SDA数值
SCL_L;
Delay5us();
SDA_OUT;
if(ack)    return 0;
else            return  1;
}
/*******************************************
write1
********************************************/
void write1(void)
{
SDA_H;
//Delay5us();
SCL_H;
Delay5us();
SCL_L;
Delay5us();
}
/*******************************************
write0
********************************************/
void write0(void)
{
SDA_L;
// Delay5us();
SCL_H;
Delay5us();
SCL_L;
Delay5us();
}
/**************************************
向IIC总线发送一个字节数据
**************************************/
void BH1750_SendByte(unsigned char dat)
{
   unsigned char i;
  
   for (i = 0; i < 8; i++)
   {        //8位计数器
      if(dat&0x80)
        write1();
      else
        write0();
      dat <<= 1;              //移出数据的最高位
   }
   BH1750_RecvACK();
}

/**************************************
从IIC总线接收一个字节数据
**************************************/
unsigned char BH1750_RecvByte()
{
unsigned char i;
unsigned char dat = 0,flag;

SDA_H;                    //使能内部上拉,准备读取数据,
for (i = 0; i < 8; i++)
{       //8位计数器
   //SDA_H;
   //Delay5us();
   SCL_H;
   SDA_IN;
   Delay5us();
   flag=SDA_VAL;
   dat <<= 1;
   if(flag)
     dat|=0x01;
   SDA_OUT;
   SCL_L;
   Delay5us();
}
return dat;
}

/**********************************
**************写入数据************/
void Single_Write_BH1750(unsigned char REG_Address)
{
BH1750_Start();                  //起始信号
BH1750_SendByte(SlaveAddress);   //发送设备地址+写信号
BH1750_SendByte(REG_Address);    //内部寄存器地址,请参考中文pdf22页
//  BH1750_SendByte(REG_data);       //内部寄存器数据,请参考中文pdf22页
BH1750_Stop();                   //发送停止信号
}
/**************************************
初始化BH1750,根据需要请参考pdf进行修改
*************************************/
void Init_BH1750()
{
Single_Write_BH1750(0x01);
}

/***************************
*********单字节读取*********/

/*
unsigned char Single_Read_BH1750(unsigned char REG_Address)
{
unsigned char 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;
}
*/

/*******************************
连续读出BH1750内部数据
********************************/
void Multiple_Read_BH1750(void)
{
unsigned char i;
BH1750_Start();                          //起始信号
BH1750_SendByte(0x47);         //发送设备地址+读信号
for (i = 0; i < 3; i++){                      //连续读取6个地址数据,存储中BUF
BUF = BH1750_RecvByte();          //BUF[0]存储0x32地址中的数据
if (i == 3) {
   mnack();                //最后一个数据需要回NOACK
}
else {
   BH1750_SendACK();                //回应ACK
}
}
BH1750_Stop();                          //停止信号
Delay5ms();
}

void conversion(unsigned int 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 inmaindispaly()
{
uint temp;
dis_data=BUF[0];
dis_data=(dis_data<<8)+BUF[1];//合成数据
temp=dis_data;
conversion(temp);         //计算数据和显示
show_tishi();
Disp_GQ(0x83,wan,qian,bai,shi,ge);//调用显示函数,大神可忽略
}
/***************************/
/*该函数在液晶显示屏上显示:光照:*/
/***************************/
void show_tishi()
{
  Disp_HZ(0x80,tishi_W,3)//调用显示函数,大神可忽略
}

int main( void )
{
/*P4DIR=0XFF;
P5DIR|=0X07;
P3DIR|=0XC0;*///以上三行是我自己隐掉的,不知道是干什么用的,而且MSP430G2553上也没有P4,P5这些端口,请大神指教
WDTCTL = WDTPW + WDTHOLD;// Stop watchdog timer to prevent time out reset
  delay(20);    //延时200ms
  Ini_Lcd();//调用显示函数,大神可忽略
  show_tishi();

Init_BH1750();       //初始化BH1750
while(1)
{
   Single_Write_BH1750(0x01);   // power on
   Single_Write_BH1750(0x10);   // H- resolution mode
  
   delay(180);              //延时180ms
  
   Multiple_Read_BH1750();       //连续读出数据,存储在BUF中
  
  
   inmaindispaly();
   delay(1000);

}
}

希望大神能够告诉电路应该如何连接,程序中是否有错,现在的情况就是无法从传感器上读取数据,显示什么的都挺正常。

相关帖子

沙发
dirtwillfly| | 2014-8-2 22:25 | 只看该作者
不清楚你的这段程序该怎样连硬件,你可以找程序的作者问问。
一般单片机开发,都是先设计硬件,然后设计软件

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

4

帖子

0

粉丝