|
发表于 2008-4-1 22:37:03
|
显示全部楼层
我在大学的时候写过一个,不知道是不是这个:
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define unit unsigned int
sbit ISCL=P1^3;
sbit ISDA=P1^2;
uchar idata sdata,rece[7],TrmBuf[16],slvdevice;
uchar idata controlbuf[2]={0x00,0x00};/*control register1 clock stop,register2*/
uchar idata timebuf[7]=/*{0x59,0x59,0x23,0x24,0x06,0x04,0x03};*/{0x12,0x13,0x14,0x15,6,0x04,0x03};/*time register*/
uchar idata alarmbuf[7]={0x80,0x80,0x80,0x80,0x83,0x00,0x00};/*alarm registers*/
uchar idata redata[7];
void I2cWait(void)/*I2CBUS等待*/
{
_nop_();
_nop_();
}
void DelayX1ms(unit count)/*延时XmS子程序*/
{
unit i;
uchar j;
for(i=0;i<count;i++)
for(j=0;j<110;j++);
}
void I2cStart(void)/*I2CBUS起始信号*/
{
ISDA=1;
ISCL=1;
I2cWait();
ISDA=0;
I2cWait();
ISCL=0;
}
void I2cStop(void) /*I2CBUS停止信号*/
{
ISDA=0;
I2cWait();
ISCL=1;
I2cWait();
ISDA=1;
}
void I2cInit(void)/*I2CBUS初始化*/
{
ISDA=1;
ISCL=1;
}
bit slave_ack(void)/*I2CBUS应答信号*/
{
bit ack;
_nop_();_nop_();
ISCL=0;
_nop_();
ISDA=1;
_nop_();_nop_();
ISCL=1;
_nop_();_nop_();
ack=ISDA;
ISCL=0;
return ack;
}
bit I2cSendByte(uchar bytedata)/*传送一个字节到slave*/
{
uchar i;
bit ack;
for (i=0;i<8;i++)
{
if (bytedata&0x80)ISDA=1;
else ISDA=0;
bytedata<<=1;
ISCL=1;
I2cWait();
ISCL=0;
I2cWait();
}
ack=slave_ack();
return ack;
}
uchar I2cReceiveByte(void) /*从slave接收一个字节*/
{
uchar i,bytedata=0;
for (i=0;i<8;i++)
{
ISCL=1;
I2cWait();
bytedata<<=1;
if (ISDA) bytedata|=0x01;
ISCL=0;
I2cWait();
}
return bytedata;
}
void I2cSendAckmowledge(bit ack)/*传送确认信号至slave*/
{
ISDA=ack;
ISCL=1;
I2cWait();
ISCL=0;
}
void RETWDT(void)/*1161看门狗定时器复位*/
{
ISDA=0;
_nop_();
ISDA=1;
}
void I2cByteWrite(uchar device,uchar address,uchar bytedata)/*主机将一字节数据写入指定slave地址中*/
{
bit ack;
I2cStart();
resent1:I2cSendByte(device);
if (ack==1)
goto resent1;
resent2:I2cSendByte(address);
if (ack==1)
goto resent2;
resent3:I2cSendByte(bytedata);
if (ack==1)
goto resent3;
I2cStop();
DelayX1ms(10);
}
void I2c16ByteWrite(uchar device,uchar address) /*the master send 16 bytes data to the slave*/
{
bit ack;
uchar j;
I2cStart();
resent4:I2cSendByte(device);
if (ack==1)
goto resent4;
resent5:I2cSendByte(address);
if (ack==1)
goto resent5;
for (j=0;j<16;j++)
{
sdata = TrmBuf[j];
resent6:I2cSendByte(sdata);
if (ack==1)
goto resent6;
}
I2cStop();
DelayX1ms(10);
}
uchar I2cByteRead(uchar device,uchar address)/*主机从指定slave地址中读一字节数据*/
{
uchar ldata;
bit ack;
resent7:I2cStart();
_nop_();
if (ack==1)
goto resent7;
resent8:I2cSendByte(device);
_nop_();
if (ack==1)
goto resent8;
resent9:I2cSendByte(address);
_nop_();
if (ack==1)
goto resent9;
I2cStart();
resent10:I2cSendByte(device|0x01);
_nop_();
if (ack==1)
goto resent10;
ldata=I2cReceiveByte();
I2cSendAckmowledge(1);
I2cStop();
return ldata;
}
void I2c7ByteRead(uchar device,uchar address)/*主机从指定slave地址中读一字节数据*/
{
uchar j;
bit ack;
I2cStart();
resent11:I2cSendByte(device);
if (ack==1)
goto resent11;
resent12:I2cSendByte(address); /*here is added just now*/
if (ack==1)
goto resent12;
for (j=0;j<7;j++)
{
rece[j]=I2cReceiveByte();
_nop_();
if (j!=6)
I2cSendAckmowledge(0);
}
I2cSendAckmowledge(1);
I2cStop();
}
void main (void)
{
uchar idata send,receive,j;
uchar idata addr1,addr2,addr3;
uchar idata i,control1;
again:
I2cInit(); /*here should init the i2c bus--lwg*/
slvdevice = 0xa2;
addr1 =0x00;
addr2 =0x02;
addr3 =0x09;
for (i=0;i<2;i++)/*send control bytes 1,2*/
{
control1=controlbuf;
I2cByteWrite(slvdevice,addr1,control1);
addr1++;
}
for (i=0;i<7;i++)/*send timebuf*/
{
control1=timebuf;
I2cByteWrite(slvdevice,addr2,control1);
addr2++;
}
for (i=0;i<7;i++)/*send alarmbuf*/
{
control1=alarmbuf;
I2cByteWrite(slvdevice,addr3,control1);
addr3++;
}
addr2=0x02;
for (j=0;j<7;j++)
{
redata[j]=I2cByteRead(slvdevice,addr2);/*主机将slave的0x55单元中的数据读入它的receive 内*/
addr2++;
}
DelayX1ms(10);
redata[4]&=0X07;
redata[5]&=0X9F;
goto again;
} |
|