📄 go.c
字号:
#include<aduc834.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define SCL MCO
#define SDA MDO
#define SDAI MDI
uchar num[7];//用来存放从时钟芯片读取的时钟信息
delay1(uint z)//长时间的延时程序
{
uint x,y;
for (x=z;x>0;x--)
for (y=110;y>0;y--);
}
void IICStart() //起始信号
{
MDE=1;
SCL=0;
SDA=1;
SCL=1;
_nop_();
_nop_();
_nop_();
SDA=0;
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
SDA=1;
}
void IICStop(void) //停止信号
{
MDE=1;
SCL=0;
SDA=0;
SCL=1;
_nop_();
_nop_();
_nop_();
SDA=1;
_nop_();
_nop_();
_nop_();
SCL=0;
}
bit IICRecAck(void) //检查应答位,CY为1则无应答,为0则有ACK应答
{
MDE=0;
SCL=0;
//SDAI=1;
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
CY=SDAI; //因为返回值总是放在CY中的,CY是PSW中的第8位
SCL=0;
return(CY);
}
void IICACK(void) //产生应答
{
MDE=1;
SDA=0;
SCL=0;
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
_nop_();
SDA=1;
}
void IICNoAck(void) //不产生应答
{
MDE=1;
SDA=1;
SCL=0;
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
}
void IICSendByte(unsigned char sendbyte) //字节发送,要发送的字节作为参数即可
{
unsigned char data j=8;
MDE=1;
for(;j>0;j--)
{
SCL=0;
sendbyte<<=1; //无论C51怎样实现这个操作,始终会使CY=sendbyte^7;
SDA=CY;
SCL=1;
}
SCL=0;
}
unsigned char IICReceiveByte(void)//字节接收,返回一个字节
{
register receivebyte,i=8;
MDE=0;//为什么放在上面就显示错误
SCL=0;
while(i--)
{
SCL=1;
receivebyte=(receivebyte<<1)|SDAI;
SCL=0;
}
return(receivebyte);
}
void Delay(unsigned char DelayCount) //延时程序
{
while(DelayCount--);
}
void init()
{
I2CM=1;//工作在软件主机模式
T3FD=0X12;
T3CON=0X82;
SCON=0X53;
}
void main()
{
uchar i,flag=0;
init();
IICStart();
IICSendByte(0xD0);//发送时钟芯片地址,写状态11010000;
delay1(1);
IICRecAck();//检查应答位,CY为1则无应答,为0则有ACK应答
/* while(1) //此循环用来将时芯片里的所有字节清零
{
IICSendByte(0x00);
delay1(1);
IICRecAck();
} */
IICSendByte(0x00);//寄存器00的地址,此寄存器即为地址指针,指向了第一个字节
IICRecAck();
IICSendByte(0x45);//3,初始CH
IICRecAck();
IICSendByte(0x04);//4分
IICRecAck();
IICSendByte(0x14);//14时,24小时制
IICRecAck();
IICSendByte(0x01);//星期1
IICRecAck();
IICSendByte(0x23);//23日
IICRecAck();
IICSendByte(0x02);//2月
IICRecAck();
IICSendByte(0x09);//09年
IICRecAck();
IICSendByte(0x00);//无方波输出
IICStop();//停止信号
/***************开始读取时钟芯片里面的字节************/
while(1)
{
IICStart();
IICSendByte(0xD0);//发送时钟芯片地址,写状态11010000;
delay1(1);
IICSendByte(0x00);//寄存器00的地址,此寄存器即为地址指针,指向了第一个字节
delay1(1); /*如果指定了指针当指定为00的时候,从分的寄存器开始读取,指定为01就从星期寄存器开始读取,02就从月份寄存器开始读取.*/
IICRecAck(); /*但不能显示秒数寄存器. 如果要显示秒楼寄存器,只能让其把所有字节的数据顺序显示*/
IICStop();//停止信号,一定要有,否则全F
IICStart();
IICSendByte(0xD1);//发送时钟芯片地址,读状态11010001;
IICRecAck();
num[0]=IICReceiveByte();
IICACK();//发送应答 此句如果加上去,数据会乱掉
num[1]=IICReceiveByte();
IICACK();
num[2]=IICReceiveByte();
IICACK();
num[3]=IICReceiveByte();
IICACK();
num[4]=IICReceiveByte();
IICACK();
num[5]=IICReceiveByte();
//IICACK();
//num[6]=IICReceiveByte();
//接下来不能应答,一应答时钟芯片就会发送数据
IICNoAck();//无应答
IICStop();//停止信号
for (i=0;i<6;i++)
{
SBUF=num[i];//立即发送接受到的字节
delay1(2);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -