專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

MSP430F149驅(qū)動(dòng)BH1750FVI程序

作者:佚名   來(lái)源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2013年11月11日   【字體:

#include "io430.h"
typedef unsigned int uint;
typedef unsigned char uchar;
/****BH1750 IO定義******/
#define SCL_H P3OUT |= BIT6//此IO在硬件上需要更改
#define SCL_L P3OUT &= ~BIT6
#define SDA_H P3OUT |= BIT7
#define SDA_L P3OUT &= ~BIT7

#define SDA_IN  P3DIR &= ~BIT7   //SDA改成輸入模式
#define SDA_OUT P3DIR |= BIT7    //SDA變回輸出模式
#define SDA_VAL P3IN&BIT7        //SDA的位值
/*********LCD1602 IO define************/
#define DataDir     P4DIR
#define DataPort    P4OUT
#define Busy    0x80
#define CtrlDir     P5DIR
#define CLR_RS P5OUT&=~BIT0    //RS = P5.0
#define SET_RS P5OUT|=BIT0
#define CLR_RW P5OUT&=~BIT1//RW = P5.1
#define SET_RW P5OUT|=BIT1
#define CLR_EN P5OUT&=~BIT2//EN = P5.2
#define SET_EN P5OUT|=BIT2

#define _NOP()  __no_operation()
#defineSlaveAddress0x46//定義器件在IIC總線中的從地址,根據(jù)ALT  ADDRESS地址引腳不同修改
                             //ALT  ADDRESS引腳接地時(shí)地址為0xA6,接電源時(shí)地址為0x3A
unsigned char ge,shi,bai,qian,wan;//顯示變量
int dis_data;
uchar BUF[8];
/******************************************************************************/
/*******************************延時(shí)函數(shù)***************************************/
/******************************************************************************/

/*******************************************
延時(shí)約15us的時(shí)間
********************************************/
void Delay5us(void)
{
   uchar i;
  
for(i = 0;i < 15;i++);
_NOP();
}
void Delay5ms(void)
{
   uint i=40000;
   while (i != 0)
   {
       i--;
   }
}

/*******************************************
延時(shí)MS的時(shí)間
********************************************/

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


/******************************************************************************/
/*******************************BH1750相關(guān)函數(shù)*********************************/
/******************************************************************************/

 

/**************************************
起始信號(hào)
**************************************/
void BH1750_Start()
{
SDA_H;                    //拉高數(shù)據(jù)線
SCL_H;                    //拉高時(shí)鐘線
Delay5us();                 //延時(shí)
SDA_L;                    //產(chǎn)生下降沿
Delay5us();                 //延時(shí)
SCL_L;                    //拉低時(shí)鐘線
}

/**************************************
停止信號(hào)
**************************************/
void BH1750_Stop()
{
SDA_L;                    //拉低數(shù)據(jù)線
SCL_H;                    //拉高時(shí)鐘線
Delay5us();                 //延時(shí)
SDA_H;                    //產(chǎn)生上升沿
Delay5us();                 //延時(shí)
}

/**************************************
發(fā)送應(yīng)答信號(hào)
入口參數(shù):ack (0:ACK 1:NAK)
**************************************/
void BH1750_SendACK(void)
{
SDA_L;                  //寫應(yīng)答信號(hào)
_NOP();_NOP();
SCL_H;                    //拉高時(shí)鐘線
Delay5us();                  //延時(shí)
SCL_L;                    //拉低時(shí)鐘線
_NOP();_NOP();
SDA_H;
Delay5us();                 //延時(shí)
}
/********************************************
非應(yīng)答
********************************************/
void mnack(void)
{
SDA_H;
_NOP(); _NOP();
SCL_H;
Delay5us();
SCL_L;
_NOP(); _NOP();
SDA_L; 
Delay5us();     
}
/**************************************
接收應(yīng)答信號(hào)
**************************************/
uchar BH1750_RecvACK()
{
uchar ack;
SDA_H;
_NOP(); _NOP();
SCL_H;
_NOP(); _NOP();
SDA_IN;
_NOP(); _NOP();
ack = SDA_VAL;   //讀入SDA數(shù)值
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總線發(fā)送一個(gè)字節(jié)數(shù)據(jù)
**************************************/
void BH1750_SendByte(unsigned char dat)
{
   unsigned char i;
  
   for (i = 0; i < 8; i++)
   {        //8位計(jì)數(shù)器
      if(dat&0x80)
        write1();
      else
        write0();
      dat <<= 1;              //移出數(shù)據(jù)的最高位
   }
   BH1750_RecvACK();
}

/**************************************
從IIC總線接收一個(gè)字節(jié)數(shù)據(jù)
**************************************/
unsigned char BH1750_RecvByte()
{
unsigned char i;
unsigned char dat = 0,flag;

SDA_H;                    //使能內(nèi)部上拉,準(zhǔn)備讀取數(shù)據(jù),
for (i = 0; i < 8; i++)
{       //8位計(jì)數(shù)器
   //SDA_H;
   //Delay5us();
   SCL_H;
   SDA_IN;
   Delay5us();
   flag=SDA_VAL;
   dat <<= 1;
   if(flag)
     dat|=0x01;
   SDA_OUT;
   SCL_L;
   Delay5us();
}
return dat;
}

/**********************************
**************寫入數(shù)據(jù)************/
void Single_Write_BH1750(unsigned char REG_Address)
{
BH1750_Start();                  //起始信號(hào)
BH1750_SendByte(SlaveAddress);   //發(fā)送設(shè)備地址+寫信號(hào)
BH1750_SendByte(REG_Address);    //內(nèi)部寄存器地址,請(qǐng)參考中文pdf22頁(yè)
//  BH1750_SendByte(REG_data);       //內(nèi)部寄存器數(shù)據(jù),請(qǐng)參考中文pdf22頁(yè)
BH1750_Stop();                   //發(fā)送停止信號(hào)
}
/**************************************
初始化BH1750,根據(jù)需要請(qǐng)參考pdf進(jìn)行修改
*************************************/
void Init_BH1750()
{
Single_Write_BH1750(0x01); 
}

/***************************
*********單字節(jié)讀取*********/

/*
unsigned char Single_Read_BH1750(unsigned char REG_Address)

unsigned char REG_data;
BH1750_Start();                          //起始信號(hào)
BH1750_SendByte(SlaveAddress);           //發(fā)送設(shè)備地址+寫信號(hào)
BH1750_SendByte(REG_Address);            //發(fā)送存儲(chǔ)單元地址,從0開始
BH1750_Start();                          //起始信號(hào)
BH1750_SendByte(SlaveAddress+1);         //發(fā)送設(shè)備地址+讀信號(hào)
REG_data=BH1750_RecvByte();              //讀出寄存器數(shù)據(jù)
BH1750_SendACK(1); 
BH1750_Stop();                           //停止信號(hào)
   return REG_data;
}
*/

/*******************************
連續(xù)讀出BH1750內(nèi)部數(shù)據(jù)
********************************/
void Multiple_Read_BH1750(void)

unsigned char i;
BH1750_Start();                          //起始信號(hào)
BH1750_SendByte(0x47);         //發(fā)送設(shè)備地址+讀信號(hào)
for (i = 0; i < 3; i++){                      //連續(xù)讀取6個(gè)地址數(shù)據(jù),存儲(chǔ)中BUF
BUF[i] = BH1750_RecvByte();          //BUF[0]存儲(chǔ)0x32地址中的數(shù)據(jù)
if (i == 3) {
   mnack();                //最后一個(gè)數(shù)據(jù)需要回NOACK
}
else {
   BH1750_SendACK();                //回應(yīng)ACK
}
}
BH1750_Stop();                          //停止信號(hào)
Delay5ms();
}
/*******************************************************************************/
/*******************************LCD1602函數(shù)************************************/
/*******************************************************************************/
void conversion(unsigned int temp_data)  //數(shù)據(jù)轉(zhuǎn)換出 個(gè),十,百,千,萬(wàn)

   wan = temp_data / 10000 + 0x30;
   temp_data = temp_data % 10000;//取余運(yùn)算
  
   qian = temp_data / 1000 + 0x30;
   temp_data = temp_data % 1000;//取余運(yùn)算
  
   bai = temp_data / 100 + 0x30;
   temp_data = temp_data % 100;//取余運(yùn)算
  
   shi = temp_data / 10 + 0x30;
   temp_data = temp_data % 10;//取余運(yùn)算
  
   ge = temp_data + 0x30;
}

void WaitForEnable(void)
{
   DataDir &= 0x00;
   CLR_RS;
   SET_RW;
   _NOP();
   SET_EN;
   _NOP();
   _NOP();
   while((P4IN & Busy)!=0);  //檢測(cè)忙標(biāo)志   //STA7為0 允許讀寫操作使能則退出循環(huán)

   CLR_EN;

   DataDir |= 0xFF;  //將P4口切換為輸出狀態(tài)
}
/*******************************/
void WriteCommandLCM(unsigned char CMD,uchar Attribc)
{
   if(Attribc)
     WaitForEnable();
   CLR_RS;
   CLR_RW;
   _NOP();
   DataPort = CMD;
   _NOP();
   SET_EN;
   _NOP();
   _NOP();
   CLR_EN;
}
/*******************************/
void WriteDataLCM(unsigned char dataW)
{
WaitForEnable();
SET_RS;
CLR_RW;
_NOP();
DataPort = dataW;
_NOP();
SET_EN;
_NOP();
_NOP();
CLR_EN;
}
/***********************************/
void InitLcd()
{
CtrlDir |= 0x07;                 //控制線端口設(shè)為輸出狀態(tài)
DataDir  = 0xFF;                 //數(shù)據(jù)端口設(shè)為輸出狀態(tài)
WriteCommandLCM(0x38,0);
delay(15);
WriteCommandLCM(0x08,1);
delay(1);
WriteCommandLCM(0x01,1);
delay(1);
WriteCommandLCM(0x06,1);
delay(1);
WriteCommandLCM(0x0c,1);
delay(1);
}
/***********************************/
void DisplayOneChar(unsigned char X,unsigned char DData)
{
  X |= 0x80;
WriteCommandLCM(X,0);
WriteDataLCM(DData);
}

void inmaindispaly()
{
uint temp;
dis_data=BUF[0];
dis_data=(dis_data<<8)+BUF[1];//合成數(shù)據(jù)

temp=dis_data;

conversion(temp);         //計(jì)算數(shù)據(jù)和顯示
DisplayOneChar(0,'L');
DisplayOneChar(1,'i');
DisplayOneChar(2,'g');
DisplayOneChar(3,'h');
DisplayOneChar(4,'t');
DisplayOneChar(5,':');

DisplayOneChar(7,wan); //顯示數(shù)據(jù)
DisplayOneChar(8,qian); 
DisplayOneChar(9,bai);
DisplayOneChar(10,shi);
DisplayOneChar(11,ge);

DisplayOneChar(13,'l'); ////顯示數(shù)單位
DisplayOneChar(14,'x');
}

 

int main( void )
{
P4DIR=0XFF;
P5DIR|=0X07;
P3DIR|=0XC0;
WDTCTL = WDTPW + WDTHOLD;// Stop watchdog timer to prevent time out reset
  delay(20);    //延時(shí)200ms
InitLcd();           //初始化LCD
Init_BH1750();       //初始化BH1750
while(1)
{
   Single_Write_BH1750(0x01);   // power on
   Single_Write_BH1750(0x10);   // H- resolution mode
  
   delay(180);              //延時(shí)180ms
  
   Multiple_Read_BH1750();       //連續(xù)讀出數(shù)據(jù),存儲(chǔ)在BUF中
  
  
   inmaindispaly();
   delay(1000);

}
}

關(guān)閉窗口

相關(guān)文章