数字万年历程序
- 格式:doc
- 大小:69.00 KB
- 文档页数:10
display(minute&0x0f,5);
_nop_();
_nop_();
DS1302Write(0x82,minute);
DS1302Write(0x82,minute);
break;
case 0xdf: second=second-1;
if(second<0)
{
second=59;
_nop_();
}
}
void Init()
{
Init_DS1302() ;
IT0=0;//低电平触发中断
EX0=1;
IT1=1;//下降沿触发中断
EX1=1;
TMOD=0x01;
TH0=0xd8;
TL0=0xf0;
ET0=1;
EA=1;
TR0=1;
count=0;
}
void int0() interrupt 0//根据P3^1与P3^4状态确定数字的增减
DS1302Write(0x88,month);
break;
case 0xfb: dae=dae+1;
if(dae>31)
{
dae=1;
}
display((dae&0xf0)>>4,7);
_nop_();
_nop_();
display(dae&0x0f,8);
_nop_();
_nop_();
DS1302Write(0x86,dae);
{
if(f==0)
{
display(2,1);
_nop_();
_nop_();
display(0,2);
_nop_();
_nop_();
year=DS1302Read(0x8d);//显示年份
display((year&0xf0)>>4,3);
_nop_();
_nop_();
display(year&0x0f,4);
delayus(2);
SCLK=1;//时钟线拉高,制造上升沿,IO的数据被传输
delayus(2);
SCLK=0;//时钟线拉低,为下一个上升沿做准备
dat>>=1;//数据右移一位,准备传输下一位数据
}
}
uchar DS1302ReadByte()//读8位数据
{
uchar i,dat;
delayus(2);
DS1302Write(0x86,dae);//初始日值为1
DS1302Write(0x88,month);
DS1302Write(0x8c,year);
DS1302Write(0x90,0x01);//充电
DS1302Write(0xc0,0xf0);//初始化一次标示
}
void Dispaly_Time()//根据标志位显示相应的数据
break;
case 0xbf:
case 0x7f: tf=0xfe;
break;
}
}
if(SUB==0)
{
switch(tf)
{
case 0xfe: year=year-1;
if(year<0)
{
year=99;
}
display((year&0xf0)>>4,3);
_nop_();
_nop_();
break;
case 0xef: minute=minute+1;
if(minute>59)
{
minute=0;
}
display((minute&0xf0)>>4,4);
_nop_();
_nop_();
display(minute&0x0f,5);
_nop_();
_nop_();
DS1302Write(0x82,minute);
{
while(us--)
{
_nop_();
}
}
void DS1302WriteByte(uchar dat)//写8位数据
{
uchar i;
SCLK=0;//初始时钟线置为0
delayus(2);
for(i=0;i<8;i++)//开始传输8个字节的数据
{
IO=dat&0x01;//取最低位,注意DS1302的数据和地址都是从最低位开始传输的
break;
case 0xf7: hour=hour+1;
if(hour>23)
{
hour=0;
}
display((hour&0xf0)>>4,1);
_nop_();
_nop_();
display(hour&0x0f,2);
_nop_();
_nop_();DS13源自2Write(0x84,hour);
display(hour&0x0f,2);
_nop_();
_nop_();
DS1302Write(0x84,hour);
break;
case 0xef: minute=minute-1;
if(minute<0)
{
minute=59;
}
display((minute&0xf0)>>4,4);
_nop_();
_nop_();
display(dae&0x0f,8);
_nop_();
_nop_();
DS1302Write(0x86,dae);
break;
case 0xf7: hour=hour-1;
if(hour<0)
{
hour=23;
}
display((hour&0xf0)>>4,1);
_nop_();
_nop_();
display(year&0x0f,4);
_nop_();
_nop_();
DS1302Write(0x8c,year);
DS1302Write(0x8c,year);
break;
case 0xfd: month=month-1;
if(month<1)
{
month=12;
}
display((month&0xf0)>>4,5);
sbit SCLK=P1^1;//DS1302时钟口
sbit RST=P1^2;//DS1302复位
sbit ADD=P3^1;//数字加
sbit SUB=P3^4;//数字减
uchar year=0x14;
uchar month=0x01;
uchar dae=0x01;
uchar hour=0;
uchar minute=0;
{
int i,j;
if(ADD==0)
{
switch(tf)
{
case 0xfe: year=year+1;
if(year>99)
{
year=0;
}
display((year&0xf0)>>4,3);
_nop_();
_nop_();
display(year&0x0f,4);
_nop_();
_nop_();
{
RST=0;//初始RST线置为0
SCLK=0;//初始时钟线置为0
RST=1;//初始RST置为1,传输开始
DS1302WriteByte(cmd);//传输命令字,要写入的时间/日历地址
DS1302WriteByte(dat);//写入要修改的时间/日期
SCLK=1;//时钟线拉高
RST=0;//读取结束,RST置为0,结束数据的传输
case 0x7f: tf=0xfe;
}
uchar DS1302Read(uchar cmd)//读取DS1302中的数据,cmd为相应寄存器的地址
{
uchar dat;
RST=0;//初始RST线置为0
SCLK=0;//初始时钟线置为0
RST=1;//初始RST置为1,传输开始
DS1302WriteByte(cmd);//传输命令字,要读取的时间/日历地址
for(i=0;i<8;i++)
{
dat>>=1;//要返回的数据左移一位
if(IO==1)//当数据线为高时,证明该位数据为1
dat|=0x80;//要传输数据的当前值置为1,若不是,则为0
SCLK=1;//拉高时钟线delayus(2);
SCLK=0;//制造下降沿
delayus(2);
}
return dat;//返回读取出的数据
break;
case 0xdf: second=second+1;
if(second>59)
{
second=0;
}
display((second&0xf0)>>4,7);
_nop_();
_nop_();
display(second&0x0f,8);
_nop_();
_nop_();
DS1302Write(0x80,second);
display(hour&0x0f,2);
_nop_();
_nop_();
display(10,3);
_nop_();
_nop_();
minute=DS1302Read(0x83);//显示分钟