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

📄 tmain.c

📁 pcf8583实时时钟芯片单片机C51几口程序
💻 C
字号:
//工程模版
#include <Reg52.H>
#include <globe.h>
#include <const.h>
#include <function.h>

#define DEBUF_CLOCK

sbit     SDA=P1^0;
sbit     SCL=P1^1;

void IICStart(void)
{
SCL=0;                  //
SDA=1;
SCL=1;
_nop_();
_nop_();
_nop_();
SDA=0;
_nop_();
_nop_();
_nop_();
SCL=0;
SDA=1;                  //
}

//-----------------停止IIC总线----------------/
void IICStop(void)
{
SCL=0;
SDA=0;
SCL=1;
_nop_();
_nop_();
_nop_();
SDA=1;
_nop_();
_nop_();
_nop_();
}

//--------------检查应答位-------------------/
bit IICRecAck(void)
{
SCL=0;
SDA=1;
SCL=1;
_nop_();
_nop_();
_nop_();
CY=SDA;                 //因为返回值总是放在CY中的
SCL=0;
return(CY);
}

//---------------对IIC总线产生应答-------------------/
void IICACK(void)
{
SDA=0;
SCL=1;
_nop_();
_nop_();
_nop_();
SCL=0;
_nop_();
_nop_();
_nop_();
SDA=1;
}

//-----------------不对IIC总线产生应答---------------/
void IICNoAck(void)
{
SDA=1;
SCL=1;
_nop_();
_nop_();
_nop_();
SCL=0;
}

//-------------------向IIC总线写数据---------------------/
void IICSendByte(unsigned char sendbyte)
{
unsigned char data j=8;
for(;j>0;j--)
   {
   SCL=0;
   sendbyte<<=1;        //无论C51怎样实现这个操作,始终会使CY=sendbyte^7;
   SDA=CY;
   SCL=1;
   }
SCL=0;
}

//----------------------从IIC总线上读数据子程序----------/
unsigned char IICReceiveByte(void)
{
register receivebyte,i=8;
SCL=0;
while(i--)
   {
   SCL=1;
   receivebyte=(receivebyte<<1)|SDA;
   SCL=0;
   }
return(receivebyte);
}

//---------------一个简单延时程序------------------------/
void Delay(unsigned char DelayCount)
{
while(DelayCount--);
}


bit ReadIIC(unsigned char SlaveAddress,unsigned char raddr,unsigned char *rdata,unsigned char num)
{
	unsigned char i;
	bit errorflag=1;
	i=ERRORCOUNT;
	while(i--)
	{
		IICStart();
		IICSendByte(SlaveAddress&0xFE);//Write
		if(IICRecAck())
			continue;
		IICSendByte(raddr);
		if(IICRecAck())
			continue;
		IICStart();
		IICSendByte(SlaveAddress|0x01);//Read
		if(IICRecAck())
			continue;
		while(--num)
		{
			*rdata++=IICReceiveByte();
			IICACK();
		}
		*rdata=IICReceiveByte();        //read last byte data
		IICNoAck();
		IICStop();
		errorflag=0;
		break;
	}
	return(errorflag);
}



bit WriteIIC(unsigned char SlaveAddress,unsigned char waddr,unsigned char *wdata,unsigned char num)
{
	unsigned char i;
	bit errorflag=0;
	i=ERRORCOUNT;
	while(i--)
	{
		IICStart();
		IICSendByte(SlaveAddress&0xFE);
		if(IICRecAck())
			continue;
		IICSendByte(waddr);
		if(IICRecAck())
			continue;
		while(num--)
		{
			IICSendByte(*wdata++);
			if(!IICRecAck())
				continue;
			errorflag=1;
			break;
		}
		if(!errorflag)
			break;
	}
	IICStop();
	Delay(255);
	Delay(255);
	Delay(255);
	Delay(255);
	if(i==0)
		errorflag=1;
	return(errorflag);
}

#define PCF8563_WRITE	0xA2	
#define PCF8563_READ	0xA3	

#define SetClock(startadd,wnum)	WriteIIC(PCF8563_WRITE,startadd,Clock_buf,wnum)
#define ReadClock(startadd,wnum)	ReadIIC(PCF8563_READ,startadd,Clock_buf,wnum)

//BCD
struct Ttime
	{
		unsigned int Year;
		unsigned char Month;
		unsigned char Date;
		unsigned char Day;
		unsigned char Hour;
		unsigned char Minute;
		unsigned char Second;
	};

struct Ttime RealTime;
unsigned char idata Clock_buf[7];
unsigned int cdcread_msdelay;

main()
{
	MCU_Init();
	Val_Init();
	#ifdef DEBUF_CLOCK
	    Clock_buf[0]=0x00;
	    Clock_buf[1]=0x00;
	    Clock_buf[2]=0x12;
	    Clock_buf[3]=0x06;
	    Clock_buf[4]=0x03;
	    Clock_buf[5]=0x01;
	    Clock_buf[6]=0x05;
	    SetClock(2,7);
	#endif
	while(1)
	{
		if(!cdcread_msdelay)
		{
			BUZZER=!BUZZER;
			ReadClock(2,7);
			if((Clock_buf[5]&0x80)==0x00)RealTime.Year=0x2000|Clock_buf[6];
			else RealTime.Year=0x1900|Clock_buf[6];
			RealTime.Month=Clock_buf[5]&0x1F;
			RealTime.Date=Clock_buf[3]&0x3F;
			RealTime.Day=Clock_buf[4]&0x07;
			RealTime.Hour=Clock_buf[2]&0x3F;
			RealTime.Minute=Clock_buf[1]&0x7F;
			RealTime.Second=Clock_buf[0]&0x7F;

			#ifdef DEBUF_CLOCK	//测试 从串口发送日期时间数据
				ES=0;
				SBUF=Hi(RealTime.Year);
				while(!TI);
				TI=0;
				SBUF=Lo(RealTime.Year);
				while(!TI);
				TI=0;
				SBUF=RealTime.Month;
				while(!TI);
				TI=0;
				SBUF=RealTime.Date;
				while(!TI);
				TI=0;
				SBUF=RealTime.Day;
				while(!TI);
				TI=0;
				SBUF=RealTime.Hour;
				while(!TI);
				TI=0;
				SBUF=RealTime.Minute;
				while(!TI);
				TI=0;
				SBUF=RealTime.Second;
				while(!TI);
				TI=0;
				ES=1;
			#endif
			cdcread_msdelay=1000;//一秒钟读一次时间
		}
	}
}





//--------------------------------------------
//T0 Interrupt Time is 1ms
//#define TF0_VECTOR	1  /* 0x0B Timer 0 */
//
Timer0Interrupt(void) interrupt TF0_VECTOR using 3
{
	TH0 = 0xFC;
	TL0 = 0x66;
	sys_ms_count++;
	if(cdcread_msdelay)cdcread_msdelay--;
}


//-------------------------------------------
//#define UART_VECTOR	4  /* 0x23 UART */
SIOInterrupt(void) interrupt UART_VECTOR using 2
{
	if(RI)
	{
		RI=0;
	}
	if(TI)TI=0;
}

⌨️ 快捷键说明

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