新闻中心

EEPW首页>嵌入式系统>设计应用> 时钟芯片DS1302程序案例

时钟芯片DS1302程序案例

作者: 时间:2016-11-24 来源:网络 收藏

/*

本文引用地址: //m.amcfsurvey.com/article/201611/320768.htm

该程序主要实现如下的功能:

从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);

}

}

同理,可读出分、时,月、年等时间信息,并显示出来。



评论


技术专区

关闭