基于单片机的电子万年历的设计.docx
- 文档编号:9011712
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:10
- 大小:235.13KB
基于单片机的电子万年历的设计.docx
《基于单片机的电子万年历的设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的电子万年历的设计.docx(10页珍藏版)》请在冰点文库上搜索。
基于单片机的电子万年历的设计
基于单片机的电子万年历的设计
摘要本文以AT89C2051单片机为主控芯片,采用美国DALLAS公司的涓细充电时钟芯片DS1302为时钟控制芯片,设计了一个电子万年历,能够显示年、月、日、时、分、秒、星期信息。
关键词实时显示AT89C2051单片机
0、引言
日常生活生产中有许多地方需要电子时钟和日历,比如家庭,办公室,以及一些智能化仪表。
目前的电子时钟日历系统多采用时钟芯片以简化系统的设计。
DSl302是众多时钟芯片中一款性价比较高的产品。
以AT89C2051单片机为主控芯片,采用美国DALLAS公司的实时时钟芯片DSl302为时钟控制芯片,设计并实现的各种时钟控制电路,应用于各种家电、实验设备等。
其能够显示年、月、日、时、分、秒、星期。
并且可根据需要对各个位进行调节。
1、电子万年历的硬件电路设计
硬件电路设计是电子时钟日历系统设计的第一步。
系统由主控模块,时钟芯片。
显示电路、键盘扫描电路共四个部分组成,电路构成,框图如图l所示。
图l电子万年历系统的框架图
主控芯片使用MCU-51系列的AT89C2051单片机,时钟芯片使用美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟DSl302。
采用DSl302作为主要计时芯片,可以作到计时准确。
更重要的是,DSl302可以在很小的后备电源(2.5-5.5V电源,在2.5V时耗电小于300Na)下继续计时,并可编程选择多种充电电源来对后备电源进行慢速充电,可以保证后备电源基本不耗电。
显示电路采用普通的共阳极LED数码管,键输入采用独立式按键实现调整功能。
2、主控制器AT89C2051
AT89C2051是一个有2k字节可编程EPROM的高性能的微控制器(Microchip).AT89C2051是一种功能强大的微控制器,它对很多嵌入式控制应用提供了一个高度灵活的有效的解决方案。
它有以下特点:
2k字节EPPROM、128字节RAM、15根I/O线、2个16位定时/计数器、5个向量二级的中断结构、一个全双向的串行口、一个精密的模拟比较器、片内振荡器和时钟电路.
3、DSl302时钟芯片的工作原理
DSl302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟芯片,它可以对年、月、日、时、分、秒、星期等进行计时,且具有闰年补偿功能,工作电压范围2.0~5.5V。
DSl302采用三线接口与CPU进行同步通信,可一次传送一字节数据或采用突发方式一次传送最多达31字节的时钟数据或RAM数据。
其内部有一个31×8的用于临时性存放数据的RAM寄存器。
3.1引脚功能
DSl302的引脚如图1所示。
VCC2为主电源供应引脚,VCCl连接在备份电源以便在没有主电源时保持正常走时和保存RAM中的数据。
当VCC2大于VCCl+0.2V时,VCC2给DSl302供电,反之,由VCCl向DSl302供。
X1、X2为外接32.768KHz晶振引脚。
SCLK为3线接口的时钟引脚。
I/O为串行数据输入输出端(双向)引脚。
GND共地引脚。
RST是复位/片选线。
图1DSl302的引脚图
3.2DSl302的控制字节
DSl302的一次数据传送是从发送控制字节开始的。
DSl302的控制字节的最高有效位(位7)必须是逻辑l,如果它为0,则不能把数据写入到DSl302中;位6表示要读写的数据类型,如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示要操作单元的地址;最低有效位(位0)表示命令类型,为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。
3.3DSl302的复位特征和时钟控制要求
通过把RST输入驱动置高电平来启动所有的数据传送。
RST输入有两种功能:
①RST接通控制逻辑,允许地址/命令序列送入移位寄存器;②RST提供了终止单字节或多字节数据的传送手段。
当RST为高电平时,所有的数据传送被初始化,允许对DSl302进行操作。
如果在传送过程中置RST为低电平,则会终止此次数据传送,并且I/O引脚变为高阻态。
上电运行时,在VCC≥2.5v之前,RST必须保持低电平。
只有在SCLK为低电平时,才能将RST置为高电平。
3.4数据输入输出I/O
向DSl302写入数据时,数据在控制字节输入后的下一个SCLK周期的上升沿被写入,多余的SCLK将被忽略。
数据写入时从低位(位0)开始;同样,从DS1302读取数据时,数据在紧跟控制字节后的下一个SCLK的下降沿读出读出数据时也是从低位(位0)到高位(位7),只要RAT保持高电平,额外的SCLK将导致数据字节的持续读出,这个特性用于实现该芯片的突发读模式。
突发模式下,可以一次性读出所有日历时钟数据或RAM数据。
3.5DSl302的寄存器
DSl302共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字如表1所列。
表1DSl302的日历、时钟寄存器及其控制字
此外,DSl302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。
时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。
Dsl302与RAM相关的寄存器分为两类,一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。
4、DS1302与微控制器的连接及软件控制
4.1DSl302与AT89C2051的连接
DSl302与AT89C2051的连接仅需要三条线,即SCLK、I/O、RST。
如图2所示,其中时钟的显示用LCD显示。
图2DSl302与CPU的电路连接
4.2软件控制
DSl302的实时时间流程图如图3所示。
图3DSl302的实时时间流程图
下面结合流程图对DSl302基本操作进行编程:
#include“Intrins.h”
sbitt_clk=P3^3;
sbitt_io=P3^4;
sbitt_rst=P3^5;
sbitBIT7=ACC^7;
sbitBITO=ACC^O;
voidinputbyte(unsignedcharucda)//八位数据写入函数
{unsignedchari;
ACC=ucda;//将要写入的数放入ACC
t_rst=l;//启动数据传送
for(i=8;i>0;i--)//循环八次,写入八位数据,从低位到高位
{t_io=BIT0;//将Accn0的值赋给时钟数据线
t_clk=0;
t_clk=l;;;//在时钟线的上升沿写入一位数据
ACC=ACC>>1;//将高一位数据移至ACC“0
}
}
unsignedcharoutputbyte(void)//八位数据读出函数
{unsignedchari;
t_rst-1;//启动数据传送
for(i=8;i>0;i一)//读出八位数据,从低位到高位
{ACC=ACC>>1;//将前一下降沿读出的数据右移一位,
从而该次读出的数放入ACC^7
t_io=l;P1口输入之前置l
t_clk=l;
t_clk=0;;;//时钟线下降沿读出一位数据
BIT7=t_io;//cannotuseP1^7=t_ioforP1^7notavarient
}
return(ACC);
}
//将指令或数据写入对应寄存器
voidwr_l302(unsignedcharadd,unsignedcharucda)
{t_rst=0;
t_clk=O;
t_rst=l;;;
inputbyte(add);
//delayl5
(1);
inputbyte(ucda);
t_rst=O;
t_io=l;
}
unsignedcharre_1302(unsignedcharadd)//读出对应寄存器内容
{unsignedcharucda;
t_rst=0;
t_clk=0;
t_rst=1;;;
inputbyte(add);
//delayl5
(1);
ucda=outputbyte();
t_rst=0;
return(ucda);
}
voidsetl302(unsignedchar*pda)//设置时间初值
{unsignedchari;
unsignedcharadd=0x80;
wr_1302(0x8e,Ox00);//将控制寄存器值设为零,最高位WP=0允许写
for(i=7;i>0;i--)//将七个时问初值写入对应寄存器
{wr_1302(add,*pda);//写对应时钟寄存器的值
pda++;
add+=2;
}
wr_1302(0x8e,0x80);//写保护,防止干扰影响时间值
}
voidget_l302(unsignedcharcurtilne[])//读取当前时间值
{unsignedchari,j;
unsignedcharadd=Ox8l;
bdataunsignedcharsec;
for(i=0;i<7;i++)
{curtime[i]=re_1302(add);//读对应时钟寄存器的值
sec=curtime[i];
j=sec>>4;//将BCD码转化成对应十进制数
j*=10;
sec=sec&0xOf;
sec+=j;
cuItinle[i]=sec;
add+=2;
}
4.3根据在调试中出现的问题,作如下说明:
(1)DSl302与微处理器作数据交换时,首先由微处理器向芯片发送命令字节,命令字节最高位MSB(D7)必须为逻辑1,如果D7=0,则禁止写DSl302,即写保护;D6=0,指定时钟数据,D6=1,指定RAM数据;D5~D1指定输入或输出的特定寄存器;最低位LSB(D0)为逻辑0,指定写操作(输入),D0=1,指定读操作(输出)。
(2)在DSl302的时钟日历或RAM进行数据传送时,DSl302必须首先发送命令字节。
若进行单字节传送,8位命令字节传送结束之后,在下2个SCLK周期的上升沿输入数据字节,或在下8个SCLK周期的下降沿输出数据字节。
(3)要特别说明的是备用电源B1,可以用电池或者超级电容(0.1F以上)。
虽然DSl302在主电源掉电后,耗电很小,但如果要保证时钟长时间正常,最好选用小型充电电池。
可以用老式电脑主板上的3.6v充电电池。
如果断电时间较短(几小时或几天)时,就可以用漏电较小的普通电解电容代替。
100心就可以保证l小时的正常走时。
DSl302在第一次加电后,须进行初始化操作。
初始化后就可以按正常方法调整时间。
5、总结
DSl302这种芯片存在时钟精度不高、易受环境影响、出现时钟混乱等缺点。
DSl302可以用于数据记录,特别是对某些具有特殊意义的数据点的记录上,能实现数据与出现该数据的时间同时记录。
这种记录对长时间的连续测控系统结果的分析以及对异常数据出现的原因的查找有重要意义。
传统的数据记录方式是隔时采样或定时采样,没有具体的时间记录,因此只能记录数据而无法准确记录它出现的时间:
若采用单片机计时,一方面需要采用计数器,占用硬件资源,另一方面需要设置中断、查询等,同样耗费单片机的资源,而且某些测控系统可能不允许,但如果在系统中采用时钟芯片DSl302则能很好地解决这个问题。
主要参考资料:
[1]李华.MCU-51系列单片机实用接口技术.北京:
北京航空航天大学出版社,1993.6
[2]张毅刚,彭喜元.新编MCS-51单片机应用设计[M].哈尔滨:
哈尔滨工业大学出版 社,2003,
[3]何立民主编.单片机应用技术选编(6)[M].北京:
北京航空航天大学出版社,1998.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 电子 万年历 设计