⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 go.c

📁 ADUC834 的IIC功能 DS1307时钟芯片 串口调试工具显示即可.KEIL 3 编写
💻 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 + -