基于I2C总线电子万年历的设计与实现
2011-03-16王文卿李钟慎
王文卿, 李钟慎
(华侨大学 机电及自动化学院, 福建 厦门 361021)
0 引言
机械时钟工艺复杂,且寿命短,误差大。本文基于I2C总线(一种简单的双向二线制串行通信总线,由数据线SDA和时钟SCL构成。允许多个符合I2C总线标准的器件通过同一条I2C总线进行通信,而不需要增加额外的地址译码器[1]),设计并实现了电子万年历计时系统。该系统不但具有更高的直观性和精确性,而且整个系统简单实用,可操作性高。在家庭居室、学校、车站和广场得到了广泛的使用,给人们的生活、学习、工作带来极大的方便。
1 系统整体设计及其工作原理
图1为系统的整体结构图,主要由电源模块、时钟模块、显示模块、键盘模块、闹铃模块和单片机模块组成。P89V51RB2微控制器是整个系统的核心部分,它来控制整个系统的工作流程。
图1 系统整体结构图
系统的工作原理为微控制器通过时钟线SCL和数据线SDA将键盘模块、时钟模块和显示模块连接。时钟模块提供时间、日期信息,由微控制器控制显示模块显示这些信息。键盘模块有4个按键,来校正当前时间和日期,闹铃模块由微控制器控制,实现定点闹铃功能。
2 硬件电路设计
2.1 基于PCF8563的时钟电路
PCF8563是Philips生产的一款时钟芯片,带有400KHz的I2C总线接口,能提供年、月、日、时、分、秒信息,采用I2C总线协议(从机地址:读,0A3H;写,0A2H)设计,与单片机的连接非常的方便,因此时钟电路利用该芯片,为系统提供精确的时间信息[2]。图2所示为PCF8563构成的典型时钟电路。
图2 时钟电路图
图2中,PCF8563的SCL和SDA引脚内部漏极开路,因此使用时需要外接阻值为5.1kΩ的上拉电阻。
2.2 显示与按键模块电路
ZLG7290是周立功公司生产的一款专用控制显示与按键的芯片。它能够直接驱动8位共阴式数码管(或64只独立的LED),同时还可以扫描管理多达64只按键[3]。其内部有8个显示缓冲寄存器DpRam0~DpRam7,它们直接决定数码管显示的内容;2个命令缓冲寄存器 CmdBuf0和 CmdBuf1,通过向命令缓冲寄存器写入相关的控制命令可以实现段寻址、下载显示数据、控制闪烁等功能。ZLG7290采用I2C总线与微控制器的连接,仅需两根信号线,简单明了,ZLG7290的I2C总线器件地址是70H(写操作)和71H(读操作)。此电路中就是通过I2C总线将时钟模块的信息经由微控制器送到ZLG7290命令缓冲寄存器,控制显示缓冲寄存器显示时间信息。
图3 显示与按键模块电路原理图
图3为显示与按键模块电路的原理图。其中芯片ZLG7290工作所需晶振的频率为11.0592MHz,驱动两个4位数码管显示时间、日期等。SDA和SCL分别为I2C总线的数据线和时钟,通过这两根信号线与主控制器通信。ZLG7290同时还控制四个按键S3(SET):设置时间日期的启动键,按下开始设置;S4(NEXT):在各个数位之间切换;S5(ADD):对某一位的值进行加一操作;S6(SUB):对某一位的值进行减一操作[4]。通过这4个按键就可以方便地,任意地调节时间和日期。
2.3 单片机电路(单片机最小系统)
单片机最小系统由P89V51RB2单片机,复位电路以及振荡电路组成。复位电路采用电阻电容式复位电路,简单易行,实现手动复位。振荡电路使用11.0592MHz的晶振起振。P89V51RB2是一款80C51微控制器,包含16kB Flash 和 1024字节的数据 RAM。
图4 单片机最小系统
最小系统如图4所示,P1.6和P1.7分别为I2C总线的时钟信号线SCL和数据传输线SDA,使得P89V51RB2,ZLG7290以及PCF8563通过I2C总线进行通信;P1.0用于对ZLG7290进行软件复位;P1.1用于控制蜂鸣器的通断,实现闹钟功能;Reset为系统硬件复位;中断INT0与时钟芯片相连。
图5为RS232通信接线方式。其中RXD为串行通信RS232的输入端,TXD为串行通信RS232的输出端。本系统中单片机输入输出电平为TTL电平,而PC配置的是RS232标准串行接口,二者之间的电气规范不一致,因此必须通过MAX232把SCM的信号电平(TTL电平)转换为RS232电平。实际应用中只用该串口的接收(RXD)、发送(TXD)和地线(GND)3个管脚[5-6]进行通信。
图5 RS232通信接线
3 软件设计
3.1 主程序设计
主程序实现系统所需的所有功能,是一个无限循环程序。在循环体中,调用显示子程序显示当前时间和日期;调用按键子程序扫描键盘,返回按键值,根据不同的键值进行相应的按键处理[7]。
3.2 显示子程序设计
显示子程序主要完成在两个4位LED数码管组成的显示屏上显示时间或日期。如图6显示子程序的流程图所示,显示子程序主要由ZLG7290_SendBuf,ZLG7290_ SendCmd,ISendStr等3个主要的子函数构成。其中ZLG7290_SendBuf的功能是向显示缓冲区发送数据,将时间的十进制数值转化为ZLG7290的控制命令格式放入到disp_buf数组中,将其作为参数传递给ZLG7290_ SendCmd进 行 处 理;ZLG7290_SendCmd功 能 是 向ZLG7290的子地址07H和08H(ZLG7290的命令缓冲区)发送控制命令,将从ZLG7290_SendBuf传来的命令传递给函数ISendStr进行处理;ISendStr的功能是从启动总线到发送地址,子地址,数据,结束总线的全过程。此处通过I2C总线将由ZLG7290_SendCmd传来的命令传至ZLG7290的命令缓冲区,控制数码管的亮与灭,从而实现时间与日期的显示[4]。
3.3 按键子程序设计
按键子程序实现读取按键键值,按键处理以及具体的时间、日期设置。主要由ZLG7290_GetKey,Process_ Key,Set_Date和Set_Time_Alarm等4个 函 数 组 成。ZLG7290_GetKey功能是当有按键按下时,通过I2C总线操作读取存放在ZLG7290键值寄存器中的键值,键值储存在变量Key中,并返回键值;Process_Key的功能是根据系统现在所处的模式,调用相应的处理子程序。当Sysmod=1时,调用函数Set_Date完成日期设置;当Sysmod=2、3时,调用函数Set_Time_Alarm完成时间及闹铃时间设置;当Sysmod=4时,实现按任意键停止报警功能;Set_Date功能是根据接收的按键值,对日期设置作相应的处理,主要检测输入数值是否合法;Set_ Time_Alarm功能是用来设置系统时间及闹铃时间。若Tmode=2,该函数用来设置系统时间;Tmode=3,用来设置系统的闹铃时间[4,8]。
图6 显示子程序流程图
4 实验结果及结论
根据上述软件和硬件的设计,结合各种相关元器件实现了电子万年历计时系统。由于手机的时间精确,可以作为标准。现通过反复的实验测试,将系统时钟行走一天的时间与手机时钟行走一天的时间进行比较并修正,得出如表1和表2所示的两组数据:
表1 外接电容为22pf时的测试数据
表1是图2中的电容C11和C12选取22pf时测得的数据。从表中可以看出系统时钟一天的误差比较大,平均超过6s/天。由于负载电容过大会使晶振的振荡频率降低,使振荡频率偏离它的标称值(32.768kHz),并最终导致时钟走的偏慢[10]。因此,将C11与C12换成15pf的电容后又进行了一次测试。得到了如表2中所示的数据。
表2 外接电容为15pf时的测试数据
由表2可以看出,系统时钟的计时小于1s/天,计时精准,满足设计要求,并能应用于我们的日常生活中。
[1] 魏芬. I2C总线协议应用指导书[M]. 南京:航空工业出版社,2010:17-22.
[2] 周立功. 单片机实验与实践教程[M]. 北京:北京航空航天大学出版社,2008:68.
[3] 李长林. Visual Basic串口通信技术与典型实例[M].北京: 清华大学出版社, 2006: 23-26.
[4] 刘坤. 51单片机C语言应用开发技术大全[M]. 北京:人民邮电出版社,2008: 581-582.
[5] 徐永洪,符影,杰江峰. 基于VB 6.0的串口通信实现[J].仪器仪表用户, 2004( 1) : 46-48.
[6] 张毅刚,彭喜元,姜守达,乔立岩. 新编MCS-51单片机应用设计[M]. 3版.哈尔滨:哈尔滨工业大学出版社,2008:257-258.
[7] 王怀平. Proteus仿真设计基于单片机AT89C51的电子万年历[J]. 科技广场,2008(10):197-198.
[8] 求是科技. 8051系列单片机C程序设计完全手册[M].北京:人民邮电出版社,2006.
[9] 白延敏. 51单片机典型系统开发实例精讲[M].北京:电子工业出版社,2009:113-117.
[10] 赵声衡,赵英. 晶体振荡器[M].北京:科学出版社,2008.