当前位置:文档之家› DS1302时钟C语言编程完整实例

DS1302时钟C语言编程完整实例

DS1302时钟C语言编程完整实例
DS1302时钟C语言编程完整实例

1 DS130

2 简介:

DS1302是美国D ALLAS 公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态R AM,采用S PI 三线接口与C PU 进行

同步通信,并可采用突发方式一次传送多个字节的时钟信号和R AM

数据。实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。工作电压宽达2.5~

5.5V。采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后背电源进行涓细电流充电的能力。DS1302的外部

引脚分配如图1所示及内部结构如图2所示。DS1302用于数据记录,特别是对某些具有特殊意义的数据点的记录上,能实现数据与出现该数据的时间同时记录,因此广泛应用于测量系统中。

图1 DS1302的外部引脚分配

图2 DS1302的内部结构

各引脚的功能为:

V cc1:主电源;Vcc2:备份电源。当V cc2>Vcc1+0.2V 时,由Vcc2向D S1302供电,当V cc2< Vcc1时,由V cc1向D S1302供电。

SCLK:串行时钟,输入,控制数据的输入与输出;

I/O:三线接口时的双向数据线;

CE:输入信号,在读、写数据期间,必须为高。该引脚有两个功能:第一,CE 开始控制字访问移位寄存器的控制逻辑;其次,

CE 提供结束单字节或多字节数据传输的方法。

DS1302有下列几组寄存器:

①D S1302有关日历、时间的寄存器共有12个,其中有7个寄存器(读时81h~8Dh,写时80h~8Ch),存放的数据格式为BCD 码形式,如图3所示。

图3DS1302有关日历、时间的寄存器小时寄存器(85h、84h)的位7用于定义D S1302是运行于12小时模式还是24小时模式。当为高时,选择

12小时模式。在12小时模式时,

位5是,当为1时,表示PM。在24小时模式时,位5是第二个10小时位。

秒寄存器(81h、80h)的位7定义为时钟暂停标志(CH)。当该位置为1时,时钟振荡器停止,DS1302处于低功耗状态;当该位置为

0时,时钟开始运行。控制寄存器(8Fh、8Eh)的位7是写保护位(WP),其它7位均置

为0。在任何的对时钟和R AM 的写操作之前,WP 位必须为0。当WP 位为1时,写保护位防止对任一寄存器的写操作。

②DS1302有关R AM 的地址

DS1302中附加31字节静态R AM 的地址如图4所示。

图4

③D S1302的工作模式寄存器

所谓突发模式是指一次传送多个字节的时钟信号和R AM 数据。

突发模式寄存器如图5所示。

图5

④此外,DS1302还有充电寄存器等。

2 读写时序说明

DS1302是S PI 总线驱动方式。它不仅要向寄存器写入控制字,还需要读取相应寄存器的数据。

要想与D S1302通信,首先要先了解DS1302的控制字。DS1302

的控制字如图6。

图6 控制字(即地址及命令字节)

控制字的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到D S1302中。

位6:如果为0,则表示存取日历时钟数据,为1表示存取R AM 数据;

位5至位1(A4~A0):指示操作单元的地址;

位0(最低有效位):如为0,表示要进行写操作,为1表示进行读操作。

控制字总是从最低位开始输出。在控制字指令输入后的下一个SCLK 时钟的上升沿时,数据被写入D S1302,数据输入从最低位(0 位)开始。同样,在紧跟8位的控制字指令后的下一个S CLK 脉冲的下降沿,读出D S1302的数据,读出的数据也是从最低位到最高位。数据读写时序如图7 。

图7 数据读写时序

具体操作见驱动程序。

3 电路原理图:

电路原理图如图8,DS1302与单片机的连接也仅需要3条线:CE 引脚、SCLK 串行时钟引脚、I/O 串行数据引脚,Vcc2为备用电源,外接32.768kHz 晶振,为芯片提供计时脉冲。

图8

以上部分是我拷贝别人的,在此我要感谢他,后面的部分全部是我自己写的,经过调试,系统运行稳定。

本来是不准备拷贝的,但考虑读者可能会读不懂程序,所以我才将核心器件的通信协议拿来给大家看看,当初老师叫我随便用C语言编写个单片机程序,于是我就找了个DS1302时钟的程序,写的有点长,可能是我第一次经验不够吧。

#include

#include

#define uchar unsigned char

#define uint unsigned int

uchar code table[]=

{0xc0,0xf9,0xa4,0xb0,

0x99,0x92,0x82,0xf8,

0x80,0x90,0x7f};// 0 1 2 3 4 5 6 7 8 9 .

sbit sclk=P3^6;

sbit data_io=P3^7;

sbit rst=P3^5;

sbit k1=P1^4;//mod功能选择键

sbit k2=P1^5;//-- (待机时按此键显示当前日期)

sbit k3=P1^6;//++ (待机时,按此键显示闹钟时间及状态,进入闹钟设定时此键是闹铃开关键)

sbit k4=P1^7;//退出设定

sbit didi=P3^0;//闹钟铃音

uchar mod;

uchar kaiguan;

bit keys(void);//函数申明

void show(x,y,z);//函数申明

void alarmshow(a_shi,a_fen);//函数申明

void delay(uint ms) //1ms延时子程序

{

uint i,j;

for(i=ms;i>0;i--)

for(j=244;j>0;j--);

}

void alarmdisplay(uchar shu,uchar wei)//闹钟显示子程序

{

P2=0x00;

P0=table[shu];

P2=(1<

delay(1);

P2=0x00;

if(kaiguan%2)//显示ON 12-23,闹钟时间显示格式

{

P0=0xc0;

P2=0x01;

delay(1);

P2=0x00;

P0=0xc8;

P2=0x02;

delay(1);

P2=0x00;

P0=0xf7;

P0=0x08;

delay(1);

P2=0x00;

}

else //显示OFF12-23,闹钟时间显示格式{

P2=0x00;

P0=0xc0;

P2=0x01;

delay(1);

P2=0x00;

P0=0x8e;

P2=0x02;

delay(1);

P2=0x00;

P0=0x8e;

P2=0x04;

delay(1);

P2=0x00;

}

}

void display(uchar shu,uchar wei)//显示函数{

P2=0x00;

P0=table[shu];

P2=(1<

delay(1);

P2=0x00;//显示该位数字

P0=0xbf;

P2=0x04;

delay(1);//显示横杠

P2=0x00;

P0=0xbf;

P2=0x20;

delay(1);//显示横杠

P2=0x00;

}

void weidisplay(void)//调时间时显示调整哪一个位{

uchar wei;

P2=0x00;

P0=0x7f;

if(mod==1||mod==4||mod==7)

wei=3;

if(mod==2||mod==5)

wei=0;

if(mod==3||mod==6)

wei=6;

P2=(3<

delay(3);

P2=0x00;

}

void alarm()//闹钟铃音子程序

{

uint i;

for(i=59;i>0;i--)

{

didi=1;

delay(1);

didi=0;

delay(1);

if(k1==0)

{

delay(5);

if(k1==0)

{

while(~k1);

break;

}

}

}

}

void write(uchar addr,uchar shu) //写两个字节

{

uchar temp,t;

rst=0;

sclk=0;

rst=1;

temp=addr;

for(t=0;t<8;t++)

{

if(temp&0x01)

data_io=1;

else data_io=0;

sclk=1;

delay(1);

sclk=0;

temp>>=1;

}

temp=shu;

for(t=0;t<8;t++)

{

if(temp&0x01)

data_io=1;

else data_io=0;

sclk=1;

delay(1);

sclk=0;

temp>>=1;

}

rst=0;

}

uchar read(uchar addr)//读一个字节{

uchar temp ,t;

rst=0;

sclk=0;

rst=1;

temp=addr;

for(t=0;t<8;t++)

{

if(temp&0x01)

data_io=1;

else data_io=0;

sclk=1;

sclk=0;

temp>>=1;

}

temp=0;

for(t=0;t<7;t++)

{

if(data_io==1)

temp=temp|0x80;

else temp=temp&0x7f;

sclk=1;

sclk=0;

temp>>=1;

}

return temp;

}

//************************************************8888

//************************************************8888

void main() //主函数

{

bit flag;

uchar shi,fen,miao,nian,yue,ri,a_shi,a_fen;//当前时间10:06:53 10-12-20 write(0x80,0x53);

write(0x82,0x06);//秒寄存器(初始化年月日,时分秒,闹铃)

write(0x84,0x10);//时寄存器

write(0x86,0x20);//日寄存器

write(0x88,0x12);//月寄存器

write(0x8c,0x10);//年寄存器

a_shi=0x07;//初始化闹钟时间7:30

a_fen=0x30;

while(1)

{

shi=read(0x85);//读小时

fen=read(0x83);//读分钟

miao=read(0x81);//读秒钟

if(kaiguan%2)//判断闹钟

{

if(a_shi==shi&&a_fen==fen)

alarm();

}

if(k3==0&&mod==0)//待机情况下按k3显示闹铃时间

{

delay(5);

if(k3==0&&mod==0)

{

while(~k3)

alarmshow(a_shi,a_fen);

}

}

if(k2==0&&mod==0)//待机情况下按k2显示日期

{

delay(5);

if(k2==0&&mod==0)

{

while(~k2)

show(nian,yue,ri);

}

}

flag=keys(); //按键标识位,有按键按下时flag=1;

if(1) //程序出现个小错误,原本这里是写flag,但没有办法,只能写1了,感兴趣的话自己分析

{

if(mod==1)

{

if(k4==0)//如果k4=0,则退出设定

{

delay(5);

if(k4==0)

{

while(~k4);

mod=0;

}

}

if(k2==0)

{

delay(5);

if(k2==0)

{

while(~k2);

fen=(fen>>4)*10+(fen&0x0f);

fen++;

if(fen==60)

fen=0;

fen=((fen/10)<<4)+((fen%10)&0x0f);

write(0x82,fen);

}

}

}

if(mod==2)

{

if(k4==0)//如果k4=0,则退出设定{

delay(5);

if(k4==0)

{

while(~k4);

mod=0;

}

}

if(k2==0)

{

delay(5);

if(k2==0)

{

while(~k2);

shi=(shi>>4)*10+(shi&0x0f);

shi++;

if(shi==24)

shi=0;

shi=((shi/10)<<4)+((shi%10)&0x0f);

write(0x84,shi);

}

}

}

if(mod==1)

{

if(k4==0)//如果k4=0,则退出设定{

delay(5);

if(k4==0)

{

while(~k4);

mod=0;

}

}

if(k3==0)

{

delay(5);

if(k3==0)

{

while(~k3);

fen=(fen>>4)*10+(fen&0x0f);

if(fen==0)

fen=60;

fen--;

fen=((fen/10)<<4)+((fen%10)&0x0f);

write(0x82,fen);

}

}

}

if(mod==2)

{

if(k4==0)//如果k4=0,则退出设定{

delay(5);

if(k4==0)

{

while(~k4);

mod=0;

}

}

if(k3==0)

{

delay(5);

if(k3==0)

{

while(~k3);

shi=(shi>>4)*10+(shi&0x0f);

if(shi==0)

shi=24;

shi--;

shi=((shi/10)<<4)+((shi%10)&0x0f);

write(0x84,shi);

}

}

}

if(mod==3)

{

if(k4==0)//如果k4=0,则退出设定{

delay(5);

if(k4==0)

{

while(~k4);

mod=0;

}

}

if(k2==0)

{

delay(5);

if(k2==0)

{

while(~k2);

ri=(ri>>4)*10+(ri&0x0f);

ri++;

if(ri==32)

ri=0;

ri=((ri/10)<<4)+((ri%10)&0x0f);

write(0x86,ri);

}

}

}

if(mod==4)

{

if(k4==0)//如果k4=0,则退出设定{

delay(5);

if(k4==0)

{

while(~k4);

mod=0;

}

}

if(k2==0)

{

delay(5);

if(k2==0)

{

while(~k2);

yue=(yue>>4)*10+(yue&0x0f);

yue++;

if(yue==13)

yue=0;

yue=((yue/10)<<4)+((yue%10)&0x0f);

write(0x88,yue);

}

}

}

if(mod==5)

{

if(k4==0)//如果k4=0,则退出设定

{

delay(5);

if(k4==0)

{

while(~k4);

mod=0;

}

}

if(k2==0)

{

delay(5);

if(k2==0)

{

while(~k2);

nian=(nian>>4)*10+(nian&0x0f);

nian++;

if(nian==100)

nian=0;

nian=((nian/10)<<4)+((nian%10)&0x0f);

write(0x8c,nian);

}

}

}

if(mod==3)//年月日减

{

if(k4==0)//如果k4=0,则退出设定

{

delay(5);

if(k4==0)

{

while(~k4);

mod=0;

}

}

if(k3==0)

{

delay(5);

if(k3==0)

{

while(~k3);

ri=(ri>>4)*10+(ri&0x0f);

if(ri==0)

ri=32;

ri--;

ri=((ri/10)<<4)+((ri%10)&0x0f);

write(0x86,ri);

}

}

}

if(mod==4)

{

if(k4==0) //如果k4=0,则退出设定{

delay(5);

if(k4==0)

{

while(~k4);

mod=0;

}

}

if(k3==0)

{

delay(5);

if(k3==0)

{

while(~k3);

yue=(yue>>4)*10+(yue&0x0f);

if(yue==0)

yue=32;

yue--;

yue=((yue/10)<<4)+((yue%10)&0x0f);

write(0x88,yue);

}

}

}

if(mod==5)

{

if(k4==0)//如果k4=0,则退出设定

{

delay(5);

if(k4==0)

{

while(~k4);

mod=0;

}

}

if(k3==0)

{

delay(5);

if(k3==0)

{

while(~k3);

nian=(nian>>4)*10+(nian&0x0f);

if(nian==0)

nian=100;

nian--;

nian=((nian/10)<<4)+((nian%10)&0x0f);

write(0x8c,nian);

}

}

}

//*############################################################################# ###

if(mod==6)

{

if(k4==0) //如果k4=0,则退出设定

{

delay(5);

if(k4==0)

{

while(~k4);

mod=0;

}

}

if(k3==0)

{

delay(5);

while(~k3);

kaiguan++;

}

if(k2==0)

{

delay(5);

while(~k2);

a_fen=(a_fen>>4)*10+(a_fen&0x0f);

a_fen++;

if(a_fen==60)

a_fen=0;

a_fen=((a_fen/10)<<4)+((a_fen%10)&0x0f);

}

}

if(mod==7)

{

if(k4==0)//如果k4=0,则退出设定

{

delay(5);

if(k4==0)

{

while(~k4);

mod=0;

}

}

if(k3==0)

{

delay(5);

while(~k3);

kaiguan++;

}

if(k2==0)

{

delay(5);

while(~k2);

a_shi=(a_shi>>4)*10+(a_shi&0x0f);

a_shi++;

if(a_shi==24)

a_shi=0;

a_shi=((a_shi/10)<<4)+((a_shi%10)&0x0f);

}

}

}

if(mod==0)

show(shi,fen,miao);

else if(mod>=1&&mod<=2)

{show(shi,fen,miao);weidisplay();}

else if(mod<=5)

{

nian=read(0x8d);

yue=read(0x89);//读分钟

ri=read(0x87);

show(nian,yue,ri);

weidisplay();

}

else {alarmshow(a_shi,a_fen);

weidisplay();

}

}

}

void show(uchar x,uchar y,uchar z)

{

display(x>>4,0);

display(x&0x0f,1);

display(y>>4,3);

display(y&0x0f,4);

display(z>>4,6);

display(z&0x0f,7);

}

void alarmshow(uchar a_shi,uchar a_fen)

{

alarmdisplay(a_shi>>4,3);

alarmdisplay(a_shi&0x0f,4);

P0=0xbf;

P2=0x20;

delay(1);//显示横杠

P2=0x00;

alarmdisplay(a_fen>>4,6);

alarmdisplay(a_fen&0x0f,7);

}

bit keys(void)

{

if(k1==0)

{

delay(5);

if(k1==0)

{

while(~k1);//判断松手操作

mod++;

if(mod==8)

mod=0;

return 1;

}

}

}

如果你们在用我的程序做实验时出现什么问题,欢迎大家给我留言。。。

ds1302时钟程序详解-ds1302程序流程图(C程序)

ds1302时钟程序详解,ds1302程序流程图(C程序) ds1302时钟程序详解 DS1302 的控制字如图2所示。控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始 输出。 2.3 数据输入输出(I/O) 在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从 低位0位到高位7。 2.4 DS1302的寄存器 DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日 历、时间寄存器及其控制字见表1。 此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器容。 DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RA M的31个字节,命令控制字为FEH(写)、FFH(读)。

ds1302程序流程图 3.2 DS1302实时时间流程 图4示出DS1302的实时时间流程。根据此流程框图,不难采集实时时间。下面结合流程图对DS1302的基 本操作进行编程:

DS1302时钟芯片读写详解

DS1302时钟芯片读写详解 2008-09-26 13:07 /*DS1302读写程序(C51)*/ sbit DS13CLK =P1^5; /*DS1302的SCLK脚脉冲*/ sbit DS13IO =P1^6; /*DS1302的IO脚数据*/ sbit DS13CS =P1^7; /*DS1302的RST脚片选*/ /*向DS1302写一个字节*/ void _wds13byte(uchar _code) { uchar i; DS13CLK =0; DS13CLK =0; for(i=0;i<8;i++) { if(_code&0x01) DS13IO =1; else DS13IO =0; DS13CLK =1; DS13CLK =1; DS13CLK =0; DS13CLK =0; _code =_code >> 1; } } /*从DS1302读一个字节*/ uchar _rds13byte(void) { uchar i,_code; _code=0; DS13CLK =0; DS13CLK =0; DS13IO =1; for(i=0;i<8;i++) { _code =_code >>1; if(DS13IO) _code =_code|0x80; DS13CLK =1; DS13CLK =1; DS13CLK =0; DS13CLK =0; } return _code; } /*读功能_code读功能命令*/ uchar readds1302(uchar _code)

{ DS13CS =0; /*关闭DS1302*/ DS13CLK =0; DS13CLK =0; DS13CS =1; /*使能DS1302*/ _wds13byte(_code); /*读代码*/ _code=_rds13byte(); /*返回读取数字*/ DS13CLK =1; DS13CS =0; /*关闭DS1302*/ return _code; } /*写功能fp写的地址,_code写的内容*/ void writeds1302(uchar fp,uchar _code) { DS13CS =0; /*关闭DS1302*/ DS13CLK =0; DS13CLK =0; DS13CS =1; /*使能DS1302*/ _wds13byte(fp); /*写控制命令*/ _wds13byte(_code); /*写入数据*/ DS13CLK=1; DS13CS =0; /*关闭DS1302*/ } /*******DS1302设置快速充电***************/ void ds13_charg(void) { writeds1302(0x8e,0x00); /*解除写保护*/ writeds1302(0x90,0xa5); /*单二极管2K电阻充电*/ writeds1302(0x8e,0x80); /*置位写保护*/ } ;;;DS1302读写程序(汇编);;; ;******************************************************************* **/ T_CLK Bit P1.5 ;实时时钟时钟线引脚 T_IO Bit P1.6 ;实时时钟数据线引脚 T_RST Bit P1.7 ;实时时钟复位线引脚 ;********************************************************** ;子程序名:Set1302 ;功能:设置DS1302 初始时间,并启动计时。 ;说明: ;调用:RTInputByte ;入口参数:初始时间在:Second,Minute,Hour,Day,Month,Week.YearL(地址连续) ;出口参数:无 ;影响资源:A B R0 R1 R4 R7

基于DS1302的数码管显示数字钟

单片机原理课程设计 课题名称:基于DS1302的数码管显示数字钟 专业班级:电子信息工程 学生学号: 学生姓名: 指导教师: 设计时间:2010年6月21日--2010年6月25日

目录 摘要........................................................................................................................................................................ 1 设计任务和要求............................................................................................................................................ 2 方案论证........................................................................................................................................................ 3 系统硬件设计................................................................................................................................................ 3.1 系统总原理图 ................................................................................................................................ 3.2 元器件清单...................................................................................................................................... 3.3 PCB板图....................................................................................................................................... 3.4 Proteus仿真图 ............................................................................................................................... 3.5 分电路图及原理说明................................................................................................................... 3.5.1 主控部分(单片机MCS-51).............................................................................. 3.5.2 计时部分(实时时钟芯片DS1302).................................................................. 3.5.3 显示部分(共阳极数码管)................................................................................ 3.5.4 调时部分(按键)................................................................................................ 4系统软件设计................................................................................................................................................ 4.1 程序流程图..................................................................................................................................... 4.2 程序源代码........................................................................................................................................ 5心得体会........................................................................................................................................................ 6参考文献........................................................................................................................................................ 7结束语............................................................................................................................................................

DS1302时钟芯片的原理与应用

DS1302 时钟芯片的原理与应用 1 写保护寄存器操作 当写保护寄存器的最高位为0 时,允许数据写入寄存器,写保护寄存器可以通过命令字节8E 8F 来规定禁止写入/读出。写保护位不能在多字节传送模式下写入Write_Enable: MOV Command,#8Eh ;命令字节为8E MOV ByteCnt,#1 ;单字节传送模式 MOV R0,#XmtDat 数据地址覆给R0 MOV XmtDat,#00h 数据内容为0 写入允许 ACALL Send_Byte 调用写入数据子程序 RET 返回调用本子程序处 当写保护寄存器的最高位为1 时禁止数据写入寄存器 Write_Disable: MOV Command,#8Eh ;命令字节为8E MOV ByteCnt,#1 ;单字节传送模式 MOV R0,#XmtDat 数据地址覆给R0 MOV XmtDat,#80h 数据内容为80h 禁止写入 ACALL Send_Byte 调用写入数据子程序 RET 返回调用本子程序处 以上程序调用了基本数据发送(Send_Byte)模块及一些内存单元定义, 其源程序清单在附录中给出下面 的程序亦使用了这个模块 2 时钟停止位操作 当把秒寄存器的第7 位时钟停止位设置为0 时起动时钟开始 Osc_Enable: MOV Command,#80h ; 命令字节为80 MOV ByteCnt,#1 ; 单字节传送模式 MOV R0,#XmtDat 数据地址覆给R0 MOV XmtDat,#00h 数据内容为0 振荡器工作允许 ACALL Send_Byte 调用写入数据子程序 RET 返回调用本子程序处 当把秒寄存器的第7 位时钟停止位设置为1 时,时钟振荡器停止DS1320 进入低功耗方式 Osc_Disable: MOV Command,#80h ;命令字节为80 MOV ByteCnt,#1 ;单字节传送模式 MOV R0,#XmtDat 数据地址覆给R0 MOV XmtDat,#80h 数据内容为80h 振荡器停止 ACALL Send_Byte 调用写入数据子程序 RET 返回调用本子程序处 3. 多字节传送方式

DS1302时序和C语言程序

1 DS130 2 简介: DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。工作电压宽达2.5~5.5V。采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后背电源进行涓细电流充电的能力。DS1302的外部引脚分配如图1所示及内部结构如图2所示。DS1302用于数据记录,特别是对某些具有特殊意义的数据点的记录上,能实现数据与出现该数据的时间同时记录,因此广泛应用于测量系统中。 图1 DS1302的外部引脚分配 图2 DS1302的内部结构 各引脚的功能为: Vcc1:主电源;Vcc2:备份电源。当Vcc2>Vcc1+0.2V时,由Vcc2向DS1302供电,当Vcc2< Vcc1时,由Vcc1向DS1302供电。 SCLK:串行时钟,输入; I/O:三线接口时的双向数据线; CE:输入信号,在读、写数据期间,必须为高。该引脚有两个功能:第一,CE开始控制字访问移位寄存器的控制逻辑;其次,CE提供结束单字节或多字节数据传输的方法。 DS1302有下列几组寄存器: ①DS1302有关日历、时间的寄存器共有12个,其中有7个寄存器(读时81h~8Dh,写时80h~8Ch),存放的数据格式为BCD码形式,如图3所示。

图 3 DS1302有关日历、时间的寄存器 小时寄存器(85h、84h)的位7用于定义DS1302是运行于12小时模式还是24小时模式。当为高时,选择12小时模式。在12小时模式时,位5是,当为1时,表示PM。在24小时模式时,位5是第二个10小时位。 秒寄存器(81h、80h)的位7定义为时钟暂停标志(CH)。当该位置为1时,时钟振荡器停止,DS1302处于低功耗状态;当该位置为0时,时钟开始运行。 控制寄存器(8Fh、8Eh)的位7是写保护位(WP),其它7位均置为0。在任何的对时钟和RAM 的写操作之前,WP位必须为0。当WP位为1时,写保护位防止对任一寄存器的写操作。 ②DS1302有关RAM的地址 DS1302中附加31字节静态RAM的地址如图4所示。 图4 ③DS1302的工作模式寄存器 所谓突发模式是指一次传送多个字节的时钟信号和RAM数据。突发模式寄存器如图5所示。 图5 ④此外,DS1302还有充电寄存器等。 2 读写时序说明 DS1302是SPI总线驱动方式。它不仅要向寄存器写入控制字,还需要读取相应寄存器的数据。 要想与DS1302通信,首先要先了解DS1302的控制字。DS1302的控制字如图6。 图6 控制字(即地址及命令字节) 控制字的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到DS1302中。

ds1302时钟程序详解经典

dsl302时钟程序详解经典 dsl302时钟程序详解 DS1302的控制字如图2所示。控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始 2.3数据输入输出(I/O) 在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0 位到高位7o 2.4 DS1302的寄存器 DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位 为BCD码形式,其日历、 时间寄存器及其控制字见表1。

? I日历?別间襦存祁及凡担制孑 fir* 野擅"itwtr 収他总cn - T ?fsy网 移 e S』3 2 1 0 林斶 son8!ll00-59 f.H IUSVX SIX X2H S3II oum(1Mh、 MH K4H851101 \2A12 24? 10 IIH HK MhH M7II01 -2S.2V, W-Jl ?o imiAre 8SH WII03 - !2(11) 0 IUM MOYI1I AAII8HH ni(i II ? 0 0h\V 8LH Mill OQ ? 9910YLAH 此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器 及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为COH, FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。 dsl302程序流程图

ds1302时钟程序详解 含电路图 源程序 注释

以下资料摘自电子发烧友网感谢作者,版权归网站所有,资料仅供参考 ds1302时钟程序详解 DS1302 的控制字如图2所示。控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。 2.3 数据输入输出(I/O) 在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。 2.4 DS1302的寄存器 DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字见表1。

此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。 ds1302程序流程图

3.2 DS1302实时时间流程 图4示出DS1302的实时时间流程。根据此流程框图,不难采集实时时间。下面结合流程图对DS1302的基本操作进行编程:

51单片机DS1302日历时钟程序

51 单片机ds1302 时钟芯片 #define uint unsigned int #define uchar unsigned char sbit lcdrs = P1^0; sbit lcdrw = P1^1; sbit lcden = P1^2; sbit key0 = P2^0;//功能键,选择时分秒 sbit key1 = P2^1;//加1键 sbit key2 = P2^2;//减1键 sbit key4 = P2^4; sbit clk_1302 = P1^5; //1302芯片位定义sbit io_1302 = P1^6; sbit rst_1302 = P1^7; uchar bdata dat; sbit dat0 = dat^0; sbit dat7 = dat^7; uchar key0_count;//按键0被按的次数(0~3) uchar flag; char hour,minute,second; uchar table_date[] = "2009-4-12 Mon"; uchar table_time[] = "00:00:00"; /****** 函数申明********/ void write_cmd_1602(uchar cmd); void write_data_1602(uchar dat); void write_add(uchar add,uchar dat); void init1602(); void delay(uint z); uchar reverse(uchar c); void keyscan(); void init(); void RTC_initial (); void wr_1302(uchar wr_data); uchar rd_1302(void); uchar uc_R1302(uchar ucAddr); void v_W1302(uchar ucAddr, uchar ucDa); 主程序 #include

51单片机可调的ds1302时钟程序

#include #include #define uchar unsigned char #define uint unsigned int uchar count_10ms; //定义10ms计数器 sbit K1 = P3^7; //定义K1键 sbit K2 = P3^4; //定义K2键 sbit K3 = P3^5; //定义K3键 sbit K4 = P3^6; //P1^3定义K4键 sbit K5 = P3^3; sbit BEEP=P2^2; //定义蜂鸣器 sbit reset = P1^6; //P2^5; sbit sclk = P1^7; //P2^6; sbit io = P2^6; //P2^7; sbit LCD_RS=P1^0; sbit LCD_RW=P1^1 ; sbit LCD_EN=P1^2; bit K1_FLAG=0; //定义按键标志位,当按下K1键时,该位置1,K1键未按下时,该位为0。 uchar disp_buf[16] ={0x00}; //定义显示缓冲区 uchar time_buf[7] ={0,0,0x12,0,0,0,0}; //DS1302时间缓冲区,存放秒、分、时、日、月、星期、年 uchar temp [2]={0}; //用来存放设置时的小时、分钟的中间值 uint m=0,n=0,r=0; /********以下是函数声明********/ void Delay_ms(uint xms) ; bit lcd_busy(); void lcd_wcmd(uchar cmd); void lcd_wdat(uchar dat) ; void lcd_clr() ; void lcd_init() ; void write_byte(uchar inbyte); //写一字节数据函数声明 uchar read_byte(); //读一字节数据函数声明 void write_ds1302(uchar cmd,uchar indata); //写DS1302函数声明 uchar read_ds1302(uchar addr); //读DS1302函数声明 void set_ds1302(uchar addr,uchar *p,uchar n); //设置DS1302初始时间函数声明 void get_ds1302(uchar addr,uchar *p,uchar n); //读当前时间函数声明 void init_ds1302(); //DS1302初始化函数声明 /********以下是延时函数********/ void Delay_ms(uint xms) { uint i,j;

51单片机+带字库液晶12864+DS1302数字时钟C源程序(无按键修改功能)

51单片机+带字库液晶12864+DS1302数字时钟C源程序(无按键修改功能)过两天的搜索与调试,在别人程序的基础上,不断修改,终于调试成功了这个程序。目前还不能修改时间与日期,只是以预定时间以始。 适用于开发板:51单片机(AT89S52)+带字库液晶12864(ST7920)+DS1302(实时时钟) 实现功能:简单,数字时钟+日期(以后会不断完美)。 C语言源程序如下: #include #include #define uchar unsigned char #define uint unsigned int /*DS1302 端口设置 */ sbit SCK=P3^6; //DS1302时钟 sbit SDA=P3^4; //DS1302 IO sbit RST = P3^5; // DS1302复位 bit ReadRTC_Flag; //读DS1302全局变量 /* 12864端口定义*/ #define LCD_data P0 //带字库液晶12864数据口 sbit LCD_RS = P2^4; //寄存器选择输入 sbit LCD_RW = P2^5; //液晶读/写控制 sbit LCD_EN = P2^6; //液晶使能控制 sbit PSB=P2^1; //并口控制 sbit RES=P2^3; uchar code dis1[] = {" 电子设计天地"}; //液晶显示的汉字 uchar code dis2[] = {"有志者,事竟成!"}; uchar code dis4[] = {'0','1','2','3','4','5','6','7','8','9'}; unsigned char temp; #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();}; void lcd_pos(uchar X,uchar Y); //确定显示位置 unsigned char l_tmpdate[7]={0,7,16,19,10,1,9};//秒分时日月周年 09-10-19 16:07:00 code unsigned char write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //秒分时日

ds1302的12864液晶按键可调显示实时时钟程序

一.绪言 1.在信息显示技术中,人们发现了信息数字化的重要作用和意义。数字化的信息更加准确,同一性,更易传输和识别。很多信息可以直接由数字表示,从而数字化信息显示又成为信息显示的又一个重要内容。又从数字化显示发展到字符显示,它把人类特有的语言文字用于显示,这种显示与数字显示合在一起用途更广用量更大。在这同时,人们还希望用图形和图像进行显示,且显示的内容为五彩缤纷,并且可以实时活动和具有三维立体效果。这些在二十世纪尾声时都已经陆续实现。LCD的计算机器,半导体发光数码管显示(LED)的汽车计价器,商场的大屏幕广告。这零零总总的各类显示正为你做着各种各样的服务,相信在不久的将来显示技术的发展将会为人类做出更大的贡献。 Ds1302时钟芯片现在流行的串行时钟电路很多,如DS1302、 DS1307、PCF8485等。这些电路的接口简单、价格低廉、使用方便,被广泛地采用。本文介绍的实时时钟电路DS1302是DALLAS公司的一种具有涓细电流充电能力的电路,主要特点是采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。采用普通3 2.768kHz晶振。(一)设计任务 本课题采用ds1302的时钟芯片为主要的的设计来源,采用显示是1cd1602的图形点阵液晶显示。,

(二)提出方案及方案论证 在设计中,我主要是考虑ds1302的时间显示问题,因为网上也有ds1302的读写和显示程序,但是至于怎样才能显示详细信息,我提出了两个方案,一个是LCD1602来显示,一个是LCD12864,其中1602是个字符型的点阵,而1CD12864是个图形的点阵,相比之下12864能够更好显示数据,而CPU都采用89C52的单片机 (三)原理说明:原理其实很简单,LCD12864的各种指令先进行宏定义和ds1302的读写指令也进行宏定义,从ds1302的读出数据显示在lcd上 (二)程序流程图

电子万年历设计(基于AT89C51单片机和DS1302时钟芯片)1

随着人们生活水平的提高和生活节奏的加快,对时间的要求越来越高,精准数字计时的消费需求也是越来越多。 二十一世纪的今天,最具代表性的计时产品就是电子万年历,它是近代世界钟表业界的第三次革命。第一次是摆和摆轮游丝的发明,相对稳定的机械振荡频率源使钟表的走时差从分级缩小到秒级,代表性的产品就是带有摆或摆轮游丝的机械钟或表。第二次革命是石英晶体振荡器的应用,发明了走时精度更高的石英电子钟表,使钟表的走时月差从分级缩小到秒级。第三次革命就是单片机数码计时技术的应用(电子万年历),使计时产品的走时日差从分级缩小到1/600万秒,从原有传统指针计时的方式发展为人们日常更为熟悉的夜光数字显示方式,直观明了,并增加了全自动日期、星期、温度以及其他日常附属信息的显示功能,它更符合消费者的生活需求!因此,电子万年历的出现带来了钟表计时业界跨跃性的进步…… 我国生产的电子万年历有很多种,总体上来说以研究多功能电子万年历为主,使万年历除了原有的显示时间,日期等基本功能外,还具有闹铃,报警等功能。商家生产的电子万年历更从质量,价格,实用上考虑,不断的改进电子万年历的设计,使其更加的具有市场。 本设计为软件,硬件相结合的一组设计。在软件设计过程中,应对硬件部分有相关了解,这样有助于对设计题目的更深了解,有助于软件设计。基本的要了解一些主要器件的基本功能和作用。 除了采用集成化的时钟芯片外,还有采用MCU的方案,利用AT89系列单片微机制成万年历电路,采用软件和硬件结合的方法,控制LED数码管输出,分别用来显示年、月、日、时、分、秒,其最大特点是:硬件电路简单,安装方便易于实现,软件设计独特,可靠。AT89C51是由ATMEL 公司推出的一种小型单片机。95年出现在中国市场。其主要特点为采用Flash存贮器技术,降低了制造成本,其软件、硬件与MCS-51完全兼容,可以很快被中国广大用户接受。 本文介绍了基于AT89C51单片机设计的电子万年历。 首先我们在绪论中简单介绍了单片机的发展与其在中低端领域中的优

实时时钟芯片DS1302 C51源程序

实时时钟芯片DS1302 C51源程序 /**************************************************************** 模块名称:DS1302.c 功能:实时时钟模块时钟芯片型号:DS1302 说明: *********************************************************************/ #include sbit 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); /******************************************************************** 函数名:RTInputByte() 功能:实时时钟写入一字节 说明:往DS1302写入1Byte数据(内部函数) 入口参数:d 写入的数据 返回值:无 ***********************************************************************/ void RTInputByte(uchar d)

DS1302使用手册

S O DS1302 涓流充电时钟保持芯片的原理与应用 摘要 本文概括介绍了 DS1302 时钟芯片的特点和基本组成 通过实例详细说明了有关功能的应用 软件 关于 DS1302 各寄存器的详细位控功能请参考 D ALLAS 达拉斯公司的相应产品资料 概述 DS 1302 是 D ALLAS 公司推出的涓流充电时钟芯片 内含有一个实时时钟/日历和 31 字节静态 R AM 通过简 单的串行接口与单片机进行通信 实时时钟/日历电路提供秒 分 时 日 日期 月 年的信息 每月的天 数和闰年的天数可自动调整 时钟操作可通过 AM/PM 指示决定采用 24 或 12 小时格式 DS1302 与单片机之 间能简单地采用同步串行的方式进 行通信 仅需用到三个口线 1 RE 复位 2 I/ 数据线 3 SCLK 串行时钟时钟 /RAM 的读/写数据以一个字节或多达 31 个字节的字符组方式通信 DS1302 工作时功耗很 低 保持数据和时钟信息时功率小于 1mW DS1302 是由 DS1202 改进而来 增加了以下的特性 双电源管脚用于主电源和备份电源供应 Vcc1 为可 编程涓流充电电源 附加七个字节存储器 它广泛应用于电话 传真 便携式仪器以及电池供电的仪器仪表等 产品领域 下面将主要的性能指标作一综合 z 实时时钟具有能计算 2100 年之前的秒 分 时 日 日期 星期 月 年的能力 还有闰年调整的能力 z 31 8 位暂存数据存储 R AM z 串行 I /O 口方式使得管脚数量最少 z 宽范围工作电压 2.0 5.5V z 工作电流 2.0V 时,小于 300nA z 读/写时钟或 R AM 数据时 有两种传送方式 单字节传送和多字节传送 字符组方式 z 8 脚 D IP 封装或可选的 8 脚 S OIC 封装 根据表面装配 z 简单 3 线接口 z 与 T TL 兼容Vcc=5V z 可选工业级温度范围 -40 +85 z 与 D S1202 兼容 z 在 D S1202 基础上增加的特性 对 V cc1 有可选的涓流充电能力 双电源管用于主电源和备份电源供应 备份电源管脚可由电池或大容量电容输入 附加的 7 字节暂存存储器 1 DS130 2 的基本组成和工作原理 D S 1302 的管脚排列及描述如下图及表所示

DS1302时钟芯片51单片机c语言程序

#ifndef __DS1302_H__ #define __DS1302_H__ #define uchar unsigned char #define uint unsigned int #include sbit SCLK = P3^2; sbit IO = P2^4; sbit RST = P3^3; #define R_Second 0x81 #define W_Second 0x80 #define R_Minute 0x83 #define W_Minute 0x82 #define R_Hour 0x85 #define W_Hour 0x84 #define R_Day 0x87 #define W_Day 0x86 #define R_Month 0x89 #define W_Month 0x88 #define R_Week 0x8B #define W_Week 0x8A #define R_Year 0x8D #define W_Year 0x8C #define R_Control 0x8F #define W_Control 0x8E void DS1302_Write_Byte(uchar Date); uchar DS1302_Read_Byte(); void Write_DS1302(uchar Adr,uchar Date); uchar Read_DS1302(uchar Adr); void Init_DS1302(); #endif

#include "ds1302.h" /************************************************************** 函數名稱:DS1302_Write_Byte(uchar Date) 函數功能:单字节写 輸入參數:写的字节 輸出參數:无 備注: **************************************************************/ void DS1302_Write_Byte(uchar Date) { uchar i; for(i = 0;i < 8;i++) { if(Date & 0x01) IO = 1; else IO = 0; SCLK = 1; Date = Date >> 1; SCLK = 0; } } /************************************************************** 函數名稱:uchar DS1302_Read_Byte() 函數功能:单字节读 輸入參數:无 輸出參數:读出的数据 備注: **************************************************************/ uchar DS1302_Read_Byte() {

DS1302 时钟芯片的程序

DS1302 时钟芯片的程序 /********************************************************************* 公司名称: 模块名称:DS1302.c 功能:实时时钟模块时钟芯片型号:DS1302 说明: 程序设计:zhaojunjie 设计时间:2002.03.02 版本号: 20020302 *********************************************************************/ #include sbit T_CLK = P2^3; /*实时时钟时钟线引脚 */ 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 日期:2002-03-19 修改:日期: ***********************************************************************/

ds1302时钟原理介绍

早就已经不在学校了,可是前几天突然有老童学问我有没有保存这方面的资料,赶紧翻了一下我的电脑,呵呵,还是找到了一些资料,顺便共享出来,有需要的同学们拿走后留个言吧——可以的话。最后感谢无名的原作者。 DS1302的特点 DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。工作电压宽达2.5~5.5V。采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后背电源进行涓细电流充电的能力。DS1302的外部引脚分配如图1所示。DS1302用于数据记录,特别是对某些具有特殊意义的数据点的记录上,能实现数据与出现该数据的时间同时记录,因此广泛应用于测量系统中。 各引脚的功能 Vcc1:主电源;Vcc2:备份电源。当Vcc2>Vcc1+0.2V时,由Vcc2向DS1302供电,当Vcc2< Vcc1时,由Vcc1向DS1302供电。SCLK:串行时钟,输入;I/O:三线接口时的双向数据线;CE:输入信号,在读、写数据期间,必须为高。该引脚有两个功能:第一,CE开始控制字访问移位寄存器的控制逻辑;其次,CE提供结束单字节或多字节数据传输的方法。 DS1302的几组寄存器以及有关RAM的地址

(1)DS1302有关日历、时间的寄存器 DS1302有关日历、时间的寄存器共有12个,其中有7个寄存器(读时81h~8Dh,写时80h~8Ch),存放的数据格式为BCD码形式,如图3所示。 (2)小时寄存器(85h、84h)的位7用于定义DS1302是运行于12小时模式还是24小时模式。当为高时,选择12小时模式。在12小时模式时,位5是,当为1时,表示PM。在24小时模式时、位5是第二个10小时位。 (3)秒寄存器(81h、80h)的位7定义为时钟暂停标志(CH)。当该位置为1时,时钟振荡器止,DS1302处于低功耗状态;当该位置为0时,时钟开始运行。(4)控制寄存器(8Fh、8Eh)的位7是写保护位(WP),其它7位均置为0。在任何的对时钟和RAM的写操作之前,WP位必须为0。当WP位为1时,写保护位防止对任一寄存器的写操作。 (5)DS1302中附加31字节静态RAM的地址如图4所示。 (6)DS1302的工作模式寄存器 所谓突发模式是指一次传送多个字节的时钟信号和RAM数据。突发模式寄存器如图5所示

相关主题
文本预览
相关文档 最新文档