cpubbs论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

LabVIEW+单片机学习套件全套教程资料下载[免费]LabVIEW论坛精华列表贴USB0816数据采集卡《LabVIEW宝典》
LabWindows/CVI论坛精华贴NET0816以太网数据采集卡RC0210远程设备授权系统 关闭关停锁定打开设备 户外分布式数据采集
NET1624低速高精度以太网数据采集卡WIFI0824SD无线WIFI网络数据采集卡脱机运行 SD存储 小尺寸微型 串口采集远程采集 安卓 手持移动采集 纪录仪
查看: 1426|回复: 1

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

[复制链接]
发表于 2004-11-6 02:51:09 | 显示全部楼层 |阅读模式
/***********************************************************/
/*            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(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=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]=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[0]=0x0; */
      }
   /*////////////////////////////////////////////////////*/
    if(Flag_ReceFinish)
      {
       Flag_ReceFinish=low;
       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=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[0]=0x68;
          ReceCounter=0x0;
        }
     if(Flag_Rece)
        {
         ReceBuf[ReceCounter]=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[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=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>
发表于 2005-6-13 16:51:38 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|cpubbs论坛. ( 粤ICP备09171248号 )

GMT+8, 2025-5-5 02:15 , Processed in 0.968788 second(s), 9 queries , Gzip On, File On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表