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>=100)
{
Rece500ms=0;
Flag_Rece=low;
ReceCounter=0;
}
}
if(SecCounter>=200)
{
Flag_Sec=high;
TR0=low;
DelayNus(8);
TR0=high;
SecCounter=0;
}
Display();
}
Serial(void) interrupt 4
{
if(RI)
{
RI=LOW;
if(ReceCounter>9){ReceCounter==0;}
if(ReceCounter==0 && SBUF==0X68)
{
Flag_Rece=HIGH;
ReceBuf=0x68;
ReceCounter=0x0;
}
if(Flag_Rece)
{
ReceBuf=SBUF;
ReceCounter++;
Rece500ms=0;
if(ReceCounter>=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>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 </P> <P>好东西]</P>
页:
[1]