该系统是以52单片机为基础,以时钟日历芯片DSl2887为核心构建的时钟系统。完成的功能如下:显示年、月、日、星期、小时、分钟、秒钟,具有1OO年的日历,具有掉电不丢失性,能够通过按键调整时间。DS12887内置锂电池,可以在掉电情况下工作10年。
一、芯片简介
在C语言程序中要读取或写入数据非常简单,只需要一条语句即可实现。在汇编语言中就是对MOVX语句的时序分析。DS12887的英特尔读周期时序如上图,写周期时序如下图所示:
最后简单介绍一下DS12887的控制字定义:
上面已经提到DSl2887内部有128字节的存储空间。其中前14字节为特别定义区(具体定义见PDF),后114字节为随机存储区。
14字节特别定义区的具体定义如上表所示。其中0x7f00~0x7f0D是由于在本系统中选用单片机P2.7引脚接CS端所决定的。这些地址的最高位都为0,对应P2.7引脚,会使得在写入或读取的过程中在P2.7引脚上恰好产生低电平,选中芯片,完成英特尔总线时序。如果我们将单片机P2.6引脚接CS端,地址范围应为:0xbf00~0xbf0D,其中b的二进制为1011,对应会使得P2.6引脚产生低电平的片选脉冲。从0~9号地址为年月等的寄存器,用户可以读取和写入。10~13号地址为控制寄存器,寄存器D为只读,寄存器A~C的各位具体定义介绍如下(如下表)
●UlP:只读状态标志;
●DV0~2:控制芯片内部晶振位,010组合打开晶振正常工作;
●RS0~3:设定中断速率和SQW方波输出;
●SET:读写控制位,1时可以初始时钟日历字节;
●PIE、AIE、UIE:分别为周期、闹钟、更新结束中断允许位;
●PF、AF、MF:分别为周期、闹钟、更新结束中断标志位
●IRQF:中断请求标志位,IRQF=PF·PlE+AF·AlE+MF·UIE;
●SQWE:方波输出允许位;
●DM:选择数据为二进制(1)或BCD(0)码格式;
●24/12:选择时钟为24,小时格式门2小时格式;DSE:白天节时,置0就行。
二、实物制作
原理图如上图所示。实际制作的电子日历系统的PCB版图如下图。在下图中WR、RD、INTO、GND和VCC标号处的焊盘是飞线用的,这里是单面板,工艺上只能达到15mil粗细程度,所以飞线之处较多。笔者认为ZLG7289在系统里边仅用来控制8个按键,有些浪费,读者可以直接挂在单片机I/O口上,不过不要忘了按键去抖,但是液晶的使用还是很有必要的,因为日历的信息比较多,如果只用8个数码管,不方便。图中考虑到在调试过程中的测试方便,将单片机的各端口都用排针引出来了。安装完成后,将程序写入,这种并口的芯片调试容易。
将图中的元器件参数列表如下:
AT89S52、DS12887、ZLG7289、LCDl602各一;C1、C2、C4、C5、C6:30pF瓷片电容;C3:1μF电解电容;C7:100μF电解电容;C8:1000μF电解电容;C9:10μF电解电容;R1、R4、R6:10kΩ欧姆电阻;R5、R7:1欧姆电阻;R2:2.2kΩ欧姆电阻;R3:1OO欧姆电阻;R11:100kΩ欧姆电阻;104、104J:100kΩ排阻;1602:16脚排针;P0,P1,P2,P3:8脚排针;SPI:6脚排针;D1:红色LED指示电源;LS1:蜂鸣器;Q1:PNP三极管9012;S1~S8:两脚封装的按键;Y1、Y2:12MHz晶振;
三、程序设计
下面是DS12887的驱动程序和调时程序。
我们开始要在主程序的开始设置一个初始化DS12887的函数,写入使晶振开启和设置初始时间的命令。在调试成功后,应该将这个初始化函数删掉,这样在单片机掉电又重新上电后就不用重新设置时间。
上面的程序就是删掉初始化函数后的样子。这样就完成了掉电后不会丢失时间的功能,这对于时钟日历来说,是一个非常实用的功能。
在主程序中,可以通过编程实现人机交互,完成调整DS12887内部时间的程序,还可以设定闹钟,完成报时功能。
举例如下:
开启和关闭晶振.