|
/***********************************************************/
/* 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>=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[0]=0x68;
ReceCounter=0x0;
}
if(Flag_Rece)
{
ReceBuf[ReceCounter]=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[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>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> |
|