|
回复 楼主 xxx564335 的帖子
# include
# include
# define uchar unsigned char
#define XTAL 12000000 // CUP 晶振频率
#define baudrate 2400 // 通信波特率
sbit SDA=P1^7;
sbit SCL=P1^6;
sbit text=P0^1;
uchar min;
uchar hour;
uchar time_data;
uchar x;
uchar z;
uchar buff[3];
uchar b;
bit ack;
void _Nop(uchar i) /*定义空指令*/
{
uchar j;
for(j=0;j
}
void I2C_Start(void)
{
SDA=1;
_Nop(1);
SCL=1;
_Nop(5);
SDA=0;
_Nop(5);
SCL=0;
_Nop(2);
}
void I2C_Stop(void)
{
SDA=0;
_Nop(1);
SCL=1;
_Nop(5);
SDA=1;
_Nop(4);
}
void SendByte(uchar y)
{
uchar BitCnt;
for(BitCnt=0;BitCnt <8;BitCnt++)
{
uchar j;
if((y<
SDA=1;
else SDA=0;
_Nop(1);
SCL=1;
_Nop(5);
SCL=0;
}
_Nop(2);
SDA=1;
_Nop(2);
SCL=1;
_Nop(3);
if(SDA==1)ack=0;
else ack=1;
SCL=0;
_Nop(2);
}
uchar RcvByte()
{
uchar retc;
uchar BitCnt;
retc=0;
SDA=1;
for(BitCnt=0;BitCnt<8;BitCnt++)
{
_Nop(1);
SCL=0;
_Nop(4);
SCL=1;
_Nop(2);
retc=retc<<1;
if(SDA==1)retc=retc+1;
_Nop(2);
}
SCL=0;
_Nop(2);
return(retc);
}
void Ack_I2C(uchar a)
{
if(a==0)SDA=0;
else SDA=1;
_Nop(3);
SCL=1;
_Nop(5);
SCL=0;
_Nop(2);
}
void ISendByte(uchar sla,uchar suba,uchar c)
{
I2C_Start();
SendByte(sla);
_Nop(1);
SendByte(suba);
_Nop(1);
SendByte(c);
_Nop(1);
I2C_Stop();
}
uchar IRcvByte(uchar sla,uchar suba,uchar y)
{
I2C_Start();
SendByte(sla);
_Nop(10);
SendByte(suba);
_Nop(10);
I2C_Stop();
I2C_Start();
SendByte(sla+1);
_Nop(10);
for(b=0;b
{
buff=RcvByte();
if (b!=y-1) Ack_I2C(0);
//z=RcvByte();
Ack_I2C(1);
I2C_Stop();
}
}
/****************************串口初始化****************************/
void init(void)
{
EA=1; // "中断总允许"
ES=1;
TMOD=0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
TH1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate)));
TL1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate)));
SCON=0x50; // 设定串行口工作方式(UART为模式1,8位数据,允许接收)
PCON=0x00; // 波特率不倍增
TR1=1; // 启动定时器1
}
void main()
{
text=0;
init();
ISendByte(0xa2,0x00,0x00);
ISendByte(0xa2,0x03,0x00);
//IsendByte(0xa2,0x04,0x06);
while(1)
{
min=IRcvByte(0xa2,0x03,0x03);
//hour=IRvByte(0xa2,0x04);
text=0;
SBUF=buff;
while(!TI);// 等特数据传送
TI=0; // 清除数据传送标志
}
} |
|