cpubbs 发表于 2004-11-6 02:51:09

C51 时钟源代码[P0口出段码,P1口出位码,四位显示,用PC机校时

/***********************************************************/
/*            2003.01         盛星辉                     */
/*            DongGuan_Qigang 东莞                         */
/*            shengxinghui@163.com                         */
/***********************************************************/
#define uchar unsigned char
#define ulong unsigned long
#define uint unsigned int

#include
#include
//#include
#include
#include

start_ini();
DelayNus(ucharDelayNum);
Display(void);
CalcCalendar();
DataToDisBuf(void);
CalcDaysThisMonth(uchar year,uchar month);
CalcWeekDay(unsigned char year,unsigned char month,unsigned char day);
/*externM24CReadSub(char AccessNumber,char Wordaddress,char SlaveAddress);
externM24CWriteSub(char AccessNumber,char Wordaddress,char SlaveAddress);
*/
/*unsigned char data EEBuffer={1,2,3,4,5,6,7,8};*/
unsigned char data ReceBuf={0,0,0,0,0,0,0,0};

structtime {
unsigned charsec;
unsigned charmin;
unsigned charhour;
unsigned charday;
unsigned charweekday;
unsigned charmonth;
unsigned charyear;
}CurrentTime _at_ 0x18;/*TempTime;*/

uchar data DisBuf={0,0,0,0};
uchar data DisMode=0;
uchar data DisBit=0;
uint data ReceCounter=0;
uchar data Rece500ms=0;
uchar data CheckSum=0;
uchar code Segment={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};      /*显示数
据,需要修改Must modify*/
ulong data TempCounter=0;

uchar data SecCounter=0;
bit Flag_ReadSec=low;
bit Flag_ReadTime=low;
bit Flag_Sec=low;
bit Flag_Rece=low;
bit Flag_ReceFinish=low;
bit Flag_DataGood;

main(void)
{
uchar i;
start_ini();
/*EEBuffer=0;
M24CWriteSub(1,0,0xA2);
M24CReadSub(7,2,0xA2);*/
while(1)
   {
    if(Flag_Sec)
   {
      Flag_Sec=low;
      TempCounter++;         /*debug*/
      CalcCalendar();
      DataToDisBuf();
   }
   /*////////////////////////////////////////////////////*/
    if(Flag_ReadTime)
      {
       Flag_ReadTime=low;
   /*M24CReadSub(7,2,0xA2);
       for(i=0;i<7;i++)
       DateTime<i>=EEBuffer<i>;
       DateTime=0x0; */
      }
   /*////////////////////////////////////////////////////*/
    if(Flag_ReceFinish)
      {
       Flag_ReceFinish=low;
       CheckSum=ReceBuf+ReceBuf+ReceBuf+ReceBuf+ReceBuf+ReceBuf
+ReceBuf;
       if(CheckSum==ReceBuf)
         {
          CurrentTime.sec=ReceBuf;
          CurrentTime.min=ReceBuf;
          CurrentTime.hour=ReceBuf;
          CurrentTime.day=ReceBuf;
          CurrentTime.weekday=CalcWeekDay(ReceBuf,ReceBuf,ReceBuf);
          CurrentTime.month=ReceBuf;
          CurrentTime.year=ReceBuf;
         }
      }
}
}

/********************************************************/
start_ini(void)
{
_nop_();
_nop_();
EA=low;
TH0=0XEC;
TL0=0X99;
TH1=230;
TH1=230;
TMOD=0X21;
TR0=ET0=TR1=ES=EA=high;
}
/********************************************************/
timer0(void) interrupt 1   using 2
{
   TL0=0X87;
   TH0=0XEC;
/*TH0=0XFF;
   TL0=0Xc0;*/
   TR0=high;
   SecCounter++;

   if(Flag_Rece)
   {
       Rece500ms++;
       if(Rece500ms&gt;=100)
         {
         Rece500ms=0;
         Flag_Rece=low;
         ReceCounter=0;
         }
   }

   if(SecCounter&gt;=200)
   {
      Flag_Sec=high;
      TR0=low;
      DelayNus(8);
      TR0=high;
      SecCounter=0;
   }
   Display();
}

Serial(void) interrupt 4
{
if(RI)
    {
   RI=LOW;
   if(ReceCounter&gt;9){ReceCounter==0;}
   if(ReceCounter==0 &amp;&amp; SBUF==0X68)
      {
          Flag_Rece=HIGH;
          ReceBuf=0x68;
          ReceCounter=0x0;
      }
   if(Flag_Rece)
      {
         ReceBuf=SBUF;
         ReceCounter++;
         Rece500ms=0;
         if(ReceCounter&gt;=8)
            {
            Flag_ReceFinish=high;
            Rece500ms=0;
            ReceCounter=0;
            Flag_Rece=low;
            }
      }
    }
   TI=low;
}
/*********************************************************/
DataToDisBuf(void)
{
DisMode=1;
switch(DisMode)
{
   case 0:
      DisBuf=Segment;    /*Hour Minute*/
      DisBuf=Segment;
      DisBuf=Segment;
      DisBuf=Segment;
       break;
   case 1:
       DisBuf=Segment;    /*Month Day*/
      DisBuf=Segment;
      DisBuf=Segment;
      DisBuf=Segment;
       break;
   case 2:
      DisBuf=Segment;    /*Year Week*/
      DisBuf=Segment;
      DisBuf=Segment;
      DisBuf=Segment;
       break;
   case 3:
      DisBuf=Segment;                  /*Second only*/
      DisBuf=Segment;
      DisBuf=Segment;
      DisBuf=Segment;
       break;
   }
}

Display(void)
{
   P0=DisBuf;
   switch(DisBit)
      {
       case 0:

             P1_1=HIGH;
             P1_2=HIGH;
             P1_3=HIGH;
             P1_0=LOW;
             break;
       case 1:
             P1_0=HIGH;
             P1_2=HIGH;
             P1_3=HIGH;
             P1_1=LOW;
             break;
       case 2:
             P1_0=HIGH;
             P1_3=HIGH;
             P1_1=HIGH;
             P1_2=LOW;
             break;
       default:
             DisBit=255;
             P1_0=HIGH;
             P1_2=HIGH;
             P1_1=HIGH;
             P1_3=LOW;
             break;
      }
DisBit++;
}


CalcWeekDay(unsigned char year,unsigned char month,unsigned char day)
{
if(month&gt;2)
   {month-=2;}
else
   {
   if(month&lt;3){month+=10;year--;}
   }
return((year+(year/4)+((13*month-1)/5)+day)%7);
}

CalcDaysThisMonth(uchar year,uchar month)
{

   switch(month)
         {
         case 1:
         case 3:
         case 5:
         case 7:
         case 8:
         case 10:
         case 12:
                  month=31;break;
         case 4:
         case 6:
         case 9:
         case 11:
                  month=30;break;
         case 2:
                  if(year%4==0 &amp;&amp; year%100!=0 || year%400==0)
                  month=29;
                  else
                  month=28;
                  break;
         }
      return(month);
}

/****************************************************************/
CalcCalendar()
{
CurrentTime.sec++;
if(CurrentTime.sec&gt;59)
    {
      CurrentTime.sec=0;
      CurrentTime.min++;
      if(CurrentTime.min&gt;59)
         {
         CurrentTime.min=0;
         CurrentTime.hour++;
         if(CurrentTime.hour&gt;23)
            {
                CurrentTime.hour=0;
                CurrentTime.day++;
                if(CurrentTime.day&gt;CalcDaysThisMonth
(CurrentTime.year,CurrentTime.month))
                   {
                     CurrentTime.day=1;
                     CurrentTime.month++;
                     if(CurrentTime.month&gt;12)
                        {
                        CurrentTime.month=1;
                        CurrentTime.year++;
                        }
                   }
            }
         CurrentTime.weekday=CalcWeekDay
(CurrentTime.year,CurrentTime.month,CurrentTime.day);
         }
    }
}


DelayNus(uchar DelayNum)
{
register i;
for(i=0;i </P>

ikssy 发表于 2005-6-13 16:51:38

<P>好东西]</P>
页: [1]
查看完整版本: C51 时钟源代码[P0口出段码,P1口出位码,四位显示,用PC机校时