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

📄 timer.c

📁 pcf8563万年历程序
💻 C
字号:
#include	"reg52.h"
#include	"VIiC_C51.H"	//包含VI2C软件包
#define uchar unsigned char
#define uint  unsigned int

#define	PCF8563	0xA2		//定义器件地址
#define	WRADDR	0x00		//定义写单元首地址
#define	RDADDR	0x02		//定义读单元首地址

sbit  key_add=P3^7;
sbit  key_move=P3^6;
sbit  P1_2=P1^2;  
sbit  P1_3=P1^3;
sbit  P3_4=P3^4;
sbit  P0_7=P0^7;
bit   gettime_fg;

unsigned char disp_buf[8]={0,0,0,0,0,0,0,0};//显示缓存
unsigned int back_daycount;
unsigned char day_old;
unsigned char group0[8],group1[8],group2[8];
//unsigned char code Tab1[]={0xc0,0xed,0xb0,0xa8,0x8d,0x8a,0x82,0xec,0x80,0x88};
  unsigned char code Tab1[10]={
                0x81,/*0*/
        0xED,/*1*/
        0x43,/*2*/
        0x49,/*3*/
        0x2D,/*4*/
        0x19,/*5*/
        0x11,/*6*/
        0xCD,/*7*/
        0x01,/*8*/
        0x09,/*9*/

		};
  unsigned char code Tab2[10]={
        0x18,/*0*/
        0x7B,/*1*/
        0x2C,/*2*/
        0x29,/*3*/
        0x4B,/*4*/
        0x89,/*5*/
        0x88,/*6*/
        0x3B,/*7*/
        0x08,/*8*/
        0x09,/*9*/
		};

uchar RtcTime[7];

void systeminit(void)
{
   EA=1;
   ET0=1;
   TMOD=0x01;
   TH0=-50000/256;
   TL0=-50000%256;
   TR0=1;
   SCON=0x00;
 }

void time0() interrupt 1 using 2  //定时器0中断处理程序
 { 
   uchar t0int_count;		   //定时器0中断次数变量

   TH0=-50000/256;
   TL0=-50000%256;
   t0int_count++;
   if(t0int_count==10)
     {
   //   P1_2=!P1_2;
	  P1_3=!P1_3; 
	  t0int_count=0;
//	  gettime_fg=~gettime_fg;
     }
 }

void DelayMs(unsigned char no)		   //延时毫秒程序
{
	unsigned char i,j;
	for(i=0;i<no;i++)
	{
	  for(j=0;j<164;j++);
	  for(j=0;j<164;j++);
	 }
}

void display(void)			 //数码管显示
{
   uchar i,segsel;

 	  segsel=0x7f;
 for(i=0;i<8;i++)
	 {
	 P0=0xff;
   if(i==0|i==2|i==4|i==6)
	  {
	  SBUF=Tab2[group2[i]];
	  while(TI==0) ;
	  TI=0;
	  TI=0;
	  SBUF=Tab2[group0[i]];
	  while(TI==0) ;
	  TI=0;
	  SBUF=Tab2[group1[i]];
	  while(TI==0) ;
	  TI=0;

	  }		
     else	
	 {
	 SBUF=Tab1[group2[i]];
	  while(TI==0) ;
	  TI=0;
	 SBUF=Tab1[group0[i]];	
	  while(TI==0) ;
	  TI=0;
	  SBUF=Tab1[group1[i]];
	  while(TI==0) ;
	  TI=0;
   
	 }
	  P0=segsel	;
	  DelayMs(1);
	  segsel=(segsel>>1)+0x80;				
   }	
   P0=0xff;			 


}


unsigned char displayall(unsigned char  *sd)	//显示时间
{ 
	sd[0]=sd[0]&0x7f;//秒屏蔽保留位
	sd[1]=sd[1]&0x7f;//分屏蔽保留位
	sd[2]=sd[2]&0x3f;//时屏蔽保留位
	sd[3]=sd[3]&0x3f;//日屏蔽保留位
	
	sd[4]=sd[4]&0x07;//星期屏蔽保留位

	sd[5]=sd[5]&0x1f;//月屏蔽保留位
	 sd[6]=sd[6]&0x7f;//年屏蔽保留位

	group1[0]= (sd[3]%16);	  //日个位
    group1[1] =(sd[3]/16);	 //日十位
	group1[2]= (sd[5]%16);	//月个位
    group1[3] =(sd[5]/16);	 //月十位
	group1[4]= (sd[6]%16);	 //年个位
    group1[5] =(sd[6]/16);	 //年十位
	group1[6]= 0x00;		//年百位
    group1[7] =0x02;		 //年千位

    if(day_old!=sd[3])
	{
	 if(back_daycount!=0x00)
	   back_daycount--;
	 day_old=sd[3];
	 }

	group0[0]= 0xff;	
  //  group0[1] =sd[4];		 //星期
    if(sd[4]==0x00)
	  group0[1]=0x08;
	else
	  group0[1]=sd[4];
//	group0[1] =sd[4];		 //星期
	group0[2]= (sd[0]%16);	
    group0[3] =(sd[0]/16);
	group0[4]= (sd[1]%16);	
    group0[5] =(sd[1]/16);
	group0[6]= (sd[2]%16);	
    group0[7] =(sd[2]/16);


    group2[3]=back_daycount/100;
	group2[2]=back_daycount%100/10;
	group2[1]=back_daycount%10;

    display();
    display();

	return 0;
}

unsigned char DelayNS(unsigned char  no)
{ 
	unsigned char  i,j;					//延时参数

  	for(; no>0; no--)
  		for(i=0; i<100; i++)
     		for(j=0; j<100; j++);
  	return 0; 
}



 void TimeBCDadd(uchar i)	   //时间BCD码加1
 {
   RtcTime[i] += 1;
   if( (RtcTime[i] & 0x0f) == 0x0a )
   RtcTime[i] += 6;
  }



void timeadd( uchar i )			    //时间加1
{
 switch (i)
 {
  case 0: if(RtcTime[0] == 0x59) RtcTime[0] = 0;
    else TimeBCDadd(0);
    break;
  case 1: if(RtcTime[1] ==0x59)  RtcTime[1] = 0;
    else TimeBCDadd(1);
    break;
  case 2: if(RtcTime[2] == 0x23) RtcTime[2] = 0;
    else TimeBCDadd(2);
    break;
  case 3: if(RtcTime[3] == 0x31) RtcTime[3] = 0;
    else TimeBCDadd(3);
    break;
  case 4: if(RtcTime[4] == 0x06) RtcTime[4] = 0;
    else RtcTime[4]++;
    break;
  case 5: if(RtcTime[5] == 0x12) RtcTime[5] = 0;
    else TimeBCDadd(5);
    break;
  case 6: if(RtcTime[6] == 0x99) RtcTime[6] = 0;
    else TimeBCDadd(6);
    break;
   }
}


void	main()
{
	unsigned char  td[9]={0x00,0x12,0x00,0x00,0x12,0x12,0x04,0x04,0x07};	//定义初始化字
//	unsigned char rd[7],tc;	//定义接收缓冲区
    unsigned char code control_unit[2]={0x00,0x12};
	uchar led_num,i;
	bit settime_fg;
	systeminit();

	back_daycount=0x32;
    day_old=0x00;

    for(i=0;i<8;i++)
	  group2[i]=8-i;

	led_num=0;
	settime_fg=0;
	P1_2=1;

	ISendStr(PCF8563,WRADDR,td,0x5);	//初始化PCF8563,如果需要的话可以不去掉
	DelayNS(1);
	ISendStr(PCF8563,WRADDR+5,&td[5],0x4);//初始化PCF8563,如果需要的话可以不去掉

	IRcvStr(PCF8563,RDADDR,RtcTime,0x7);	//读现在的时、分、秒
    day_old=RtcTime[3]&0x3f;


	while(1)
	{
        if(settime_fg==0)
		  IRcvStr(PCF8563,RDADDR,RtcTime,0x7);	//读现在的时、分、秒


		   displayall(RtcTime);	//调显示时间子程序

		if(key_move==0)
          {
		   settime_fg=1;
		   P1_2=0;
		   led_num++;
		    if(led_num==8)
			{
			   led_num=0;
			   settime_fg=0;
			   P1_2=1;

		       ISendStr(PCF8563,WRADDR,control_unit,0x2);
	           DelayNS(1);
	           ISendStr(PCF8563,WRADDR+2,RtcTime,0x07);//初始化PCF8563,如果需要的话可以不去掉
		
		   	 }
			 while(key_move==0)	   //等待按键释放
			 {
			
		      displayall(RtcTime);
		
			 }
			}

		 if(led_num)
		 {
		   if(key_add==0)
		   {
		    timeadd(led_num-1);
		  	while(key_add==0)	   //等待按键释放
			 {
			   displayall(RtcTime);	//调显示时间子程序
	
			 }
			}
          }
	
		
	}
}

⌨️ 快捷键说明

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