基于DS1302与数码管设计的可调数字钟
基于1302数码管显示可调时钟C程序设计

这是我最近完善的1302数字可调时钟,经过20多个小时的走时实验,走时相当准确,与电脑时间完全一致,最起码肉眼看不出误差,1302的另一个突出优点是可以接备用电源,用纽扣电池供电,在外部系统电力中断的情况下,仍能保持内部时钟正常走时,经多次故意掉电实验,走时正常。
本次的完善主要在软件。
一个系统能够实现功能并不一定意味着成功,关键要让这个系统如何稳定的工作,提高其可靠性,是现代电子行业努力追求的目标。
本项目完全由本人在目前比较简陋的“振勇电子实验室”完成,介于条件简陋,设备简单,导致硬件系统尚不完善。
在软件编程方面,用先进的ASP下载取代了我一贯使用的串口下载,其好处是不用冷启动(个人认为除此之外没别的好处,而且下载效率没有串口的高,成功率保持在50%就很不错了)。
单片机用ATMEL公司的AT89S52取代了我以前用的STC系列单片机,STC是国产单片机,虽然我们提倡支持国产,但是很多时候国产真的太不争气了。
另一个比较大的改动在软件调时方面,按键抖动是一个很让人头疼的问题,就连我一直很佩服的郭天祥老师在这一块也曾犯过错误,而且错误还著书出版了,单片机的扫描是很快的,那么怎么才能有效地去除按键抖动呢下面我介绍的这种方法是我自己纯脑力劳动的结晶,实验证明运行效果良好。
if(key==0){con++;if(con==20){con==0;qita();}}一般人都能理解这个用法,也能想到,但关键这个程序不完整,比方说con没加到20,加到10就松开了,那么请问con 还能被清0吗显然不能。
那么你下一次再按的时候就有可能按一下加两下,这种不稳定性在编程中是不能存在的,最起码一个合格的产品不能有这样的毛病。
所以在这个函数里面应该加上下面这句:else if(key==1){if(con!=0){con=0;}}这个函数很简单,关键是它的位置,一定要与上面的的那个函数在同一位置。
该数字时钟另一个有技术含量的地方就是在调节时间的时候会在对应的位置闪烁,原理也很简单,就是在显示之前加一个门卡,比方说占空比50%的闪烁,那我就定义一个son,让son++;加满是60,那加到30以后让数码管不显示,就行了。
基于DS1302的电子时钟设计

基于DS1302的电子时钟设计2012~ 2013 学年第二学期《单片机》课程设计报告题目:基于DS1302的电子时钟设计专业:电气工程系自动化班级: 10自动化(2)班姓名:费孝斌洪建勇刘云飞桑乐陆欢欢魏笑指导教师:林开司电气工程系2013年5月12日任务书摘要电子时钟主要是利用电子技术将时钟电子化、数字化,拥有时钟精确、体积小、界面友好、可扩展性能强等特点,被广泛应用于生活和工作当中。
另外,在生活和工农业生产中,也常常需要温度,这就需要电子时钟具有多功能性。
本设计主要为实现一款可正常显示时钟/日历、带有定时闹铃的多功能电子时钟。
本文对当前电子钟开发手段进行了比较和分析,最终确定了采用单片机技术实现多功能电子时钟。
本设计应用AT89C52芯片作为核心,6位LED数码管显示,使用DS1302实时时钟日历芯片完成时钟/日历的基本功能。
这种实现方法的优点是电路简单,性能可靠,实时性好,时间精确,操作简单,编程容易。
该电子时钟可以应用于一般的生活和工作中,也可通过改装,提高性能,增加新功能,从而给人们的生活和工作带来更多的方便。
关键词:电子时钟;多功能;AT89C52;时钟日历芯片目录摘要一、引言 (4)二、基于单片机的电子时钟硬件选择分析 (5)2.1主要IC芯片选择 (5)2.1.1微处理器选择 (5)2.1.2 DS1302简介 (6)2.1.3 DS1302引脚说明 (7)2.2电子时钟硬件电路设计 (8)2.2.1时钟电路设计 (9)2.2.2整点报时功能 (10)三、protel软件画原理图 (11)3.1系统工作流程图 (12)3.2原理图 (13)四、proteus软件仿真及调试 (14)4.1电路板的仿真 (15)4.2软件调试 (16)五、源程序 (17)六、参考文献 (18)引言时间是人类生活必不可少的重要元素,如果没有时间的概念,社会将不会有所发展和进步。
从古代的水漏、十二天干地支,到后来的机械钟表以及当今的石英钟,都充分显现出了时间的重要,同时也代表着科技的进步。
基于DS1302的电子时钟设计报告

常熟理工学院电气与自动化工程学院《微机原理与接口技术》课程设计题目:基于DS1302的电子钟设计*名:***学号:*********班级:测控122班指导教师:***起止日期:2015年7月摘要 .......................................................................................................................... - 1 -一、《微机原理与接口技术》课程设计任务书 .................................................. - 2 -二、总体设计方案 (2)2.1 设计框图..................................................................................................... - 2 -2.2 模块说明..................................................................................................... - 3 -2.2.1 DS1302模块 (3)三、硬件电路设计 (4)3.1 单片机最小系统......................................................................................... - 4 -3.1.1 系统结构 (4)3.1.2 系统特点............................................................................................................ - 5 -3.2 时钟电路设计............................................................................................. - 5 -3.3 数码管显示设计 (5)3.4 键盘电路 (5)四、软件设计 .......................................................................................................... - 6 -4.1 主程序流程................................................................................................. - 6 -4.2 时钟电路设计 (8)五、程序调试与运行结果 ............................................................ 错误!未定义书签。
基于DS1302的数字时钟

实现功能:以DS1302数字时钟芯片为基础的时钟程序,用LED1602显示当前时间,功能键能显示年月日和星期。
#include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charsbit SCK=P3^6; //时钟端口sbit SDA=P3^4; //数据端口sbit RST=P3^5; //复位端口sbit LCD_RS = P2^6;sbit LCD_RW = P2^5;sbit LCD_EP = P2^7;sbit key=P2^0;uchar code write_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //秒分时日月周年uchar code read_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};uchar code a[]={" The time is:"};uchar code w1[]={" Monday"};uchar code w2[]={" Tuesday"};uchar code w3[]={" Wednesday"};uchar code w4[]={" Thursday"};uchar code w5[]={" Friday"};uchar code w6[]={" Saturday"};uchar code w7[]={" Sunday"};uchar init_time[] = {10,10,22,19,7,2,11}; //秒分时日月周年11-07-19 22:10:10uchar buff[7];uchar buff1[8];uchar buff2[13];uchar buff3;delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=120;y>0;y--);}/******DS1302部分*****/void write_byte(uchar n){uint i;for(i=0;i<8;i++){SCK=0;SDA=n&0x01;n=n>>1;SCK=1;}}uchar read_byte(){uint i;uchar n;for(i=0;i<8;i++){if(SDA)n=n|0x80;SCK=0;n=n>>1;_nop_();_nop_();SCK=1;}return n;}void write_DS1302(uchar address,uchar n) {RST=0;_nop_();SCK=0;_nop_();RST=1;_nop_();write_byte(address);write_byte(n);SCK=1;RST=0;}uchar read_DS1302(uchar address){uchar n;RST=0;_nop_();_nop_();SCK=0;_nop_();RST=1;write_byte(address);n=read_byte();_nop_();RST=0;_nop_();_nop_();_nop_();RST=0;SCK=0;_nop_();_nop_();_nop_();_nop_();SCK=1;_nop_();_nop_();SDA=0;_nop_();_nop_();SDA=1;_nop_();_nop_();return n;}void get_data(){unsigned char i,*p;p=read_address;for(i=0;i<7;i++){buff[i]=read_DS1302(*p);p++;}}void set_DS1302(){unsigned char i,*p,n;for(i=0;i<7;i++) //转换成BCD码{n=init_time[i]/10;init_time[i]=init_time[i]%10;init_time[i]=init_time[i]+n*16;}write_DS1302(0x8E,0X00);p=write_address;for(i=0;i<7;i++){write_DS1302(*p,init_time[i]);p++;}write_DS1302(0x8E,0x80);}bit lcd_bz(){ // 测试LCD忙碌状态bit result;LCD_RS = 0;LCD_RW = 1;LCD_EP = 1;_nop_();_nop_();_nop_();_nop_();result=(bit)(P0 & 0x80);LCD_EP=0;return result;}lcd_wcmd(uchar cmd){ // 写入指令数据到LCD while(lcd_bz());LCD_RS = 0;LCD_RW = 0;LCD_EP = 0;_nop_();_nop_();P0 = cmd;_nop_();_nop_();_nop_();_nop_();LCD_EP = 1;_nop_();_nop_();_nop_();_nop_();LCD_EP = 0;}lcd_pos(uchar pos){ //设定显示位置lcd_wcmd(pos|0x80);}lcd_wdat(uchar dat){ //写入字符显示数据到LCD while(lcd_bz());LCD_RS = 1;LCD_RW = 0;LCD_EP = 0;P0 = dat;_nop_();_nop_();_nop_();_nop_();LCD_EP = 1;_nop_();_nop_();_nop_();_nop_();LCD_EP = 0;}lcd_init(){ //LCD初始化设定lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据delay(1);lcd_wcmd(0x0c); //显示开,关光标delay(1);lcd_wcmd(0x06); //移动光标delay(1);lcd_wcmd(0x01); //清除LCD的显示内容delay(1);}void dispaly(){uint i;if(0==key)delay(5);if(0==key){lcd_wcmd(0x01);while(0==key){buff2[0]=0x20;buff2[1]=0x20;buff2[2]=0x20;buff2[3]=0x32;buff2[4]=0x30;buff2[5]=buff[6]/16+0x30;buff2[6]=(buff[6]&0x0f)+0x30;buff2[7]=0x2d;buff2[8]=buff[4]/16+0x30;buff2[9]=(buff[4]&0x0f)+0x30;buff2[10]=0x2d;buff2[11]=buff[3]/16+0x30;buff2[12]=(buff[3]&0x0f)+0x30;lcd_pos(0);for(i=0;i<13;i++){lcd_wdat(buff2[i]);delay(5);}buff3=buff[5]&0x0f;lcd_pos(0x40);if(buff3==1){i = 0;while(w1[i]!= '\0'){lcd_wdat(w1[i]);i++;delay(5);}}else if(buff3==2){i = 0;while(w2[i]!= '\0'){lcd_wdat(w2[i]);i++;delay(5);}}else if(buff3==3){i = 0;while(w3[i]!= '\0'){lcd_wdat(w3[i]);i++;delay(5);}}else if(buff3==4){i = 0;while(w4[i]!= '\0'){lcd_wdat(w4[i]);i++;delay(5);}}else if(buff3==5){i = 0;while(w5[i]!= '\0'){lcd_wdat(w5[i]);i++;delay(5);}}else if(buff3==6){i = 0;while(w6[i]!= '\0'){lcd_wdat(w6[i]);i++;delay(5);}}else if(buff3==7){i = 0;while(w7[i]!= '\0'){lcd_wdat(w7[i]);i++;delay(5);}}}lcd_wcmd(0x01);}else{lcd_pos(0);i = 0;while(a[i]!= '\0'){lcd_wdat(a[i]);i++;delay(5);}buff1[0]=buff[2]/16;buff1[1]=buff[2]&0x0f;buff1[2]=0x0a;buff1[3]=buff[1]/16;buff1[4]=buff[1]&0x0f;buff1[5]=0x0a;buff1[6]=buff[0]/16;buff1[7]=buff[0]&0x0f;lcd_pos(0x44);for(i=0;i<8;i++){lcd_wdat(buff1[i]+0x30);delay(5);}}}void main(){lcd_init();set_DS1302();while(1){get_data();dispaly();}}。
基于DS1302数字时钟电路的设计123

核心芯片简介1.1 DS1302简介DS1302[1]是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟芯片,它可以对年、月、日、周日、时、分、秒进行计时,且具有闰年补偿功能,工作电压宽达2.5~5.5V。
时钟可工作在24小时格式或12小时(AM/PM)格式。
DS1302与单片机的接口使用同步串行通信,仅用3条线与之相连接。
可采用一次传送一个字节或突发方式一次传送多个字节的时钟信号或RAM数据。
DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。
DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。
1.1.1 DS1302引脚功能与内部结构DS1302的引脚功能如表1所示,外形及内部结构如图1所示[2]:表1 DS1302引脚功能表图1 DS1302管脚图及内部结构图1.1.2 DS1302的控制字DS1302的控制字节如图2所示:7 6 5 4 3 2 1 0图2 DS1302控制字节的含义控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到DS1302中。
位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。
1.1.3 DS1302的复位引脚通过把RST 输入驱动置高电平来启动所有的数据传送。
RST 输入有两种功能:首先,RST 接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST 提供了终止单字节或多字节数据的传送手段。
当RST 为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。
如果在传送过程中置RST 为低电平,则会终止此次数据传送,并且I/O 引脚变为高阻态。
上电运行时,在Vcc≥2.5V 之前,RST 必须保持低电平。
DS1302数字钟实验

实验十四、DS1302数字钟实验(一)、实验目的:DS1302 是美国DALLAS 公司推出的一种高性能、低功耗、带RAM 的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。
采用三线接口与CPU 进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。
将DS1302与单片机连接可以方便的取得时间信息,与全软件的数字时钟相比,编程简单、易于调整、使用方便。
该实验的目的就是使使用者通过实验例程的学习,掌握单片机控制系统的实时时钟/日历电路的使用方法,由于DS1302与单片机连接时采用SPI接口,故该实验可以使使用者了解和学习SPI的通讯协议和编程方法。
(二)、实验接线和步骤:1、在DS1302芯片附近,将“P33”、I/O”跳线短接,将“P23”、“SCK”跳线短接,即完成DS1302和单片机的接口连接。
2、将液晶屏12864接到串行接口,将U13(上面的8位拨码开关)的“6”、“7”、“8”三位拨到“ON”位置。
这三位是控制和串行数据接口。
3、短路块短接实验板左侧7289模块的四路跳线“CS1、CLK1、DIO1、INT1”(“KEY”插座附近),然后将7289模块和实验板“KEY”插座相连接。
4、上电下载程序。
5、7289键盘数码管模块对应调时间的按键如下:“1”键调“年”;“2”键调“月”;“3”键调“日”;“A”键调“周”;“7”键调“时”;“8”键调“分”;“9”键调“秒”;所有按键的调节都是单方向增加模式,关于双方向增减模式的调节可以自行修改程序完成。
7289模块数码管上显示的是7289模块按键的键值(不是时间的设置值,时间的设置变化值显示在12864液晶屏上)。
说明一:如果程序下载后运行液晶出现乱码现象,可以按单片机重启按钮重启单片机,还是不行则需要重新启动实验板电源。
说明二:因程序例程篇幅过长,不方便以书面形式列出,为方便使用者,例程的原代码及工程文件所有文档均已附在电子文档“简单端口实验”文件夹中。
课程设计——DS1302数码管显示数字钟的设计1

××大学××学院××系课程设计报告××大学××学院××系××课程设计DS1302数码管显示数字钟的设计学生姓名学号所在系专业名称班级指导教师成绩××大学××学院二〇一二年六月摘要:本课程设计要求基于STC89C52单片机实现用8位数码管进行时钟显示。
采用STC89C52单片机和DS1302实时时钟芯片,使用5V电源供电。
时钟可以通过按键切换,数码管显示时、分、秒以及年、月、日,并且可以实现时钟的校准功能。
包括时钟芯片驱动程序,数码管显示及驱动程序。
关键字:单片机,DS1302,时钟电路,数码管显示Abstract: This course is designed 8 digital tube clock display requirements based STC89C52 microcontroller. Using STC89C52 microcontroller and DS1302 real time clock chip, using a 5V power supply. Design of the clock by means of the key switches, digital tube display hours, minutes, seconds, and the year, month, day, and can achieve clock calibration function. Including the driver of the clock chip, digital display and driver.Key words: single chip macrocomputer;DS1302;clock circuit;digital tube display目录1. 总体设计方案 (1)1.1 电子钟功能介绍1.1.1 基本功能介绍 (1)1.1.2 扩展功能介绍 (1)1.2 总体设计方案 (1)1.2.1 计时方案 (1)1.2.2 按键方案 (1)1.2.3 显示方案 (2)2. 单元模块设计 (2)2.1 硬件总电路设计 (2)2.2 显示模块电路设计 (2)2.3 按键调时电路设计 (3)2.4 时钟芯片通信电路 (3)3. 软件模块设计 (4)3.1 主程序设计 (4)3.2 时钟芯片 (5)3.2.1 DS1302内部结构 (5)3.2.2 DS1302的读时序 (6)3.2.3 DS1302的写时序 (6)3.3 键盘调时 (7)4. 设计总结 (8)5. 参考文献 (8)6. 附录 (9)前言数字钟是采用数字电路实现对时、分、秒及数字显示的计时装置,广泛用于个人家庭、车站、办公室等公共场所,成为人们日常生活中的必需品。
基于DS1302数字时钟电路的设计

命令字
取值围
各位容
写操作
读操作
7
6
5
4
3
2
1
0
秒寄存器
80H
81H
00--59
CH
10SEC
SEC
分寄存器
82H
83H
00--59
0
10MIN
MIN
时寄存器
84H
85H
01-12或00-23
12/24
0
10
HR
HR
日寄存器
86H
87H
01-28,29,30,31
0
0
10DATE
DATE
月寄存器
图3 数据读写时序
DS1302共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式。其日历、时间寄存器及其控制字见表2。
此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器的容。DS1302与RAM相关的寄存器分为两类,一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H--FDH,其中奇数为读操作,偶数为写操作;再一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。
2.1.1DS1302引脚功能与部结构
DS1302的引脚功能如表1所示,外形及部结构如图1所示[2]:
引脚号
引脚名称
功能
1
VCC2
主电源
2、3
X1、X2
振荡源,外接32768Hz晶振
4
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
作者 张小波 1 学习情境2-可调式数字钟 之 基于DS1302与数码管设计的可调数字钟 ☆ 点名,复习 1、 定时器的工作方式有哪些?如何对定时器进行初始化。 2、 数码管动态显示技术的原理? ☆ 新课讲授 2.2 基于DS1302与数码管设计的可调数字钟 前面我们用定时器产生1秒的时间,从而也设计出了可以调节数字钟,但用这种方法设计出来的电子钟不够准确。这节课我们用美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路DS1302 ,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能。同时,我们还是用数码管作为显示时间的硬件。 2.2.1 DS1302芯片技术资料 DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。DS1302的外部引脚分配如图1所示及内部结构如图2所示。DS1302用于数据记录,特别是对某些具有特殊意义的数据点的记录上,能实现数据与出现该数据的时间同时记录,因此广泛应用于测量系统中。 作者 张小波
2 图 1 DS1302引脚
图 2 DS1302内部结构 1、引脚功能及结构
DS1302的引脚排列,其中Vcc1为后备电源,VCC2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。X1和X2是振荡源,外接32.768kHz晶振。RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。上电运行时,在Vcc≥2.5V之前,RST必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。I/O为串行数据输入输出端(双向),SCLK始终是输入端。 2 、DS1302的寄存器和控制命令 作者 张小波 3 对DS1302的操作就是对其内部寄存器的操作,DS1302内部共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式。 小时寄存器(85h、84h)的位7用于定义DS1302是运行于12小时模式还是24小时模式。当为高时,选择12小时模式。在12小时模式时,位5是,当为1时,表示PM,当为0时,表示AM。在24小时模式时,位5是第二个10小时位。 秒寄存器(81h、80h)的位7定义为时钟暂停标志(CH)。当该位置为1时,时钟振荡器停止,DS1302处于低功耗状态;当该位置为0时,时钟开始运行。 控制寄存器(8Fh、8Eh)的位7是写保护位(WP),其它7位均置为0。在任何的对时钟和RAM的写操作之前,WP位必须为0。当WP位为1时,写保护位防止对任一寄存器的写操作。 日历、时间寄存器及控制字如表1所示: 表1日历、时钟寄存器与控制字对照表
寄存器名称 7 6 5 4 3 2 1 0 1 RAM/CK A4 A3 A2 A1 A0 RD/W 秒寄存器 1 0 0 0 0 0 0 0/1 分寄存器 1 0 0 0 0 0 1 0/1 小时寄存器 1 0 0 0 0 1 0 0/1 日寄存器 1 0 0 0 0 1 1 0/1 月寄存器 1 0 0 0 1 0 0 0/1 星期寄存器 1 0 0 0 1 0 1 0/1 年寄存器 1 0 0 0 1 1 0 0/1 写保护寄存器 1 0 0 0 1 1 1 0/1 慢充电寄存器 1 0 0 1 0 0 0 0/1 时钟突发寄存器 1 0 1 0 1 1 1 0/1
最后一位RD/W为“0”时表示进行写操作,为“1”时表示读操作。
此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器以外的寄存器。DS1302 作者 张小波 4 内部的RAM分为两类,一类是单个RAM单元,共31个,每个单元为一个8位的字节,其命令控制 字为COH~FDH,其中奇数为读操作,偶数为写操作;再一类为突发方式下的RAM,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。
表2 DS1302内部主要寄存器分布表 寄存器名称 命令字 取值范围 寄存器定义 写 读 7 6 5 4 3 2 1 0
秒寄存器 80H 81H 00-59 CH 10 SEC SEC 分寄存器 82H 83H 00-59 0 10 MIN MIN 小时寄存器 84H 85H 01-12或00-23 12/24 0 10 HR HR A/P
日寄存器 86H 87H 01-28,29,30,31 0 10 DATE DATE 月寄存器 88H 89H 01-12 0 0 0 10M MONTH 星期寄存器 8AH 8BH 01-07 0 0 0 0 DAY 年寄存器 8CH 8DH 00-99 10year year 写保护寄存器 8EH 8FH WP 0 0 0 0 0 0 0 慢充电寄存器 90H 91H TCS TCS TCS TCS DS DS DS DS
我们现在已经知道了控制寄存器和RAM的逻辑地址,接着就需要知道如何通过外部接
口来访问这些资源。单片机是通过简单的同步串行通讯与DS1302通讯的,每次通讯都必须由单片机发起,无论是读还是写操作,单片机都必须先向DS1302写入一个命令帧,这个帧的格式如图3所示,最高位BIT7固定为1,BIT6决定操作是针对RAM还是时钟寄存器,接着的5个BIT是RAM或时钟寄存器在DS1302的内部地址,最后一个BIT表示这次操作是读操作抑或是写操作。 作者 张小波 5 DS1302是SPI总线驱动方式。它不仅要向寄存器写入控制字,还需要读取相应寄存器的数据。要想与DS1302通信,首先要先了解DS1302的控制字。DS1302 的控制字如图3所示。控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1(A4~A0)指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。
图3命令字节格式 在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入
从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。 数据读写时序如图4。
图 4-1 单字节读时序 图 4-2 单字节写时序 物理上,DS1302的通讯接口由3个口线组成,即RST,SCLK,I/O。其中RST从低电
平变成高电平启动一次数据传输过程,SCLK是时钟线,I/O是数据线。具体的读写时序参考 作者 张小波 6 图4,但是请注意,无论是哪种通讯类型的串行接口,都是对时钟信号敏感的,而且一般数据写入有效是在上升沿,读出有效是在下降沿(DS1302正是如此的,但是在芯片手册里没有明确说明),如果不是特别确定,则把程序设计成这样:平时SCLK保持低电平,在时钟变动前设置数据,在时钟变动后读取数据,即数据操作总是在SCLK保持为低电平的时候,相邻的操作之间间隔有一个上升沿和一个下降沿。 3 调试中问题说明 (1) DS1302 与微处理器进行数据交换时,首先由微处理器向电路发送命令字节,命令字节最高MSB(D7)必须为逻辑1,如果D7=0,则禁止写DS1302,即写保护;D6=0,指定时钟数据,D6=1,指定RAM数据;D5~D1指定输入或输出的特定寄存器;最低位LSB(D0)为逻辑0,指定写操作(输入), D0=1,指定读操作(输出)。 (2) 在DS1302的时钟日历或RAM进行数据传送时,DS1302必须首先发送命令字节。若进行单字节传送,8位命令字节传送结束之后,在下2个SCLK周期的上升沿输入数据字节,或在下8个SCLK周期的下降沿输出数据字节。 (3) 要特别说明的是备用电源B1,可以用电池或者超级电容器(0.1F以上)。虽然DS1302在主电源掉电后的耗电很小,但是,如果要长时间保证时钟正常,最好选用小型充电电池。可以用老式电脑主板上的3.6V充电电池。如果断电时间较短(几小时或几天)时,就可以用漏电较小的普通电解电容器代替。100 μF就可以保证1小时的正常走时。DS1302在第一次加电后,必须进行初始化操作。初始化后就可以按正常方法调整时间。 2.2.2 硬件电路设计 硬件设计时使用了DS1302,电路结构简单,具体如下图所示: