嵌入式 > 嵌入式开发 > 详情

MSP430F149驱动BH1750FVI程序

发布时间:2020-11-06 发布时间:
|
#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总线中的从地址,根据ALT ADDRESS地址引脚不同修改
//ALT ADDRESS引脚接地时地址为0xA6,接电源时地址为0x3A
unsigned char ge,shi,bai,qian,wan;//显示变量
int dis_data;
uchar BUF[8];
/******************************************************************************/
/*******************************延时函数***************************************/
/******************************************************************************/

/*******************************************
延时约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;
}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
定时器CTC模式的测试