引言
DS1302时钟芯片功能强、功耗低,可以提供年、月、日、时、分、秒及带闰年补偿等信息。它内部有一个31字节RAM的高速数据暂存器,工作电压在2.0~5.5 V范围内选择。它与时钟/RAM间的通信仅需3根线: RST(复位)、I/O(数据线)和SCLK(串行时钟)。时钟信号或RAM数据可以每次1字节或多达31字节的多字节形式传送。它具有主、备双电源,在没有主电源的情况下仍能保存时间信息及数据,能够对备用电源进行慢速充电[1]。
图1 DS1302引脚图
DS1302的引脚如图1所示。Vcc1为后备电源,Vcc2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2高于Vcc1+0.2 V时,Vcc2给DS1302供电。当Vcc2低于Vcc1时,DS1302由Vcc1供电。X1、X2为振荡源,外接32.768 kHz晶振。I/O为串行数据输入/输出端(双向),SCLK为时钟输入端。
RST是复位片选线,通过把RST输入驱动置为高电平来启动所有的数据传送。RST输入有两种功能:
① RST接通控制逻辑,允许地址/命令序列送入移位寄存器;
② RST提供了终止单字节或多字节数据的传送手段。当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中置RST为低电平,则会终止此次数据传送,并且I/O引脚变为高阻态。上电运行时,在Vcc高于2.5 V之前,RST必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。DS1302与单片机AT89S52的连接如图2所示[1]。
图2 DS1302与AT89S52接口电路
1 时间锁定实现方法
1.1 应用背景
沈阳某电机厂研制节能电机,为了用事实证明其电机节能,承诺客户使用该电机一段时间(比如3个月),客户可将这段时间节省的电费作为购买电机的费用。试用期到期后,电机的所有权归客户。但为了防止某些信用度较差的客户在试用电机节电后,不给电机公司任何报酬且不归还电机,所以有必要实现时间锁定和密码保护功能。试用时间一到,电机将跳闸,并且用数码管显示出跳闸的原因(例如显示数字1),同时提供声光报警。如果要继续使用该电机,则必须向该电机生产厂家索取密码,此时厂家就可以按合同规定索要自己应得的报酬,然后重新设定到期时间。手动按键复位后,电机可继续正常使用。利用DS1302可以很方便地在具有微处理器芯片的机器上实现时间锁定功能。
1.2 硬件电路设计
采用AT89S51/52单片机进行数据采集、处理、传输,定时芯片DS1302用于定时控制,显示芯片HD7279用于显示时间及跳闸原因,选用串行通信总线接口RS232标准接口来实现单片机与PC机双向通信的功能,通过上位机发送定时时间和报警时间。
1.3 时间锁定的实现
参考文献[2]中是将超期标志写入E2PROM中的特定字节。开机时从E2PROM中读入超期标志字节,确定是否需要密码。但同时应该考虑到如果发生掉电现象,应采取相应的措施。传统的数据掉电保护是设计一个掉电检测电路,当发生掉电时,由它向MCU发出中断;MCU响应中断后,在中断服务程序中完成数据的备份。用于数据备份的RAM要加备用电源。如果采用E2PROM,虽然省去了备用电源,但E2PROM 存在写入寿命、写入时间问题。由于写入时间太长(10 ms),电路中还要考虑使用大电容,以提供必要的写入电压。如果电压下降到系统无法工作时,数据还未写完,那么数据备份就会出错。综上所述,传统的数据掉电保护存在占用硬件资源太多、数据备份不可靠的问题。
DS1302的RAM是一种静态RAM,可以反复读写,而且消耗的功率非常低,与时钟共用备用电源。用它做数据备份非常合适,还可以省去掉电检测电路[3],所以将设定的时间写入DS1302自带的RAM中。在电机出厂时,在DS1302芯片中写入试用到期的时间(如2007年07月07日)。每次上电时,程序从时钟芯片中读出当前日期(如2007年07月06日),与机器出厂设定的初始时间进行比较,判断是否超期;显然没有超期,则进入主程序循环,正常工作。如果当前日期为2007年07月08日,则超期,单片机发出超期信号,电机跳闸,将超期标志用数码管显示出来,并且提供声光报警。如果客户已履行合同中的义务,则电机生产厂家进入VB界面,在输入正确的密码后重新设定时间,则电机又可以正常工作。
1.4 密码保护的实现
图3 工作流程
根据与设定时间相同的原理,将密码写入DS1302的RAM中,避免了掉电数据丢失的情况,使密码始终存在于RAM中。一旦超期要修改设定时间时,可以通过VB界面很方便地实现。
整个工作流程如图3所示。
检测时间部分程序如下:
bit check_time(void) {
uchar time[7]={0};
uchar ram[7] ={0};
uchar i;
bit time_flag=0;//时间超期标志
burstr1302(time);//读出DS1302的当前时间
for(i=0;i<7;i++) { //读出DS1302 RAM中的设定时间
ram[i]=read1302(ram_r+2*i);
}
if(time[6]>ram[6])//time[6]为设定时间的年份
time_flag=1;
else if(time[4]>ram[4])//time[4]为设定时间的月份
time_flag=1;
else if(time[3]>ram[3])//time[3]为设定时间的日期
time_flag=1;
else if(time[2]>ram[2])//time[2]为设定时间的小时
time_flag=1;
else if(time[1]>ram[1])//time[1]为设定时间的分钟
time_flag=1;
else if(time[0]>ram[0])//time[0]为设定时间的秒钟
time_flag=1;
else
time_flag=0;//若未超期,则超期标志为0
return time_flag;
}
结语
采用单片机的控制系统结构简单,工作稳定,加之采用成熟的集成电路使系统几乎免维护,符合作为检测的工程要求,充分体现了其小型化、智能化的优点;而采用C语言编写的程序可读性较高,编写简单,运行可靠,在小型的控制系统中应用很广。目前,该利用DS1302实现时间锁定和密码保护功能的电机保护器已在沈阳某公司投入使用,效果良好,正在产品化,有待进一步推广。