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

📄 time.c

📁 C51写的PCF8563时钟的读写程序
💻 C
字号:
#include	<time.h>
/********************************************
内部函数,I2C开始
********************************************/
static	bit Start(void)
{
	SDA=1;
	SCL=1;
	Delay();
	if(!SDA)	return false;		//SDA线为低电平则总线忙,退出
	SDA=0;
	Delay();
	if(SDA)		return false;		//SDA线为高电平则总线出错,退出
	SCL=0;
	Delay();
	return true;
}
/********************************************
内部函数,I2C结束
********************************************/
static	void Stop()
{
    SDA=0;
    Delay();
    SCL=1;
    Delay();
    SDA=1;
    Delay();
}
/********************************************
内部函数,输出ACK=0
********************************************/
static	void SendAck()
{
    SDA=0;
    Delay();
    SCL=1;
    Delay();
    SCL=0;
	Delay();
}
/********************************************
内部函数,输出ACK=1
********************************************/
static	void SendNak()
{
    SDA=1;
    Delay();
    SCL=1;
    Delay();
    SCL=0;
	Delay();
}
/********************************************
内部函数,等待ACK
********************************************/
/*********读取ACK信号*********/
static	bit WaitAck(void)  //返回为:1=有ACK,0=无ACK
{
	uchar i=0xff;
	SCL=0;
	SDA=1;
	Delay();
	SCL=1;
	Delay();
	while(SDA)
		{
		 if((i--)==0)
		 	{
			 SCL = 0;
			 return	false;
			}
		}
	SCL=0;
	return true;
}
/********************************************
内部函数.输出数据字节
入口:B=数据
********************************************/
static	void WriteByte(uchar Data)
{
    uchar i;
    for(i=0;i<8;i++)
		{
		 SDA = Data & 0x80;
		 Data<<=1;
		 SCL=1;
		 Delay();
		 SCL=0;
		 Delay();
		}
}
/********************************************
内部函数.输入数据
出口:B
********************************************/
static	uchar ReadByte(void)
{
    uchar i,Data=0;
    SDA=1;
    for(i=0;i<8;i++)
		{
		 SCL=1;
		 Data<<=1;
		 Data|=SDA;
		 SCL=0;
		 Delay();
		}
	return(Data);
}
/********************************************
读时间
********************************************/
/*void ReadDate(void)
{
	if(Fhsec)  																//系统每0.5S读一次时间
		{
		 bit  Flag;
		 Flag  = 1;
		 Fhsec = 0;
		 while(Flag)
			{
			 if(I2CStart())													//判断开始是否正确
		 		{
				 I2CSendByte(0x65); 
				 if(I2CWaitAck())					 						//判断ACK是否正确
				 	{
					 TimeBuf.Time.Second = I2CReceiveByte()&0x7f;			//秒
		 			 I2CAck();
		 			 TimeBuf.Time.Minute = I2CReceiveByte()&0x7f;			//分
		 			 I2CAck();
		 			 TimeBuf.Time.Hour   = I2CReceiveByte()&0x3f;			//时
					 I2CAck();
					 TimeBuf.Time.Week   = I2CReceiveByte()&0x07;			//星期
					 I2CAck();
					 TimeBuf.Time.Day    = I2CReceiveByte()&0x3f;			//日
					 I2CAck();
					 TimeBuf.Time.Month  = I2CReceiveByte()&0x1f;			//月
					 I2CAck();
					 TimeBuf.Time.Year   = I2CReceiveByte();				//年
					 I2CNoAck();											//最后一个数据不应答
					 Flag = 0;
					}
				}
			 I2CStop();
		    }
		}
}
*/
void	ReadDate(void)
{
	if(Fhsec)
		{
		 bit	Flag = 1;
		 Fhsec		 = 0;
		 while(Flag)
		 	{
			 if(Start())
				{
				 WriteByte(0xa2);
				 if(WaitAck())
				 	{
					 WriteByte(0x02);													//设置地址
					 if(WaitAck())
					 	{
						 if(Start())   													//重启总线
							{
							 WriteByte(0xa3);											//发读取命令
							 if(WaitAck())
							 	{
								 TimeBuf.Time.Second	= ReadByte() & 0x7f;			//秒
								 SendAck();
								 TimeBuf.Time.Minute	= ReadByte() & 0x7f;			//分
								 SendAck();
								 TimeBuf.Time.Hour		= ReadByte() & 0x3f;			//时
								 SendAck();
								 TimeBuf.Time.Day		= ReadByte() & 0x3f;			//日
								 SendAck();
								 TimeBuf.Time.Week		= ReadByte() & 0x07;			//星期
								 SendAck();
								 TimeBuf.Time.Month		= ReadByte() & 0x1f;		    //月
								 SendAck();
								 TimeBuf.Time.Year		= ReadByte();					//年
								 SendNak();
								 Flag = 0;
								}
							}
						}
					}
				}
			 Stop();
			}
		}
}
/********************************************
写时间
********************************************/
void	WriteDate(void)
{
	Start();
	WriteByte(0xa2);
	WaitAck();
	WriteByte(0x00);
	WaitAck();
	WriteByte(0x00);
	WaitAck();
	WriteByte(0x0c);
	WaitAck();
	WriteByte(TimeBuf.Time.Second);
	WaitAck();
	WriteByte(TimeBuf.Time.Minute);
	WaitAck();
	WriteByte(TimeBuf.Time.Hour);
	WaitAck();
	WriteByte(TimeBuf.Time.Day);
	WaitAck();
	WriteByte(TimeBuf.Time.Week);
	WaitAck();
	WriteByte(TimeBuf.Time.Month);
	WaitAck();
	WriteByte(TimeBuf.Time.Year);
	WaitAck();
	Stop();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -