DS1302实时时钟电路控制指令表

合集下载

时间控制模块—DS1302芯片的控制编程

时间控制模块—DS1302芯片的控制编程

定时器/计数器1-TCNT1H和TCNT1L
TCNT1H和TCNT1L组成了T/C的数据寄存器TCNT1。
定时器/计数器中断标志寄存器-TIFR
T/C1输 入捕捉 标志位
T/C1输 出比较B 匹配标 志位 T/C1溢出标志 (普通模式和 CTC模式时)
如何写表 达式判断 是否有溢 出 实验板上的主控芯片AVR ATMega128:
有四个定时器/计数器 – 两个具有独立预分频器、比较器功能、PWM输出的 8位定时器/计数器(T/C0, T/C2 ) – 两个具有预分频器、比较器功能、 PWM输出、捕 捉功能的16位定时器/计数器(T/C1, T/C3 )
本堂课主要讨论 定时器/计数器1
4.中断服务函数
//外部中断函数
SIGNAL(SIG_INTERRUPT5) {

}
second=0;//中断发生后需做的事情
三、DS1302模块 1.简单介绍
时钟计数功能,年计数可达2100。
DS1302包括时钟/日历寄存器和31字节的
数据暂存寄存器。
2.如何将年月日写入DS1302中
模块电路功能编程(下)
时间控制模块—DS1302芯片的控制编程
双C工作室
复习
1.实验板的电路图 – 控制编程--针对实验板 – 所有的元器件控制--要查看电路图--确定要 它们是由哪些端口或哪些接口来控制
2.实验板上控制数码管 – 用SPI发送数据到74HC595上,PB端口的高 四位作为数码管选通通道
RST_SET; /*启动DS1302总线*/ /*写入目标地址:addr*/ IO_OUT; addr = addr & 0xFE;/*最低位置零*/ for (i = 0; i < 8; i ++) { if (addr & 0x01) IO_SET; else IO_CLR; SCK_SET; SCK_CLR; addr = addr >> 1; }

给出DS1302的典型应用原理图

给出DS1302的典型应用原理图

给出DS1302的典型应用原理图1. 概述本文将介绍DS1302实时时钟芯片的典型应用原理图。

DS1302是一款非易失性实时时钟芯片,在许多电子产品中被广泛使用。

它具有低功耗、精确计时等优点,适用于需要具备时间功能的电路设计。

2. DS1302原理图下面是DS1302的典型应用原理图(供参考):电源电路:--------------VCC --- 5V电源GND --- 接地--------------数据通信和控制线:---------------------------RST --- 复位信号IO --- 数据输入/输出SCLK --- 时钟信号CE --- 芯片使能信号---------------------------外部时钟电路:--------------------R --- 32.768kHz晶振C --- 晶振接地--------------------3. DS1302应用原理图解析•电源电路:DS1302芯片需要提供5V电源和接地,确保芯片正常工作。

•数据通信和控制线:RST、IO、SCLK和CE是DS1302与其他电路进行数据通信和控制的接口线。

RST用于复位芯片,IO用于数据的输入和输出,SCLK为时钟信号,CE为芯片的使能信号。

•外部时钟电路:DS1302芯片需要连接一个外部的32.768kHz晶振,以提供精确的时钟输入。

4. DS1302应用原理图使用说明1.连接电源电路:将VCC引脚连接至5V电源,将GND引脚连接至接地。

2.连接数据通信和控制线:根据实际需求,将RST、IO、SCLK和CE引脚连接至其他电路。

3.连接外部时钟电路:将R引脚连接至外部32.768kHz晶振,将C引脚接地。

5. 注意事项•在连接DS1302芯片时,务必确保正确连接电源和接地,以避免芯片损坏。

•在连接数据通信和控制线时,需要按照芯片的说明书来引脚连接,避免误接或引脚连接错误。

•外部时钟电路的连接需要注意晶振的正确极性,并确保晶振稳定工作。

ds1302时钟程序详解,ds1302程序流程图

ds1302时钟程序详解,ds1302程序流程图

ds1302时钟程序详解,ds1302程序流程图(C程序)ds1302时钟程序详解DS1302 的控制字如图2所示。

控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。

数据输入输出(I/O)在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。

同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。

DS1302的寄存器DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字见表1。

此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。

时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。

DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。

ds1302程序流程图DS1302实时时间流程图4示出DS1302的实时时间流程。

根据此流程框图,不难采集实时时间。

下面结合流程图对DS1302的基本操作进行编程:根据本人在调试中遇到的问题,特作如下说明:DS1302 与微处理器进行数据交换时,首先由微处理器向电路发送命令字节,命令字节最高位MSB(D7)必须为逻辑1,如果D7=0,则禁止写DS1302,即写保护;D6=0,指定时钟数据,D6=1,指定RAM数据;D5~D1指定输入或输出的特定寄存器;最低位L SB(D0)为逻辑0,指定写操作(输入), D0=1,指定读操作(输出)。

ds1302实时时钟程序说明

ds1302实时时钟程序说明
下面是DS1302内部寄存器的地址的说明。
DS1302实时时钟在数码管上进行实时显示的程序
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit rst=P2^4;
sbit io=P2^0;
}
write_ds1302(0x8e,0x80); //进行写保护
}
void read_rtc()
{
uchar i;
for(i=0;i<7;i++)
{
time_data[i]=read_ds1302(read_add[i]);
}
}
void time_pros()
{
disp[0]=time_data[6]%16;//将BCD码(这里与十六进制没有区别)进行十位个位的分离
{
j=time_data[i]/10;//十位5
time_data[i]%=10;//各位8
time_data[i]=time_data[i]+j*16;
}
write_ds1302(0x8e,0x00);//去除写保护
for(i=0;i<7;i++)
{
write_ds1302(write_add[i],time_data[i]);
disp[1]=time_data[6]/16;
disp[2]=17;
disp[3]=time_data[5]%16;
disp[4]=time_data[5]/16;
disp[5]=17;

DS1302时钟程序(完整版),液晶显示

DS1302时钟程序(完整版),液晶显示

#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar table0[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39}; //液晶显示数字0——9代码sbit SCLK=P1^0;sbit DATA=P1^1;sbit CE=P1^2;sbit RS=P2^0;sbit RW=P2^1;sbit EN=P2^2;sbit FB=P0^7;sbit start=P1^4;sbit stop=P1^5;uchar i;/*******************延时n微秒函数*****************/void delaynus(uchar n) //n us延时函数{// uchar i;for(i=n;i>0;i--);}/*******************写数据函数*****************/void write1302(uchar add,uchar dat){CE=0;SCLK=0;CE=1;for(i=0;i<8;i++) //写入地址{DATA=add&0x01;SCLK=1;SCLK=0;add>>=1;}for(i=0;i<8;i++) //写入数据{DATA=dat&0x01;SCLK=1;SCLK=0;dat>>=1;}SCLK=1;CE=0;}/*******************读数据函数*****************/uchar read1302(uchar add){uchar dat;CE=0;SCLK=0;CE=1;for(i=8;i>0;i--) //写入地址{DATA=add&0x01;SCLK=1;SCLK=0;add>>=1;}for(i=8;i>0;i--) //读出数据/********************为神马???**************************/{dat>>=1;if(DATA==1)dat=dat|0x80;SCLK=1;SCLK=0;}SCLK=1;CE=0;return dat;}/*******************DS1302初始化函数*****************/void init1302(){uchar flag;flag=read1302(0x81);if(flag&0x80){write1302(0x8e,0x00);write1302(0x80,0x00);write1302(0x82,(((1/10)<<4)|(1%10)));write1302(0x84,(((20/10)<<4)|(20%10)));write1302(0x86,(((19/10)<<4)|(19%10)));write1302(0x88,(((7/10)<<4)|(7%10)));write1302(0x8a,((2/10)<<4)|(2%10));write1302(0x8c,(((11/10)<<4)|(11%10)));write1302(0x90,0xa5); //充电。

DS1302实时时钟芯片应用

DS1302实时时钟芯片应用

DS1302实时实钟芯片应用(一)DS1302概述DS1302是DALLAS公司生产的绢流充电时钟芯片,内含有一个实时时钟/日历和31字节静态RAM,通过简单的串行接口与微控制器进行通信。

具有秒、分、时、日、周、月、年信息。

每月的天数和闰年的天数可自动调整。

时钟和RAM的读/写可以以一个字节或多达31个字节的形式进行传输。

DS1302工作时的功耗很低,保持数据和时钟信息时所需功率小于1mW。

有主电源和备用电源。

(二)DS1302的主要性能A. 实时时钟能计算到2099年B. 31字节静态RAMC. 串口通信方式D. 电压范围2~5.5V,2V时工作电流小于300nAE. 温度范围-40~+85℃(三)引脚及功能(四)DS1302的命令字每一次数据传送都由一字节命令字开始,其后紧跟一字节数据或多字节数据。

命令字如下:读写DS1302内部RAM命令字如下:(五)DS1302的数据传送通过把/RST拉至高电平来启动数据传送,将/RST拉至低电平则可终止数据传送,I/O引脚变为高阻状态。

数据输入时,在时钟的上升沿数据必须有效,而数据位在时钟的下降沿输出。

上电时,在Vcc≥2.5V之前,/RST必须为逻辑0。

此外,当把/RST拉至逻辑1时,SCLK必须为逻辑0。

跟随在写命令字节的8个SCLK周期之后,在下8个SCLK周期的上升沿输入数据字节,如果有额外的SCLK 周期,它们将被忽略,数据从最低位(位0)开始传送。

跟随在读命令字节的8个时钟周期之后,在下8个时钟周期的下将沿输出数据字节。

注意:被传送的第一个数据位发生在写命令字节的最后一位之后和第一个下将沿。

只要/RST保持高电平,如果有额外的时钟周期,它们将重新发送数据字节,这一操作使之具有连续的多字节的读能力。

另外,在时钟的每一个上升沿,I/O引脚为三态。

数据从最低位开始是传送。

DS1302的多字节读写:对时钟/日历寄存器进行多字节读写时,其命令字节BFH为读,BEH为写;当对RAM 进行多字节读写时,其命令字节FFH为读,FEH为写。

时钟芯片DS1302 的程序(C51程序)

时钟芯片DS1302 的程序(C51程序)模块名称:DS1302.c功能:实时时钟模块时钟芯片型号:DS1302 程序设计:zhaojunjie********************************************************************* /#includesbit T_CLK = P2^7; /*实时时钟时钟线引脚 */ sbit T_IO = P1^4; /*实时时钟数据线引脚 */ sbit T_RST = P1^5; /*实时时钟复位线引脚 */sbit ACC0 = ACC^0;sbit ACC7 = ACC^7;void RTInputByte(uchar); /* 输入 1Byte */uchar RTOutputByte(void); /* 输出?1Byte */void W1302(uchar, uchar);uchar R1302(uchar);void Set1302(uchar *); /* 设置时间 */void Bcd2asc(uchar,uchar *);void Get1302(uchar curtime[]); /* 读取1302当前时间 *//********************************************************************函数名:RTInputByte()功能:实时时钟写入一字节说明:往DS1302写入1Byte数据 (内部函数)入口参数:d 写入的数据返回值:无设计:zhaojunjie********************************************************************* **/void RTInputByte(uchar d){uchar i;ACC = d;for(i=8; i>0; i--){T_IO = ACC0; /*相当于汇编中的 RRC */T_CLK = 1;T_CLK = 0;ACC = ACC >> 1;}}/********************************************************************函数名:RTOutputByte()功能:实时时钟读取一字节说明:从DS1302读取1Byte数据 (内部函数)入口参数:无返回值:ACC设计:zhaojunjie********************************************************************* **/uchar RTOutputByte(void){uchar i;for(i=8; i>0; i--){ACC = ACC >>1; /*相当于汇编中的 RRC */ACC7 = T_IO;T_CLK = 1;T_CLK = 0;}return(ACC);}/********************************************************************函数名:W1302()功能:往DS1302写入数据说明:先写地址,后写命令/数据 (内部函数)调用:RTInputByte() , RTOutputByte()入口参数:ucAddr: DS1302地址, ucData: 要写的数据返回值:无设计:zhaojunjie********************************************************************* **/void W1302(uchar ucAddr, uchar ucDa){T_RST = 0;T_CLK = 0;T_RST = 1;RTInputByte(ucAddr); /* 地址,命令 */RTInputByte(ucDa); /* 写1Byte数据*/T_CLK = 1;T_RST = 0;}/********************************************************************函数名:R1302()功能:读取DS1302某地址的数据说明:先写地址,后读命令/数据 (内部函数)调用:RTInputByte() , RTOutputByte()入口参数:ucAddr: DS1302地址返回值:ucData :读取的数据设计:zhaojunjie********************************************************************* **/uchar R1302(uchar ucAddr){uchar ucData;T_RST = 0;T_CLK = 0;T_RST = 1;RTInputByte(ucAddr); /* 地址,命令 */ucData = RTOutputByte(); /* 读1Byte数据 */T_CLK = 1;T_RST = 0;return(ucData);}/********************************************************************函数名:BurstW1302T()功能:往DS1302写入时钟数据(多字节方式)说明:先写地址,后写命令/数据调用:RTInputByte()入口参数:pWClock: 时钟数据地址格式为: 秒分时日月星期年控制8Byte (BCD码)1B 1B 1B 1B 1B 1B 1B 1B返回值:无设计:zhaojunjie********************************************************************* **/void BurstW1302T(uchar *pWClock){uchar i;W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/T_RST = 0;T_CLK = 0;T_RST = 1;RTInputByte(0xbe); /* 0xbe:时钟多字节写命令 */for (i = 8; i>0; i--) /*8Byte = 7Byte 时钟数据 + 1Byte 控制*/{RTInputByte(*pWClock); /* 写1Byte数据*/pWClock++;}T_CLK = 1;T_RST = 0;}/********************************************************************函数名:BurstR1302T()功能:读取DS1302时钟数据说明:先写地址/命令,后读数据(时钟多字节方式)调用:RTInputByte() , RTOutputByte()入口参数:pRClock: 读取时钟数据地址格式为: 秒分时日月星期年7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B返回值:无设计:zhaojunjie********************************************************************* **/void BurstR1302T(uchar *pRClock){uchar i;T_RST = 0;T_CLK = 0;T_RST = 1;RTInputByte(0xbf); /* 0xbf:时钟多字节读命令 */for (i=8; i>0; i--){*pRClock = RTOutputByte(); /* 读1Byte数据 */pRClock++;}T_CLK = 1;}/********************************************************************函数名:BurstW1302R()功能:往DS1302寄存器数写入数据(多字节方式)说明:先写地址,后写数据(寄存器多字节方式)调用:RTInputByte()入口参数:pWReg: 寄存器数据地址返回值:无设计:zhaojunjie********************************************************************* **/void BurstW1302R(uchar *pWReg){uchar i;W1302(0x8e,0x00); /* 控制命令,WP=0,写操作*/T_RST = 0;T_CLK = 0;T_RST = 1;RTInputByte(0xfe); /* 0xbe:时钟多字节写命令*/for (i=31; i>0; i--) /* 31Byte 寄存器数据 */{RTInputByte(*pWReg); /* 写1Byte数据*/pWReg++;}T_CLK = 1;T_RST = 0;}/********************************************************************函数名:BurstR1302R()功能:读取DS1302寄存器数据说明:先写地址,后读命令/数据(寄存器多字节方式)调用:RTInputByte() , RTOutputByte()入口参数:pRReg: 寄存器数据地址返回值:无设计:zhaojunjie********************************************************************* **/void BurstR1302R(uchar *pRReg){uchar i;T_CLK = 0;T_RST = 1;RTInputByte(0xff); /* 0xff:时钟多字节读命令 */for (i=31; i>0; i--) /*31Byte 寄存器数据 */{*pRReg = RTOutputByte(); /* 读1Byte数据 */pRReg++;}T_CLK = 1;T_RST = 0;}/********************************************************************函数名:Set1302()功能:设置初始时间说明:先写地址,后读命令/数据(寄存器多字节方式)调用:W1302()入口参数:pClock: 设置时钟数据地址格式为: 秒分时日月星期年7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B返回值:无设计:zhaojunjie********************************************************************* **/void Set1302(uchar *pClock){uchar i;uchar ucAddr = 0x80;W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/for(i =7; i>0; i--){W1302(ucAddr,*pClock); /* 秒分时日月星期年*/pClock++;ucAddr +=2;}W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/}/********************************************************************函数名:Get1302()功能:读取DS1302当前时间说明:调用:R1302()入口参数:ucCurtime: 保存当前时间地址。

ds1302实时时钟程序

/* 时间:4月19日功能:使用ds1302实时时钟芯片,用共阴数码管显示时,分,秒*/#include<reg51.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charsbit io=P3^4;sbit cs=P3^5;sbit clk=P3^6;uchar code table1[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x80};uchar code table2[]={ //译码器与单片机的接线引脚P2.4 P2.3 P2.20xe3,0xe7,0xeb,0xef,0xf3,0xf7,0xfb,0xff};uchar time[7]={14,2,3,25,23,59,50}; //初始化实时时钟时间uchar register_wr[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};uchar register_re[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81}; uchar temp1[7];uchar shi,ge;void delay_ms(uchar t);void delay(); //大约10usvoid spi_writebyte(uchar dat);uchar spi_readbyte();void ds1302_spiwrite(uchar add,uchar dat);uchar ds1302_spiread(uchar add);void ds1302_init();void ds1302_run(); //ds1302全运行过程void display(); //共阴数码管显示过程void main(){ds1302_init();while(1){ds1302_run();display();}}void delay_ms(uchar t){uchar x,y;for(x=t;x>0;x--)for(y=110;y>0;y--);}void ds1302_run(){ //ds1302全运行过程uchar i;for(i=0;i<7;i++){ds1302_spiwrite(0x8e,0x80);//写保护,不让写temp1[i]=ds1302_spiread(register_re[i]); //将十六进制数转换成相同数字的十进制shi=temp1[i]/16;ge=temp1[i]%16;time[i]=shi*10+ge;}}void display(){P0=table1[time[4]/10]; P2=table2[0];delay_ms(1);P0=table1[time[4]%10]; P2=table2[1];delay_ms(1);P0=table1[16];P2=table2[2];delay_ms(1);P0=table1[time[5]/10]; P2=table2[3];delay_ms(1);P0=table1[time[5]%10]; P2=table2[4];delay_ms(1);P0=table1[16];P2=table2[5];delay_ms(1);P0=table1[time[6]/10];P2=table2[6];delay_ms(1);P0=table1[time[6]%10];P2=table2[7];delay_ms(1);}void ds1302_init(){uchar i;ds1302_spiwrite(0x8e,0x00); //wp是写允许位。

DS1302原理及程序说明

DS1302原理及程序说明DS1302 是DALLAS 公司推出的涓流充电时钟芯片,内含有一个实时时钟/日历和31字节静态RAM ,通过简单的串行接口与单片机进行通信。

实时时钟/日历电路提供秒、分、时、日、日期、月、年的信息,每月的天数和闰年的天数可自动调整,时钟操作可通过AM/PM 指示决定采用24 或12 小时格式。

DS1302 与单片机之间能简单地采用同步串行的方式进行,DS1302的引脚命名如图1-1所示。

通信仅需用到三根信号线:(1)CE 片选,(2)I/O 数据线,(3)SCLK 串行时钟,DS1302与CPU 的连接如图1-2所示。

时钟/RAM 的读/写数据以一个字节或多字节的字符组方式通信,DS1302工作时功耗很低,保持数据和时钟信息时功率小于1mW 。

DS1302具有双电源管脚,用于主电源和备份电源供应Vcc1,为可编程涓流充电电源附加七个字节存储器,它广泛应用于电话传真便携式仪器以及电池供电的仪器仪表等产品领域。

DS1302主要的性能指标如下:实时时钟具有能计算2100 年之前的秒、分、时、日、日期、星期、月、年的能力,还有闰年调整的能力31× 8 位暂存数据存储RAM 串行I/O 口方式,使得管脚数量最少宽范围工作电压2.0~ 5.5V工作电流2.0V 时,小于300nA读/写时钟或RAM 数据时有两种传送方式:单字节传送和多字节传送字符组方式8 脚DIP 封装或可选的8 脚SOIC 封装根据表面装配简单3 线接口与TTL 兼容Vcc=5V 。

DS1302的读写模式工作时序如图1-3和图1-4所示。

图1-3 单字节读模式图1-4 单字节写模式注:在多字节模式下,SCLK 发出同步脉冲,CS 须持续保持高电平直到多字节操作结束,图1-1 DS1302引脚图1-2 DS1302与CPU 接口DS1302内部寄存器的地址定义如表1-1所示。

表1-1 寄存器的地址及定义实验说明1. DS1302与51单片机的连接IO ——P2.7:串行数据输入/输出引脚SCLK ——P2.6:串行时钟引脚CE ——P2.4:片选CE2. LCD 与单片机连接;************************************************************************* ; LCD Module LMB1602 与单片机连接:;************************************************************************* ; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ;Vss Vdd V o RS R/W E D0 D1 D2 D3 D4 D5 D6 D7 BLA BLK ; 0V +5V 0V P32 P33 P34 ---------------- P1[0..7] ---------------- +5V 0V;*************************************************************************3. LCD 显示功能说明LCD1602显示格式如图1-5所示。

DS1302 时钟电路

时钟电路1应用:1.1需要显示时钟及日期或实现时钟控制的电子设备。

1.2本电路在HGT2110、HGT3101、HDM2100、HDM3200中成功应用。

2特性:2.1年、月、日、时、分、秒、星期的实时走时;2.2可设置为12小时制或24小时制走时;2.3日历时钟数据可读写,可启动写保护;2.4可接入3V电池,断电后由电池供电走时,电池供电通常可持续一年以上;2.5可对电池设置充电参数。

3核心部件:3.1DS1302,DIP8 或SOP8封装(推荐)。

4外围关键元件:4.132768Hz晶体振荡器;4.23V电池。

5设计注意事项:5.1晶体振荡器必须采用32768Hz,其引脚不得接入其它元件;5.2晶振引脚具有高阻抗特性,印制板漏电会导致停振。

设计时引脚应尽量短,远离周边元件或导线,并应大于2mm;5.3此器件对潮湿、低温敏感,推荐线路进行防潮处理;5.4不推荐使用大容量电容替代电池,电容引脚易与其它线路板接通造成其它线路板元件损坏。

6软件设计要点:6.1上电初始化必须设置为充电;6.2上电后对秒进行操作,可避免时钟锁定;6.3非写入数据操作后启动写保护;7原理图:7.1见DS1302.Ddb文件;8引脚说明或时序图:8.1见DS1302.pdf文件;9主要指标:10C语言例程:10.1本例在HDM3200消防电话总机中应用,CPU为ATmega32L ,工作频率为4MHz。

//************************************************************************// // 日历时钟DS1302公用变量说明 // // -------------------------------------------------------------------- // // uchar cale[7] 下标对应 0 1 2 3 4 5 6 // // year month day hour minute second week // // 年月日时分秒星期 // // write_cale(why) 将cale[]中指定的日期或时间写入dallas中 // // get_cale(why); 获得由why指定的日期或时钟,并且赋值给cale[why] // // why--指定年、周、月、日、时、分、秒中的一个, why可取year或 // // month或day或hour或minute或second或week // //************************************************************************// // -------------------------------------------------------------------- // // 充电设置 //// -------------------------------------------------------------------- // // 使用bttay_charger(uchar charge_set)函数,其中 // // charge_set: 0--不充电 4.3V时 0mA 0mA // // 1--2K充电 4.3V时 1.8mA 1.5mA // // 2--4K充电 4.3V时 0.9mA 0.8mA // // 3--8K充电 4.3V时 0.45mA 0.4mA // // 默认使用1只二极管建议使用4K电阻(0.9mA) // // -------------------------------------------------------------------- // //************************************************************************////DS1302时钟端口定义(以下端口可根据实际使用改变)-------------------------// #define SET_DS_RST SETBIT(PORTD,1) //ret=1#define CLK_DS_RST CLRBIT(PORTD,1) //ret=0#define SET_DS_SCL SETBIT(PORTB,7) //scl=1#define CLK_DS_SCL CLRBIT(PORTB,7) //scl=0#define SET_DS_DAT SETBIT(PORTB,2) //data=1#define CLK_DS_DAT CLRBIT(PORTB,2) //data=0#define IN_DS_DAT CLRBIT(DDRB,2) //data port is input#define OUT_DS_DAT SETBIT(DDRB,2) //data port is output#define CHK_DS_DAT CHKBIT(PINB,2) //get data#define dec_dallas(x) ((x/10)*16+x%10) //将10进制数转换为dallas数#define dallas_dec(x) ((x/16)*10+x%16) //将dallas数转换为10进制数//日历时钟全局变量定义---------------------------------------------------// unsigned char cale[7]; //日期缓存数据,下标用以下宏表示#define year 0 //年#define month 1 //月#define day 2 //日#define hour 3 //时#define minute 4 //分#define second 5 //秒#define week 6 //星期//**********************************************************//// DS1302日历时钟电路程序 //// ------------------------------------------------------ //// 涓流充电:read_dallas(0x91) write_dallas(0x90) //// 控制:read_dallas(0x8f) write_dallas(0x8e) //// 年:read_dallas(0x8d) write_dallas(0x8c) //// 周:read_dallas(0x8B) write_dallas(0x8a) //// 月:read_dallas(0x89) write_dallas(0x88) //// 日:read_dallas(0x87) write_dallas(0x86) //// 时:read_dallas(0x85) write_dallas(0x84) //// 分:read_dallas(0x83) write_dallas(0x82) //// 秒:read_dallas(0x81) write_dallas(0x80) //// ----------------------------------------------------- //// 内有31字节RAM 存储器,掉电失去: //// write_dallas(0xc0 - 0xfc) 偶数写 //// read_dallas(0xc1 - 0xfd) 奇数读 ////**********************************************************////**********************************************************//// 数据写入时钟芯片DS1302 //// ------------------------------------------------------ //// 功能:将数据ch写入地址为rtc_add的存储单元中 //// 输入参数:地址----uchar rtc_add //// 数据----uchar ch ////**********************************************************//void write_dallas(uchar rtc_add,uchar ch){unsigned char i;OUT_DS_DAT; //set DAT outputCLK_DS_SCL; //CLK=0SET_DS_RST; //RST=1for(i=0;i<8;i++){if(rtc_add & (0x01<<i)) SET_DS_DAT; //DAT=1else CLK_DS_DAT; //DAT=0SET_DS_SCL; //CLK=1CLK_DS_SCL; //CLK=0}for(i=0;i<8;i++){if(ch & (0x01<<i)) SET_DS_DAT; //DAT=1else CLK_DS_DAT; //DAT=0SET_DS_SCL; //CLK=1CLK_DS_SCL; //CLK=0}CLK_DS_RST; //RST=0 IN_DS_DAT; //set DAT input}g//**********************************************************//// 从时钟芯片DS1302 读出数据 //// ------------------------------------------------------ //// 功能:将数据ch写入由地址为rtc_add存储单元中读出数据 //// 输入参数:地址----uchar rtc_add //// 返回参数:数据----uchar read_dallas() ////**********************************************************// unsigned char read_dallas(unsigned char rtc_add){unsigned char i,j;j=0;OUT_DS_DAT; //set DAT outputCLK_DS_SCL; //CLK=0SET_DS_RST; //RST=1for(i=0;i<8;i++) {if(rtc_add & (0x01<<i)) SET_DS_DAT; //DAT=1else CLK_DS_DAT; //DAT=0SET_DS_SCL; //CLK=1CLK_DS_SCL; //CLK=0}IN_DS_DAT; //set DAT inputSET_DS_DAT; //DAT=1 置为上拉电阻for(i=0;i<8;i++) {if(CHK_DS_DAT) j|=0x01<<i; //j=DATSET_DS_SCL; //CLK=1CLK_DS_SCL; //CLK=0}CLK_DS_RST; //RST=0;return(j);}//**********************************************************//// 设置DS1302日期或时间 //// ------------------------------------------------------ //// 功能:将cale[]中指定的日期或时间设置到DS1302中 //// 输入参数:why--指定年、周、月、日、时、分、秒中的一个 //// 即year、week、month、day、hour、minute、second //// 以下例程将8点30分10秒写入DS1302: //// cale[hour]=8; //// cale[minute]=30; //// cale[second]=10; //// for(i=hour; i<=second; i++) write_cale(i); ////**********************************************************// void write_cale(uchar why){uchar d;write_dallas(0x8e,0x00); //关闭写保护d=dec_dallas(cale[why]);if(!why) write_dallas(0x8c,d); //写年else if(why<week) write_dallas(0x80+(10-why*2),d); //写月日时分秒else write_dallas(0x8a,d); //写星期write_dallas(0x8e,0x80); //启动写保护}//**********************************************************//// 获得DS1302指定的日期或时间 //// ------------------------------------------------------ //// 功能:将DS1302中指定的日期或时间赋给cale[why] //// 输入参数:why--指定年、周、月、日、时、分、秒中的一个 //// 即year、week、month、day、hour、minute、second //// 以下例程获取DS102当前时间,并将时间写入cale[]中: //// for(i=hour; i<=second; i++) get_cale(i); ////**********************************************************//void get_cale(uchar why){uchar d;if(!why) d=read_dallas(0x8d); //读年else if(why<week) d=read_dallas(139-(why*2)); //读月日时分秒 else d=read_dallas(0x8b); //读周cale[why]=dallas_dec(d);}//**********************************************************//// 快速获得月、日、时、分、秒 //// ------------------------------------------------------ //// 功能:获取DS1302当前月、日、时、分、秒写入cale[] ////**********************************************************//void fast_get_cale(void){uchar i;for(i=1;i<6;i++) cale[i]=dallas_dec(read_dallas(139-(i*2)));}//**********************************************************//// 获得秒 //// ------------------------------------------------------ //// 功能:直接返回当前秒 //// 返回参数:当前秒—get_second() ////**********************************************************//unsigned char get_second(void) {return dallas_dec(read_dallas(0x81));}//**********************************************************//// 电池充电设置 (应在电路上电时进行初始化设置) //// ------------------------------------------------------ //// 功能:对电池充电方式进行选择或设置 //// 输入参数:charge_set (取值见下表) //// 使用read_dallas(0x91) write_dallas(0x90) 进行设置 //// ------------------------------------------------------ //// 关于充电寄存器: //// D7 D6 D5 D4 D3 D2 D1 D0 //// -------------------------------------------------- //// | 充电设置1010 | 二极管设置|充电限流电阻| //// -------------------------------------------------- //// | 1010: 使能充电 |01: 接通1D |00:无 01:2K | //// | |10: 接通2D |10:4K 11:8K | //// -------------------------------------------------- //// ------------------------------------------------------- //// | 串联电阻 | 1只二极管 | 2只二极管 | //// charge_set: 0--不充电 4.3V时 0mA 0mA //// charge_set: 1--2K充电 4.3V时 1.8mA 1.5mA //// charge_set: 2--4K充电 4.3V时 0.9mA 0.8mA //// charge_set: 3--8K充电 4.3V时 0.45mA 0.4mA //// ------------------------------------------------------ //// 默认使用1只二极管建议使用4K电阻(0.9mA) ////**********************************************************//void bttay_charger(uchar charge_set){write_dallas(0x8e,0x00); //关闭写保护if(!charge_set) write_dallas(0x90,0x00);else write_dallas(0x90,(0xa4|charge_set));write_dallas(0x8e,0x80); //启动写保护}//主程序中应用方法Void main(void){……//时钟初始化bttay_charger(2); //电池充电初始化:0.9mA充电 write_dallas(0x8e,0x00); //关闭写保护write_dallas(0x90,(0xa4|2));write_dallas(0x8e,0x80); //启动写保护get_rili(second);if(rili[second]>59) //时钟自锁时去除锁保护{rili[second]=0;write_rili(second);}get_rili(year); //获得年fast_get_rili(); //获得年月日时分秒……while(1){……}}编著:王立新日期:2009年5月。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

TCS
DS
时钟多字节
R 1 1 0 0 0 0 0 RD/W C0写/C1读 31* 8 位暂存数据存储RAM, 地址C0H~FDH,其中奇数为 12 A 1 1 。。。 。。。 。。 RD/W 13 M 1 1 1 1 1 1 0 RD/W FC写/FD读 读操作,偶数为写操作。 RAM字符组 14 1 1 1 1 1 1 1 RD/W FE写/FF读 注:最低位LSB(D0)为逻辑0,指定写操作(输入), D0=1,指定读操作(输出)。 11
DS1302实时时钟电路控制指令表
序 分 号 类 1 2 3 4 5 6 7 8 时 钟 命令字节 7 1 1 1 1 1 1 1 1 6 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 3 0 0 0 0 1 1 1 1 2 0 0 1 1 0 0 1 1 1 0 十六进制 命令 秒 分
RAM数据0 RAM数据30
数据说明
WP
0
9 10
1 1
0 0
0 1
1 1
0 1
0 1
0 RD/W 90写/91读 1 RD/W BE写/BF读
TCS: 涓流充电选择 ,TCS=1010能涓流充 电,TCS=其它 禁止充电. DS: 二极管选择位,DS=01 选择一个二极 管,DS=10 选择两个,DS=00 或11,充电功 能也被禁止
12/24 小时标志 bit7=1,12 小时模式,AP=1 下午 模式
说明 数据
CH: 时钟停止位,CH=1 振荡器 停,CH=0 振荡器工作允许
数据 7 CH 0 12/24 0 0 0 0 0 0 0 10年 6 5 10秒 10分 小 A/P 时 10日 0 0 10 0 0 10 4 3 2 秒 分 小时 日 月 星期 年 0 0 0 0 0 0 1 0
0 RD/W 80写/81读 1 RD/W 82写/83读
0 RD/W 84写/85读 小时 1 RD/W 86写/87读 0 RD/W 88写/8Байду номын сангаас读 日 月
1 RD/W 8A写/8B读 星期 0 RD/W 8C写/8D读 年
WP为写保护位,WP=0 寄存器数据 能够写入.
1 RD/W 8E写/8F读 控制
相关文档
最新文档