/*
该程序首要完成如下的功用:
从DS1302的秒寄存器中,读出秒的数值;
将秒的数值用两个数码管显现出来。
*/
#include
#define uchar unsigned char
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
sbit RST=P1^2;
sbit DATA=P1^1;
sbit SCLK=P1^0;
//延时n us函数
void Delayus(uchar n)
{
uchar i;
for(i=0;i { ; } }
//往DS1302写入数据
void WriteDs1302(uchar dat)
{
uchar i;
SCLK=0;
Delayus(2);
for(i=0;i<8;i++)
{
DATA=dat&0x01;
Delayus(2);
SCLK=1;
Delayus(2);
SCLK=0;
dat>>=1;
Delayus(2);
}
}
// 往DS1302中写入指令及数据
void WriteSetDs1302(uchar cmd,uchar dat)
{
RST=0;
SCLK=0;
RST=1;
Delayus(2);
WriteDs1302(cmd);
WriteDs1302(dat);
SCLK=1;
RST=0;
}
//从DS1302中读出一个字节
uchar ReadDs1302()
{
uchar dat,i;
Delayus(2);
//SCLK=1;
Delayus(2);
for(i=0;i<8;i++)
{
dat>>=1;
if(DATA==1)
{
dat|=0x80;
}
SCLK=1;
Delayus(2);
SCLK=0;
Delayus(2);
}
return dat;
}
//从DS1302的特定的寄存器中,读出数据
uchar ReadSetDs1302(uchar cmd)
{
uchar dat;
RST=0;
SCLK=0;
RST=1;
WriteDs1302(cmd);
dat=ReadDs1302();
SCLK=1;
RST=0;
return dat;
}
//显现函数
void Dispaly(uchar dat)
{
P0=table[dat];
}
//DS1302初始化函数
void Ds1302Init()
{
WriteSetDs1302(0x8e,0x00);//去除写保护
WriteSetDs1302(0x80,0x05);//往秒寄存器中写入数据
WriteSetDs1302(0x8e,0x80);//敞开写保护
}
//1ms的推迟函数
void delay1ms()
{
unsigned char i,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++)
;
}
// n ms 的延时函数
void Delayms(uchar n)
{
uchar i;
for(i=0;i { delay1ms(); } }
//主函数
void main()
{
uchar sec,num1,num2;
Ds1302Init();
P2=0Xfc;
while(1)
{
sec=ReadSetDs1302(0x81); //从DS1302的秒寄存器中读出秒值
num1=(sec&0x70)>>4; //别离出秒值的十位数
num2=sec&0x0f; //别离出秒值的个位数
P2=0xfd;
Dispaly(num1);
Delayms(5);
P2=0xfe;
Dispaly(num2);
Delayms(5);
}
}
同理,可读出分、时,月、年等时刻信息,并显现出来。