11-1.c

来自「这是一个C51的时钟程序源代码.程序用P0口输出段码,P1口输出位码,四位显示,」· C语言 代码 · 共 327 行

C
327
字号
#define uchar unsigned char
#define ulong unsigned long 
#define uint unsigned int 
#include <intrins.h>
#include <reg51.h>
//#include
//#include
//#include
//#include


start_ini();
DelayNus(uchar  DelayNum);
Display(void);
CalcCalendar();
DataToDisBuf(void);
CalcDaysThisMonth(uchar year,uchar month);
CalcWeekDay(unsigned char year,unsigned char month,unsigned char day);
/*extern  M24CReadSub(char AccessNumber,char Wordaddress,char SlaveAddress);
extern  M24CWriteSub(char AccessNumber,char Wordaddress,char SlaveAddress);
*/
/*unsigned char data EEBuffer[10]={1,2,3,4,5,6,7,8};*/
unsigned char data ReceBuf[8]={0,0,0,0,0,0,0,0};

struct  time {
unsigned char  sec;
unsigned char  min;
unsigned char  hour;
unsigned char  day;
unsigned char  weekday;
unsigned char  month;
unsigned char  year;
}CurrentTime _at_ 0x18;/*TempTime;*/

uchar data DisBuf[4]={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[16]={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=0;
bit Flag_ReadTime=0;
bit Flag_Sec=0;
bit Flag_Rece=0;
bit Flag_ReceFinish=0;
bit Flag_DataGood=0;
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;

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

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

   if(Flag_Rece)
     {
       Rece500ms++;
       if(Rece500ms>=100)
         {
      Rece500ms=0;
           Flag_Rece=0;
           ReceCounter=0;
         }
     }

   if(SecCounter>=200)
     {
      Flag_Sec=1;
      TR0=0;
      DelayNus(8);
      TR0=1;
      SecCounter=0;
     }
   Display();
}

Serial(void) interrupt 4
{
if(RI)
    {
     RI=0;
     if(ReceCounter>9){ReceCounter==0;}
     if(ReceCounter==0 && SBUF==0X68)
        {
          Flag_Rece=1;
          ReceBuf[0]=0x68;
          ReceCounter=0x0;
        }
     if(Flag_Rece)
        {
         ReceBuf[ReceCounter]=SBUF;
         ReceCounter++;
         Rece500ms=0;
         if(ReceCounter>=8)
            {
              Flag_ReceFinish=1;
              Rece500ms=0;
              ReceCounter=0;
              Flag_Rece=0;
            }
        }
    }
   TI=0;
}
/*********************************************************/
DataToDisBuf(void)
{
DisMode=1;
switch(DisMode)
  {
   case 0:
        DisBuf[0]=Segment[CurrentTime.min%10];    /*Hour Minute*/
        DisBuf[1]=Segment[CurrentTime.min/10];
        DisBuf[2]=Segment[CurrentTime.hour%10];
        DisBuf[3]=Segment[CurrentTime.hour/10];
       break;
   case 1:
       DisBuf[0]=Segment[CurrentTime.day%10];    /*Month Day*/
        DisBuf[1]=Segment[CurrentTime.day/10];
        DisBuf[2]=Segment[CurrentTime.month%10];
        DisBuf[3]=Segment[CurrentTime.month/10];
       break;
   case 2:
        DisBuf[0]=Segment[CurrentTime.year%10];    /*Year Week*/
        DisBuf[1]=Segment[CurrentTime.year/10];
        DisBuf[2]=Segment[CurrentTime.weekday%10];
        DisBuf[3]=Segment[CurrentTime.weekday/10];
       break;
   case 3:
        DisBuf[0]=Segment[0];                    /*Second only*/
        DisBuf[1]=Segment[0];
        DisBuf[2]=Segment[CurrentTime.sec%10];
        DisBuf[3]=Segment[CurrentTime.sec/10];
       break;
   }
}

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

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


CalcWeekDay(unsigned char year,unsigned char month,unsigned char day)
{
if(month>2)
     {month-=2;}
else
     {
     if(month<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 && year%100!=0 || year%400==0)
                    month=29;
                  else
                    month=28;
                  break;
         }
      return(month);
}

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


DelayNus(uchar DelayNum)
{
register i;
for(i=0;i<DelayNum;i++)
    ;
    _nop_();
    _nop_();
    
}

⌨️ 快捷键说明

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