当前位置:文档之家› DS1302时钟芯片单片机控制操作步骤

DS1302时钟芯片单片机控制操作步骤

DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。

采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。

DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。

DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后备电源双电源引脚,同时提供了对后备电源进行涓细电流充电的能力.
RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。

RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。

当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。

如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。

上电运行时,在Vcc>2.0V之前,RST必须保持低电平。

只有在SCLK 为低电平时,才能将RST置为高电平。

时钟相关寄存器:时钟数据为BCD码格式,秒寄存器的CH位:时钟暂停位,为1是,振荡器停止工作,进入低功耗。

小时寄存器:最高位12/24:为1时表示12小时模式,0表示24小时模式。

第5位A/P,1表示下午,0表示上午。

DS1302命令控制字:
DS1302的RAM共31个,寄存器地址范围:C0H~FDH,其中奇数为读操作,偶数为写操作
DS1302的读写时序:通过控制RST端为高电平启动读写操作,首先发送8位命令控制字,指明读操作还是写操作,及读写的地址。

数据从低到高位顺序传输。

上电时,RST脚必须为低电平,当把RST置为高电平前,SCLK必须为低电平。

写过程:
一、启动准备:RST为低电平,SCLK为低电平--
PORTB&=~(1<<PB2); PORTB&=~(1<<PB0);
二、启动读写开始信号:将RST置为高电平--- PORTB|=(1<<PB2);
三、发送要写入地址的命令字节数据,如写秒寄存器,命令字节为80H,write_byte(0x80);
四、延时10ms,SCLK 置低电平,----delay(10);PORTB&=~(1<<PB0);
五、发送要写入秒寄存器的数据; write_byte(0x02);
六、结束写入过程:SCLK清0,RST置为低电平。

PORTB&=~(1<<PB2); PORTB&=~(1<<PB0);
读过程:
一、启动准备:RST为低电平,SCLK为低电平--
PORTB&=~(1<<PB2); PORTB&=~(1<<PB0);
二、启动读写开始信号:将RST置为高电平--- PORTB|=(1<<PB2);
三、发送要读取数据的地址的命令字节数据,如读秒寄存器,命令字节为81H,write_byte(0x81);
四、延时10ms,SCLK 置低电平,----delay(10);PORTB&=~(1<<PB0);
五、读取秒寄存器的数据; read_byte(0x02);
六、结束读取过程:SCLK清0,RST置为低电平。

PORTB&=~(1<<PB2); PORTB&=~(1<<PB0);
写入一个字节数据的代码:
/********向DS1302写一个字节数据********/
void write_byte(uchar dat)
{
uchar i;
for(i = 0;i < 8;i++) //写8位,低位在前
{
PORTB&=~(1<<PB0);//SCLK置0,产生移位时钟
if(dat & 0x01) //写数据位
{
PORTB|=(1<<PB1); //如果写入字节的第0位为1,则PB1脚置1
}
else
{
PORTB&=~(1<<PB1); // //如果写入字节的第0位为0,则PB1脚置0 }
Delay_us(10); //延时
PORTB|=(1<<PB0); //SCLK置1,产生移位时钟
dat >>= 1; //数据右移1位
}
}
读取一个字节的过程:
/********从DS1302读一个字节数据********/
uchar read_byte(void)
{
uchar i,dat = 0; //dat存放读出的数据,初始化为0
DDRB|=(1<<PB1); //PB1置为输入
PORTB&=~(1<<PB1); //不带上位电阻
for(i= 0;i< 7;i++) //读7位(注意,不是8位
{
PORB|=(1<<PB0); //SCLK 置1
Delay_us(10);
PORTB&=~(1<<PB0); //SCLK 置0
Delay_us(10); //延时
if(PINB&0x02) //读数据端口状态
{dat=dat|0x80;} //如果PB1为1,则将dat 的最高位置1
else
{dat=dat&0x7f;} 如果PB1为0,则将dat 的最高位置0
PORB|=(1<<PB0); //SCLK 置1
dat=dat>>1; //数据右移一位
}
DDRB&=~(1<<PB1); // 恢复为输出
return dat; //返回读出的数据
}
小企鹅diy 科学探究学习网
更多文章转到/wqb_lmkj/blog文章分类单片机。

相关主题