课程设计设计题目:基于DS1302的实时时钟设计学生姓名:黄景军指导教师:高峰二级学院:龙蟠学院专业:电气工程及其自动化班级:M11电气工程及其自动化学号: **********摘要近年来随着计算机在社会领域的渗透和大规模集成电路的发展,单片机的应用正在不断地走向深入,由于它具有功能强,体积小,功耗低,价格便宜,工作可靠,使用方便等特点,因此特别适合于与控制有关的系统,越来越广泛地应用。
本设计采用实时时钟芯片DS1302,基于AT89C51单片机的设计制作了具有红外遥控、LED显示、可设定时的电子时钟,达到制作的目的,并用protuse和medwin进行模拟实验。
本报告中主要介绍了系统的硬件设计和软件设计,并用八位共阳极LED数码管,采用查询法查键实现。
关键词:单片机DS1302 AT89C51 共阳极LED数码显示器目录设计任务及主要技术指标和要求 (3)1.1 设计任务 (3)1.2 主要技术指标和要求 (3)二、引言 (3)三、核心芯片简介 (4)3.1 DS1302简介 (5)3.1.1 DS1302引脚功能与内部结构 (5)3.1.2 DS1302的寄存器 (5)3.2 AT89C52简介 (6)四、方案设计和论证 (6)五、软硬件设计 (7)5.1硬件电路设计 (7)5.2软件实现 (8)5.2.1主程序 (8)5.2.2时钟读出程序设计 (12)5.2.3时钟调整程序设计 (13)六、系统调试 (13)七、总结 (14)八、参考文献 (14)一、设计任务及主要技术指标和要求1.1 设计任务:用DS1302时钟芯片设计实时时钟。
1.2 主要技术指标和要求:(1)通过程序直接对实时时钟时间进行设置,启动时钟运行。
用8位数码管显示。
(2)通过按钮对实时时钟时间进行设置,使时钟能正常运行。
(3)其他发挥功能。
二、引言从古代的滴漏更鼓到近代的机械钟,从电子表到目前的数字时钟,为了准确的测量和记录时间,人们一直在努力改进着计时工具。
钟表的数字化,大力推动了计时的精确性和可靠性。
在单片机构成的装置中,实时时钟是必不可少的部件。
目前常用的实时时钟,很多采用单片机的中断服务来实现,这种方式一方面需要采用计数器,占用硬件资源,另一方面需要设置中断、查询等,同样耗费单片机的资源,而且某些测控系统可能不允许;有的则使用并行接口的时钟芯片,如MC146818、DS12887等,它们虽然能满足单片机系统对实时时钟的要求,但是这些芯片与单片机接口复杂,占用地址、数据总线多,芯片体积大,占用空间多,给其它设计带来诸多不便。
本设计选取串行接口时钟芯片DS1302与单片机同步通信构成数字时钟电路。
其简单的三线接口能为单片机节省大量资源,DS1302的后背电源及对后背电源进行涓细电流充电的能力保证电路断电后仍能保存时间和数据信息等。
这些优点解决了目前常用的实时时钟所无法解决的问题。
该时钟电路强大的功能和优越的性能,在很多领域的应用中,尤其是某些自动化控制、长时间无人看守的测控系统等对时钟精确性和可靠性有较高要求的场合,具有很高的使用价值。
三、核心芯片简介3.1 DS1302简介DS1302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟芯片,它可以对年、月、日、周日、时、分、秒进行计时,且具有闰年补偿功能,工作电压宽达2.5~5.5V。
时钟可工作在24小时格式或12小时(AM/PM)格式。
DS1302与单片机的接口使用同步串行通信,仅用3条线与之相连接。
可采用一次传送一个字节或突发方式一次传送多个字节的时钟信号或RAM数据。
DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。
DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。
3.1.1 DS1302引脚功能与内部结构DS1302的引脚功能如表1所示,外形及内部结构如图1所示:表1 DS1302引脚功能表3.1.2 DS1302的寄存器图1 DS1302管脚图及内部结构图DS1302共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD 码形式。
其时间寄存器及其控制字见表2。
此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM 相关的寄存器等。
时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器的内容。
DS1302与RAM相关的寄存器分为两类,一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H--FDH,其中奇数为读操作,偶数为写操作;再一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。
寄存器名命令字取值范围各位内容写操作读操作7 6 5 4 3 2 1 0秒寄存器80H 81H 00--59 CH 10SEC SEC 分寄存器82H 83H 00--59 0 10MIN MIN时寄存器84H 85H01-12或00-2312/24 0 10 HR HR 表2 DS1302的时钟寄存器及其控制字3.2 AT89C52简介图2 AT89S51引脚图功能特性概括:AT89S51提供以下标准功能:40个引脚、4K Bytes Flash片内程序存储器、128 Bytes 的随机存取数据存储器(RAM)、32个外部双向输入/输出(I/O)口、5个中断优先级2层中断嵌套中断、2个数据指针、2个16位可编程定时/计数器、2个全双工串行通信口、看门狗(WDT)电路、片内振荡器及时钟电路。
四、方案设计和论证使用串行接口时钟芯片DS1302设计时钟电路。
该设计方案以单片机AT89C52为主控芯片,以串行时钟芯片DS1302为核心计时芯片,组成数字时钟电路。
该电路不但能准确地计时、附加其它功能,而且,其三线接口可以节省接口资源,在断电后不丢失时间和数据信息。
设计方案接口简单,计时可靠,综合性能良好。
图3 时钟芯片DS1302设计时钟五、软硬件设计5.1硬件电路设计LED数码管采用动态扫描方式显示,P0口为段码输出口,P2口为扫描驱动口,扫描驱动信号经74HC224功率放大来低点亮电源。
计时按键设计了2个,分别接在P3.5,P3.6口,用于设定与加一调整。
DS1302时钟芯片的晶挣频率为32.78KHz。
秒表/时钟计时器的硬件电路如图,采用32.768KHz晶振可有利于提高秒计时的精确性。
图4 DS1302实时时钟硬件仿真电路5.2软件实现5.2.1汇编的主程序#include <reg51.h>//#define uchar unsigned char#define unit unsigned int#define ulong unsigned longsbit BUZZ=p3^7;sbit KEY1=p1^0;sbit KEY2=p1^1;uchar hour_reg,minute_reg,second_reg;void delay(uint);void display(uchar*);void time2str(uchar*);void time_set(void);void main(void){uchar dispram[9];TMOD=0x11;IE=0x82;TR0=1;while(1){time2str(dispram);display(dispram);if (KEY1==0) time_set(); }}void time2str(uchar*ch){ch[0]=hour_reg/10;ch[1]=hour_reg%10;ch[2]=16;ch[3]=minute_reg/10;ch[4]=minute_reg%10;ch[5]=16;ch[6]=second_reg/10;ch[7]=second_reg%10;}void time_set(void){uchar ch[8];uchar i,c;TR0=0;second_reg=0;time2str(ch);do{display(ch);}while(KEY1==0);C=2;while(c){time2str(ch);if(c==2) {ch[0]|=0x80;ch[1]|=0x80;}else {ch[3]|=0x80;ch[4]|=0x80;}display(ch);if(KEY1==0);{c--;do{display(ch);}while (KEY1==0);}if(KEY2==0){if(c==2) hour_reg=(hour_reg+1)%24;else minute_reg=(minute_re+1)%60;for(i=0;i<50;i++) display(ch);}}TR0=1;}void delay(unsigned int dt){register unsigned char bt,ct;for(;dt;dt--)for(ct=2;ct;ct--)for(bt=250;--bt;);}void display(uchar*disp_ram){static uchar disp_count;unsigned char i,j;unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0xff};disp_count=(disp_count+1)&0x7f;for(i=0;i<8;i++){j=disp_ram[i];if_j&0x80) p0=9disp_count>32)? table[j&0x7f]:0xff; else p0=table[j];p2=0x01<<i;delay(1);p0=0xff;p2=0;}}void T0_time(void)interrupt 1{static uchar T0_count=0;TL0=0xb0;TH0=0x3c;T0_count>=20)(T0_count=0;second_reg++;if(second_reg>=60){second_reg=0;minute_reg++;if (minute_reg>=60){minute_reg=0;hour_reg=(hour_reg+1)%24;}}}}5.2.2时钟读出程序设计图5 时钟读出程序流程5.2.3时钟调整程序设计图6 时钟调整程序流程六、系统调试当一切准备就绪,开始调试。