BH1750FVI是IIC總線協(xié)議的數(shù)字型光強度傳傳感器集成電路,以下是它程序:#include "io430x14x.h"
typedef unsigned int uint;
typedef unsignedchar uchar;
#define SCL_H P3OUT |= BIT6//此IO在硬件上需要更改
#define SCL_L P3OUT &= ~BIT6
#define SDA_H P3OUT |= BIT7
#define SDA_L P3OUT &= ~BIT7
本文引用地址:http://m.butianyuan.cn/article/201611/322554.htm#define SDA_INP3DIR &= ~BIT7//SDA改成輸入模式
#define SDA_OUT P3DIR |= BIT7//SDA變回輸出模式
#define SDA_VAL P3IN&BIT7//SDA的位值
#define DataDirP4DIR
#define DataPortP4OUT
#define Busy0x80
#define CtrlDirP5DIR
#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ù)ALTADDRESS地址引腳不同修改
//ALTADDRESS引腳接地時地址為0xA6,接電源時地址為0x3A
unsigned char ge,shi,bai,qian,wan;//顯示變量
int dis_data;
uchar BUF[8];
void Delay5us(void)
{
uchar i;
for(i = 0;i < 15;i++);
_NOP();
}
void Delay5ms(void)
{
uint i=40000;
while (i != 0)
{
i--;
}
}
void delay(uint x)
{
uchar i;
while(x--)for(i=0;i<125;i++);
}
void BH1750_Start()
{
SDA_H;//拉高數(shù)據(jù)線
SCL_H;//拉高時鐘線
Delay5us();//延時
SDA_L;//產(chǎn)生下降沿
Delay5us();//延時
SCL_L;//拉低時鐘線
}
void BH1750_Stop()
{
SDA_L;//拉低數(shù)據(jù)線
SCL_H;//拉高時鐘線
Delay5us();//延時
SDA_H;//產(chǎn)生上升沿
Delay5us();//延時
}
void BH1750_SendACK(void)
{
SDA_L;//寫應(yīng)答信號
_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數(shù)值
SCL_L;
Delay5us();
SDA_OUT;
if(ack)return 0;
elsereturn1;
}
void write1(void)
{
SDA_H;
//Delay5us();
SCL_H;
Delay5us();
SCL_L;
Delay5us();
}
void write0(void)
{
SDA_L;
// Delay5us();
SCL_H;
Delay5us();
SCL_L;
Delay5us();
}
void BH1750_SendByte(unsigned char dat)
{
unsigned char i;
for (i = 0; i < 8; i++)
{//8位計數(shù)器
if(dat&0x80)
write1();
else
write0();
dat <<= 1;//移出數(shù)據(jù)的最高位
}
BH1750_RecvACK();
}
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位計數(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;
}
評論