特点
(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元,难一点的也就几块钱,先查询,后付款,诚信经营!
最新评论