教你用PCF8563制作电脑校时日历钟
特点
(1)使用廉价的单片机STC90C52RC;
(2)时间源使用性能好、价格低、接线简单的RTC集成电路PCF8563;
(3)LCD1602字符液晶显示;
(4)DS18B20温度传感器带4位温度显示;
(5)与简单的上位机程序配合,通过电脑校正时间;
(6)可以精准校正时间源的频率,误差很小。
数字时钟种类很多,虽然它的作用就是——显示时间,但是具体实现起来,方法却多种多样。通过制作电子时钟,我们可以附带学到很多东西,所以大家也喜欢制作它。图11.1所示是本次制作的电子时钟。
图11.1 电脑校时日历钟
电路原理
电路原理图如图11.2所示,硬件接线比较简单。字符液晶1602通过插针和排针座与电路板连接,MAX232和9孔D型串口插座J2用于STC单片机的程序下载以及和计算机通信,实现与计算机上时间的同步。IC3是实时时钟电路PCF8563,它的电源串接有二极管VD2,总电源接通时,通过它给PCF8563供电。断电过程中,后备电池GB通过R5以很小的电流(0.25μA)维持PCF8563继续工作,同时,二极管可防止BAT向其他电路供电,以免电池很快耗尽。电阻R6、R7是I2C总线的上拉电阻,单片机通过程序模拟I2C的动作,通过P1.6、P1.7读写PCF8563。C13是时钟电路的振荡电容,通过它可以微调振荡频率。JP2是用于校正的跳线块,调校时接通,配合程序使PCF8563的引脚连接10kΩ上拉电阻R9,通过编程使该引脚输出32768Hz的振荡频率,以便外接频率计调校快慢。IC4是测温芯片DS18B20,读写是通过单片机的P1.5引脚控制。电源使用的是5V/2A的开关型墙插电源,适用交流电压范围宽,发热低,也省掉了稳压集成电路,只要加一个滤波电容C1和一个旁路电容C2即可。RP1可用于液晶显示屏的对比度调节。液晶1602的数据线有8线和4线两种接法,前者要多接4根线,但程序稍微简单,速度也快一点,后者虽然接线简单,但编程比较复杂。本制作使用8线接法:液晶的数据线DB0~DB7对应接到MCU的P0.0~P0.7引脚,液晶的控制线RS、RW、E分别接到P2.3、P2.4、P2.5。控制按键S1、S2、S3互相配合用来人工校对时钟,S1用来改变校对项目,S2用来调整对应项目数据,S3用来确认新设定值。如果单独使用S3则是启动单片机的串口通信,准备接收来自计算机的时、分、秒数值,并用它设置PCF8563,使它和北京时间同步运行。开关S的作用是控制闹钟,它若断开,则闹钟功能有效;它若接地,则闹钟功能禁止,但设置的闹钟时间仍然有效。
图11.2 电路原理图
电路材料和元件
带电源座、串口座和USB插座预留孔的万用板1块,尺寸10cm×10cm;
LCD1602字符液晶模块1个,黄绿或蓝白不限;
STC90C52RC单片机1个,配40针插座;
MAX232集成电路1个,配16针插座;
PCF8563集成电路1个,配8针插座;
11.0592MHz晶体和32768Hz晶体各1个;
直脚排针座1条,用来连接液晶模块;
40线直排针1条,用于给液晶模块焊引脚以及跳线等;
5mm孔径同轴电源插座1个;
小型自锁开关1个,用作电源开关;
微型轻触按钮4个,用作时间调校以及单片机人工复位;
小型拨动开关1个,用于设定闹钟;
9孔D型插座1个;
5V/2A墙插式开关电源1个;
其他阻容元器件按照电路图中的要求购买,引脚元件或贴片元件均可以使用。
安装制作
首先安装电源插座、串口插座,然后按照它们的位置定位安装电源和MAX232插座,再定位安装LCD插座、单片机插座和PCF8563插座。最后安装每个插座周边的元件,焊接连线。尽管洞洞板接线比较自由,也要尽量做到安全、合理、方便、美观。焊好元器件的电路板背面如图11.3所示。实际接线也可按照自己的安排布局,就近选择,也可以修改现有原理图的引脚连接,但程序就得作相应修改,总的功能不会改变。本图使用的LCD1602液晶的数据线采用8线接法,其实4线接法也可以。不过改变接法后,液晶的驱动程序和初始化要作相应修改,我在程序中将两种方法都列了出来,可以根据需要开启其中一种,注释掉另一种程序。初学者注意:LCD1602使用4线接法时,多余的4个引脚不可作液晶的控制线,但可以用作程序控制的输出线。
全部接线完成后,仔细检查确认连接无误,就可以先不插芯片,输入5V电压,检查IC插座上的电压是否正常,如有问题就进行检查处理,直到正常为止。然后插上单片机和MAX232,接好串口电缆,编一个最简单的程序,使用STC的新版下载软件,尝试能否正常下载,直接用串口最好,如果电脑没有串口,可以使用USB转串口线,总之要确保程序可以正常下载。完工后的板子如图11.4所示。
编程要点
1. LCD1602的驱动程序
编写LCD1602的驱动程序时,需注意程序开始要包含一个intrins.h的头文件,在C编程时就可以使用_nop_( )空操作功能,以便得到1μs左右的延时。另外,现在生产销售的LCD1602比起前些年的产品有所改进,使用更加方便,例如,以前液晶的初始化首先需要强制写入0X38共3次,每5ms1次,现在只需要1次甚至不写入也可以。
如果发现使用正确的驱动程序后液晶屏还是不能显示,在排除了硬件接线问题后,着重检查以下3个方面:
(1)调节可调电阻RP1,增大对比度;
(2)检查硬件连接是按照4线接法还是8线接法,与程序设计是否一致,不一致就不能显示;
图11.3 PCB背面走线
图11.4 元器件布局
(3)少数情况中,有些液晶模块的读忙指令会因无法读出而陷入死循环,可以把读忙改为“RS=0;RW=1;”,再延时20μs。
本文所附的驱动函数全部经过验证和改进,包括对于不能读忙的液晶模块也能正确显示。
LCD1602允许使用自己定义的8个符号,存放在具有8个字节的专用存储器GCRAM中。为了利用这个资源,程序中使用了自编的一、二、三、四、五、六、日以及表示摄氏度的符号“℃”(图示中四使用草书字体表示),如图11.5所示。
首先画出一个5×8点阵方格,在上边画出点阵字型,我们以“五”为例介绍,显示点为1,不显示点为0。从上到下,显示点可用8个十六进制编码表示,因为水平方向只有5位,故高3位以0补全,所以“五”的表示编码是:0X00,0X1E,0X08,0X1E,0X0A,0X0A,0X1F,0X00。依此类推,按照点阵图写出8个符号的十六进制编码,构成一个存放在ROM中的8行8列的二维数组。
设置GCRAM起始地址为0,开机后先把以上数组存入GCRAM中,以后用给LCD1602写数据的方法就可以把自编的符号显示出来了,具体操作见源程序。
2. PCF8563的驱动程序
PCF8563是一款使用I2C总线控制的实时时钟芯片,和常用的DS1302一样,也是8脚的小集成电路,接线简单,但通信方式就不一样了。读写完全按照I2C时序要求进行,它的写入地址是0XA2,读出地址是0XA3。它内部有16个寄存器,寄存器0和1号分别用来控制它的工作,寄存器2~15号用来读写具体时间、日期、闹钟及倒计数等。通过编程还可以引出时钟脉冲,加上它的时钟频率可通过振荡电容(C13)微调,这样就能够调整出比较准确的时间。它的驱动是以正确的预置1值写入以上寄存器,特别是对于新器件,必须把秒、分、时、日、月、年以及需要的报警时间等逐一写入寄存器0X02到0X0C,然后给寄存器0X00发出启动信号(第5位置0),它就开始工作了。因为有后备电池,停电也会继续走时。需要注意的是,在上述预置值寄存器中存入的是BCD码,关于它的具体编程,请参照源程序。
图11.5 自编的显示字符
3. DS18B20的程序部分
DS18B20是单线总线器件,它以脉冲宽度判断0和1,因此对延时时间要求比较严格,不可随意增减。对它的编程就是根据它的控制指令,写出51的模拟时序,然后执行必要的操作。具体的驱动已在源程序中列出。启动温度转换到读出温度数值是需要时间的,对于12位分辨率的转换时间达750ms,因此需要设计在启动转换后1s再进行读数,读出的数值除了进行正负判断外,还要乘以分辨率系数0.0625,得到10进制的显示值。
总体编程
总体编程还是按照前、后台方式进行。后台在启动后进入一系列初始化,然后进入主循环。主循环就是以查询方式了解S1、S2、S3和S的状态以及是否从串口接收到数据,如发现有按键按下,进行简单延时消抖就进入按键处理。如果已经从串口接收到时间数据,就把这些数据转换为BCD码存入PCF8563寄存器,实现和电脑的时间数据同步。
按键S3的处理中包括3种情况。
(1)在S1按动(次数不限)后按动S3,不改变PCF8563寄存器;
(2)在S1、S2按动后按动S3,这时需要把S2设定出的新值写入PCF8563,实现人工设置,主要用于年、月、日和闹钟时间等数值的设置;
(3)S1、S2未按动直接按下S3,这时启动单片机的串口中断,准备接收来自计算机的时间数据。
前台程序包括串口接收中断和T2定时器中断。单片机的串口中断用来接收电脑发送过来的时间数据,格式是“hh:mm’ss”,hh、mm、ss分别是时、分、秒的十位和个位字符码,连同冒号和引号一共有8个字节,每接收1个字节就触发1次接收中断,把收到的数据存入接收数组receiv[8]中,收到8个字节就置位接收完毕标志,等待主循环去查询此标志,然后处理。这就是串口中断的任务。
T2是单片机的一个16位定时器,它具备自动重载功能。使用它的中断处理执行两个任务:一是如果S1不按下,就定时刷新液晶1602的显示,S1按下说明在调校时间,这时不按时钟刷新而按设定值刷新液晶屏,以免显示混乱。二是设定时间测温,按照每5s一次向DS18B20发出测温请求,在接下来的1s回收测温数据并加以处理。为此,主程序初始化时就设定T2工作于自动重载模式,按照40ms中断一次,设定TH2和TL2。中断时就不必管它设置值的加载了,由它自己处理,但是中断标志TF2是不能自动清除的,一定要编程清除。另外设置中断次数计数,以达到计秒的目的。
调试校准
1. PCF8563的校准
图11.6 测试PCF8563的7脚输出频率
图11.7 频率计的测试结果
前面说过,可以通过修正振荡电容的方法使得PCF8563达到准确的时钟振荡频率。在理想情况下,石英晶体振荡器以32768.0Hz的频率振荡,经过内部电路进行15次2分频就得到1Hz,也就是秒信号。实际上,如果振荡频率有少许误差,分频结果不是准确的1Hz,走时就不准确。这时我们可以通过调整振荡电容来微调振荡频率,电容减小则振荡频率升高。把频率调整到32768.0Hz,这样时钟就比较准确了。由于计时是个累积的过程,32768.0Hz石英晶体可能会有误差而导致时钟频率不准,但是要发现明显的偏差(如几秒钟)还是需要较长时间的,因此最方便的办法是利用频率计校准时钟频率。PCF8563可以通过写入寄存器0X0D来引出或不引振荡频率:把它的最高位FE设置为1,就可在PCF8563的7脚(CLOCKOUT)引出时钟频率,把它的低2位FD1和FD0分别设置为00、01、10和11就可以选择引出的频率是32768Hz、1024Hz、32Hz或1Hz,它们都设置为0就输出32768Hz。不过该引脚是开漏输出,为了用仪器测量频率,应在电路原理图中加入10kΩ的上拉电阻R9。具体方法是:通过手工设置使得PCF8563走起来,特别对于第一次工作,要全面设置一遍。先取振荡电容为较小数值(如22pF),然后将频率计接好电源,开机预热稳定后,选低频挡,闸门时间取10s,把测试夹分别夹在地线和PCF8563的7脚(有外引插针)上,如图11.6所示。经过一段时间的稳定(10min以上),看频率计显示。实测结果为32.7684kHz,时钟频率高了。取下测试夹,单片机断电,并联一个5.6pF电容,测试结果为32.7681kHz,虽有所降低,但还是高一点。再断电,更换为8.2pF,稳定后测试结果为32.7680kHz,如果能在半小时以上保持稳定,时钟频率就调好了,如图11.7所示。经过这样调校的PCF8563,日误差可以做到1s以内,按照规格书,达到一年正负5min的偏差没有问题。但是在没有频率计的条件下,只好用比对标准时间的办法来调整了,这样很浪费时间。
2. 与电脑同步校准
如果是人工设置PCF8563,要把它调节到与北京时间一致,这是有点难度的。电脑上的时间借助于互联网实时更新,还是很准确的。既然有串口可以从电脑下载程序,那正好利用它从电脑取得时、分、秒等时间数据来设置单片机的PCF8563,岂不方便多了?按照单片机的串口方式1,使用9600波特传输率,从电脑接收8个字节的数据仅仅80位,不到10ms就可传送完毕,因此是可行的。为此,我们可通过现成的“标准时间校准器”小软件(可到网上下载)先把电脑时间校正到标准时间,然后通过自编的小程序RTC-DOWN把当前电脑时间从串口发送到单片机就可以了。该程序的运行界面如图11.8所示,上面有两个文本框,分别显示电脑当前的时、分、秒和日、月、年,有两个按钮,EXIT是退出,SET是设置。使用前先不按S1和S2,只按下S3,液晶上左角显示R,如图11.9所示。说明已经打开了串口接收,鼠标点击SET,电脑时间就下载到PCF8563寄存器中,R消失,单片机时间和电脑时间同步完成(当然还是有差值的,但比手动调节方便许多)。
图11.8 程序界面
图11.9 时间设置
手动设置方法很简单,就是按S1选测试项目:月-日-年-闹时-闹分-星期几-时-分-秒,在对应位置以闪动光标提示。对应每一个项目用S2设置数值,然后按S3闪动光标消失,设置值写入PCF8563,并以新值走时。如不需设置就继续按S1往前走,直到秒设置以后闪动光标消失,显示走时就行了,否则继续按S1重选项目。
更多源程序可以到qq群657864614进行下载!
有没有因为想买一本书,因为价格偏高而犹豫?现在我来帮你解决这个问题,想要什么书籍直接告诉我,我来帮你找,通常价格均为1元,难一点的也就几块钱,先查询,后付款,诚信经营! 电子图书教材查找代查代找代下载书籍中文pdf格式-淘宝网
「干货」如何解决RTC精度、功耗问题?
RTC为整个电子系统提供时间基准,主控设计均离不开RTC电路设计,在应用RTC时,会出现精度或功耗大的现象,如何解决RTC精度及功耗问题?本文将为您介绍时钟芯片应用问题及解决方法。
一、什么是RTC
实时时钟(Real_Time Clock)简称为RTC,主要为各种电子系统提供时间基准。通常把集成于芯片内部的RTC称为片内RTC,在芯片外扩展的RTC称为外部RTC,PCF8563是一款低功耗的CMOS实时时钟/日历外部芯片,支持可编程时钟输出、中断输出、低压检测等,与处理器通过I2C串行总线进行通信,最大总线速率可达400kHz。
二、RTC精度设计
RTC的主要职责就是提供准确的时间基准,计时不准的RTC毫无价值可言。目前部分MCU在片内已集成RTC,实际测试中在电池供电6小时环境下片内RTC的偏差在1-2分钟。因此,若对实时时钟有较高的要求则需优先考虑外扩RTC,同时要求时钟精度更高的RTC,比如PCF8563,表1所示是不同RTC的时钟精度对比。
表1 常见RTC时钟精度对比
1、电路设计
RTC设计电路简约而不简单,时钟芯片的选择、晶振的选择、电路设计、器件放置、阻抗控制、PCB走线规范均会影响RTC的时间基准的稳定性,图1为RTC芯片PCF8563电路设计。
PCF8563参考电路图
2、晶体对地电容容值选择
负载电容:
Cload= [ (Ca*Cb)/(Ca+Cb) ]+Cstray
其中Ca、Cb为接在晶体两引脚到地的电容,Cstray为晶体引脚至处理器晶体管脚的走线电容(即杂散电容总和),一般Cstray的典型值取4~6pF之间;
如要满足晶体12.5pF负载电容的要求:
Cload= [ (15*15)/(15+15) ]+5=12.5pF
常见时钟电路
3、PCB布线
由于RTC的晶振输入电路具有很高的输入阻抗,因此它与晶振的连线犹如一个天线,很容易耦合系统其余电路的高频干扰。而干扰信号被耦合到晶振引脚导致时钟数的增加或者减少,考虑到线路板上大多数信号的频率高于32.768kHz,所以通常会发生额外的时钟脉冲计数,因此晶振应尽可能靠近OSC1和OSC2引脚放置,同时晶振、OSC1和OSC2的引脚最好布成地平面,具体PCB布线如图3所示。
PCB布线
4、电路相关说明
如图1所示,R56、R57为I2C总线上拉电阻,PCF8563中断输出及时钟输出均为开漏输出,所以也需要外接上拉电阻,如图1中的的R58、R59,若不使用这两个信号,对应的上拉电阻可以不用。
对于PCF8563芯片,需外接时钟晶振32.768kHz(如图1的X1),推荐使用±20ppm或更稳定的晶振。PCF8563典型应用电路推荐使用15pF的晶振匹配电容,实际应用时可以作相应的调整,以使RTC获得更高精度的时钟源。一般晶振匹配电容在15pF~21pF之间调整(相对于±20ppm精度的32.768kHz晶振),15pF电容时时钟频率略偏高,21pF电容时时钟频率略偏低。
5、精度调整方法
设置PCF8563时钟输出有效(CLKOUT),输出频率为32.768kHz;使用高精度频率计测量CLKOUT输出的频率;根据测出的频率,对CB1、CB2、CB3作短接或断开调整,频率比32.768kHz偏高时,加大电容值,频率比32.768kHz偏低时,减小电容值。说明:图1中的C41、C42、C43的值在1pF~3pF之间,根据实际情况确定组合方式,以便于快速调整,推荐使用(3pF、3pF、3pF)、(1pF、2pF、3pF)、(2pF、3pF、4pF)。
三、RTC低功耗设计
很多RTC设计成可以只依靠一块电池供电就能工作,如果主电源关闭,仅依靠一小块锂电池就能够驱动振荡器和整个时钟电路,如何降低RTC电路工作时功率消耗?
通过应用几种不同的方法可以降低RTC功耗:
选择低功耗的RTC,比如PCF8563,表2所示是不同RTC的功率消耗对比:表2 常见RTC功率消耗对比
RTC电源切换电路中,选择漏电流小的二极管比如BAV74,当系统电源电压3.3V断开时,BT1锂电池CR2032(3V/225mAh)通过二极管向RTC供电;
RTC电源切换电路
尽量少而且合理地访问RTC,减少I2C总线的动态电流;将I2C总线的上拉电阻设计得尽量大些,比如10k;在应用时,通过设置寄存器关闭RTC的时钟CLKOUT输出。各种电测量仪器选德国GMC-I高美测仪找深圳茂迪,主要做:功率分析仪,电气安全/安规测试仪,绝缘/接地测试仪,数字模拟多用表,电能质量分析仪,高精度直流电源,多功能电量表,能源管理系统,测量传感器/变送器,角位变送器,网络测试仪、寻线仪 各种记录仪等。
欢迎【关注】小强,每天分享高精度功率分析仪、高精度数字万用表、电能质量分析仪、电气安规测试仪、绝缘电阻测试仪、直流电源等电工仪器的仪器知识。
相关问答
苹果手机主板时钟芯片,有几个?-ZOL问答
苹果手机主板漏电的特征就是用电特别快,而且手机持续发热严重,长时间不处理的话还会导致黑屏、不开机等故障,这都是主板芯片烧了造成的,要对芯片进行维修。另一...