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

📄 rtu.c

📁 用89C52与PCF8563构成高精度时间测量
💻 C
字号:

#include <reg52.h>
#include <intrins.h>
#include <absacc.h>
#include "VI2C_C51.h"
#include "stdio.h"

unsigned char rd[5];	//定义接收缓冲区
unsigned char td[5]={0x00,0x12,0x00,0x00,0x00};	//定义初始化字 :控制寄存器1 控制寄存器2
	                                             //秒,分,时,日,星期,月/世纪,年
const  unsigned char dis[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};//显示码
#define	PCF8563	0xA2	//定义器件地址
#define	WRADDR	0x00	//定义写单元首地址
#define	RDADDR	0x02	//定义读单元首地址

unsigned char key;            /*键盘值*/
bit keyint=0;            /*按键中断标志*/


bit kk=0;
bit keychange=0;            /*数据修改标志*/
bit found=0;
sbit alarm=P3^5;
 unsigned char bufdata;
 unsigned char k; 

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 delay(unsigned char e)
{
	unsigned char g;
	for(e; e > 0; e--)
	{
		for(g =200; g > 0; g--);
		}
}

void key_int0() interrupt 0       /*时间设定启动*/
{ 
 keychange=1;
 found=1;
 }


void key_int1() interrupt 2       /*报警设定启动*/
{ 
 keychange=1;
 found=0;
 }


void time_setup()
{
  unsigned char i,j,k,b;
  char num=3;      /*移位键移到哪个LED*/
/*  if(!found)
   { */
    i=1;j=2;k=0x01;b=0x02;
/*	}
   else {
    i=8;j=9;k=0x09;b=0x02;
	}*/
  k=(rd[i]&0x0F);
  P0=~(0x01<<num);
  P1=~(dis[k]);
   while(keychange)
	   {              
	    if(P2==0xEE)       //移位键
		delay(100);
		if(P2==0xEE)       //移位键
		 {
		  
		  while(P2==0xEE);
		   num--;
           if(num<0) 
		     {
			  num=3;
			  }
		  switch(num)
		  {
		   case 0:k=(rd[j]&0x30);
                  k=k>>4;
                  P0=0xfe;
		          P1=~(dis[k]);
              
                  break;       
           case 1: k=(rd[j]&0x0F);
		           P0=0xfD;
		           P1=~(dis[k]);
                
				   break;              
		   case 2:
		          k=(rd[i]&0x70);
                  k=k>>4;
                  P0=0xfB;
		          P1=~(dis[k]);
                 
				  break;  
		   case 3: k=(rd[i]&0x0F);
		           P0=0xf7;
		           P1=~(dis[k]);
                  
				   break;  
		   default :break;  
           }
		 
		  }
		 else if(P2==0xED)      //+
		      delay(100);
			  if(P2==0xED)
           {
		    while(P2==0xED);

		    if(num==3)            //在分的个位
		    {
		     if((rd[i]&0x0f)==0x09)
		      rd[i]=0x00;
		     else ++rd[i];

             k=(rd[i]&0x0F);
		     P0=~(0x01<<num);
		     P1=~(dis[k]);
          
		    }

		  if(num==2)           //在分的十位
		   {
           if((rd[i]&0xf0)==0x50)
		     rd[i]=0x00;
		   else rd[i]+=0x10;
		     k=(rd[i]&0x70);
             k=k>>4;
             P0=~(0x01<<num);
		     P1=~(dis[k]);
        
           }

           if(num==1)           //在小时的个位
            {
            if((rd[j]&0xf0)==0x20)    //判断十位是否为二
               {
                if((rd[j]&0x0f)==0x03) //是,则判断个位是否为3
                 rd[j]&=0xf0;          //是,则个位置0
                else ++rd[j];          //否则加1
                }
            else                       //不位二
             {
               if((rd[j]&0x0f)==0x09) rd[j]&=0xf0;
               else ++rd[j];
             }
             k=(rd[j]&0x0f);
             P0=~(0x01<<num);
		     P1=~(dis[k]);
            
            }
            if(num==0)           //在小时的十位
            {
			 if((rd[j]&0x0f)>=0x04)
			   {
			    if((rd[j]&0xf0)==0x10)      rd[j]&=0x0f;
				  else rd[j]+=0x10;
				}
             else if((rd[j]&0xf0)==0x20)      rd[j]&=0x0f;
                  else rd[j]+=0x10;
               k=(rd[j]&0x30);
               k=k>>4;
               P0=~(0x01);
		       P1=~(dis[k]);
            
             }
		 }
        else if(P2==0xEB)      //-
		      delay(100);
			 if(P2==0xEB)
			 {
			  while(P2==0xEB);
		      if(num==3)            //在分的个位
			  {
			   if((rd[i]&0x0f)==0x00)
		          rd[i]|=0x09;
		       else --rd[i];
                k=(rd[i]&0x0F);
		        P0=~(0x01<<num);
		        P1=~(dis[k]);
			  }
			  if(num==2)           //在分的十位
			  {
			    if((rd[i]&0xf0)==0x00)
		           rd[i]|=0x50;
		        else rd[i]-=0x10;
                k=(rd[i]&0x70);
                k=k>>4;
                P0=~(0x01<<num);
		        P1=~(dis[k]);
			  }
              
			  if(num==1)           //在小时的个位
			  {
                if((rd[j]&0x0f)==0x00)    
                {
                 if((rd[j]&0xf0)==0x20) 
                      rd[j]|=0x03;          
                 else rd[j]|=0x09;
         		 }
                else   --rd[j];          
                k=(rd[j]&0x0f);
                P0=~(0x01<<num);
		        P1=~(dis[k]);     
              }
                 
              if(num==0)           //在小时的个位 
               {
                if((rd[j]&0xf0)==0x00)
                 {
                  if(((rd[j]&0x0f)==0x00)||((rd[j]&0x0f)==0x01)||((rd[j]&0x0f)==0x02)||((rd[j]&0x0f)==0x03))
                             rd[j]|=0x20;
                  else rd[j]|=0x10;
                 }
                else rd[j]-=0x10;
                   k=(rd[j]&0x30);
                   k=k>>4;
                   P0=~(0x01);
		           P1=~(dis[k]);
			   }
            }

         else if(P2==0xE7)
		       delay(100);
		      if(P2==0xE7)
		      {
		      while(P2==0xE7);
		      keychange=0;
		      rd[1]=0x12;
              ISendStr(PCF8563,k,rd,b);			 
		      }
	   }
 }
  



void  main()
{

    bit i=0;
    unsigned char  j=0;
    EA=1;IT0=1;EX0=1;
    IT1=1;EX1=1;
    P2=0xEF;
    found=0;  
    
	ISendStr(PCF8563,WRADDR,td,0x2);	//初始化PCF8563,如果需要的话可以不去掉
    if(P2==0xEB)
	 ISendStr(PCF8563,WRADDR,td,0x5);	//初始化PCF8563,如果需要的话可以不去掉
	for(;;)
	{
	  
      if(keychange)
	    time_setup();
      

	  IRcvStr(PCF8563,RDADDR,rd,0x3);	//读现在的时、分、秒
	   
  /*     bufdata=(rd[0]&0x08);
       if(bufdata==0x08){     
         alarm=0;
         j++;
         if(j==100){
          alarm=1;
          ISendStr(PCF8563,WRADDR,td,0x2);	//
          }
        }*/

	   bufdata=rd[0]&0x7F;
	   P0=~(0x01<<5);
	   P1=~(dis[bufdata&0x0F]);
	   delay(4);
       P0=0xff;
       delay(2);

	   bufdata=bufdata>>4;
       P0=~(0x01<<4);
	   P1=~(dis[bufdata]);
	   delay(4);
       P0=0xff;
       delay(2);

	   bufdata=rd[1]&0x7F;
	   P0=~(0x01<<3);
	   P1=~(dis[bufdata&0x0F]);
	   delay(4);
	   P0=0xff;
       delay(2);

	   bufdata=bufdata>>4;
       P0=~(0x01<<2);
	   P1=~(dis[bufdata]);
       delay(4);
       P0=0xff;
       delay(2);

	   bufdata=rd[2]&0x3F;
	   P0=~(0x01<<1);
	   P1=~(dis[bufdata&0x0F]);


	   delay(4);
       P0=0xff;
       delay(2);

	   bufdata=bufdata>>4;
       P0=~(0x01<<0);
	   P1=~(dis[bufdata]);
       delay(4);
	   P0=0xFF;


     
      
	}
}

⌨️ 快捷键说明

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