PCF8563源程序.docx
- 文档编号:26927174
- 上传时间:2023-06-24
- 格式:DOCX
- 页数:13
- 大小:151.28KB
PCF8563源程序.docx
《PCF8563源程序.docx》由会员分享,可在线阅读,更多相关《PCF8563源程序.docx(13页珍藏版)》请在冰豆网上搜索。
PCF8563源程序
pcf8563驱动C51源程序及应用
默认分类2010-02-2209:
50:
09阅读78评论0 字号:
大中小 订阅
摘要:
介绍基于PCF8563设计户外侄计时系统的硬件接口电路及PCF8563软件编程。
该系统在强日光下显示屏的字符清晰可见,能够长时间连续稳定地工作。
关键词:
PCF8563I2C倒计时系统引言倒计时系统的任务,就是对某一设定日期进行倒数,在显示屏显示当前距离设定日期的时间;广泛应用于重大的节日或活动,以增强人们的关切程度和紧迫感。
户外型倒计时系统,首先要求在强日光下显示屏的字符依然清晰可见,而且要求系统能够长时间连续稳定地工作。
本文介绍的系统正是针对这样的要求而开发出来的。
1总体设计方案整个系统由时钟芯片、中央处理单元、译码、驱动、显示、键盘几部分构成,系统框图如图1所示。
2 硬件电路设计2.1时钟芯片PCF8563是Philips公司推出的一款带I2C总线具有极低功耗的多功能时钟/日历芯片,具有四种报警功能和定时功能;内部时钟电路、内部振荡电路、内部低电压检测以两线制I2C总线通信方式,不但使用外围电路简洁,而且增加了芯片的可靠性。
PCF8563的SCL为时钟输入端,数据随时钟信号同步输入器件或从器件输出;SDA为双向引脚,用于串行数据的输入输出;INT是中断信号输出端,可通过设置报警寄存器按指定时间在该脚产生报警信号,低电平有效;SDA、SCL、INT均为漏极开路,必须上拉电阻;X1、X2分别为反相放大器的输入、输出端;可在X1端接入32.768kHz的石英晶振,配置成片内振荡器。
本系统PCF8563与89C51接口采用图2所示接口方案。
图2中,在X1、X2端接入32.768kHz的石英晶振,将时钟源配置为片内振荡器。
VDD与地之间国入1个1μF的大电容供电维持时钟芯片,锂电池(3.6V)同时开始工作,给时钟芯片供电,使时钟芯片工作不受影响。
PCF8563与89C51接口采用3根口线,PCF8563的INT脚产生周期为1s的脉冲中断信号给89C51的INT0引脚,89C51产生中断后,通过I2C总线读取PCF8563的基准时间。
2.2显示和键盘电路译码、显示、驱动、键盘电路如图3所示、单片机将读入的PCF8563时间信息,经过程序处理,输出显示信号到P1口(数据4位,选择信号4位)。
显示信息包括倒计时信息(当前距离设定时间的天数)和当前时间的星期、时、分、秒信息。
4位数据信号送入MC14513(BCD-锁存/7段译/码驱动器),共有10个MC14513:
倒计时占用3个,时间时、分、秒各占用2个,星期占用1个。
4位选择信号送到74LS145译码器(4位锁存/4-10线译码),选择接收数据的MC14513芯片。
被选择的MC14513译码驱动对应共阴数码管字段(a、b、c、d、e、f、g)。
户外显示要求在强日光下依然清楚可见,所以我们采用超高度φ5LED管组成LED点阵字符。
其中每个字段由4块LED点阵埠并联组成,而每个LED点阵块先由5个LED串联1组,再将4个串联组并联而成。
先用的超高亮度LED工作电流约为20mA,工作电压约为2V,每字段的总电流约为320mA,工作电压为10V;字段的驱动,采用大电流反相驱动器ULN2003(由7组NPN达林顿驱动器组成);倒计时信号经MC14153输入到ULN2003,ULN2003输出接字段的阴极,字段阳极接电源正极;电源采用10A、5V的两个开关电源串联供电。
键盘接口有4个链:
1个设定/确认键、1个修改+1键、1个修改-1键、1个移位键。
对应秒、分、时、倒计时、星期,有5个LED。
LED亮,表示对应的秒或分或星期或倒计时数据可按修改键修改。
设定/确认键,有两种状态:
设定和确认。
首先按下为设定时间状态,再按下为确认状态。
将设定时间数据处理后写入PCF8563,两种状态互为循环。
在设定时间状态,首先次移位为秒位,对应秒移位LED亮,按下移位键,移位LED灯接秒→分→时→倒计时→星期逐次循环;按下修改+1键或修改-1键可对相应位的数据进行+1或-1操作。
3软件设计PCF8563中共有16个寄存器,其中00~01H为控制寄存器,09~0CH为报警寄存器,0DH为时钟输出寄存器,0E~0FH为定时器功能寄存器,02~08H为秒~年时间寄存器。
表1、表2列出了各寄存器概况及对应的内存地址和功能。
表1寄存器概况地址寄存器名称位7位6位5位4位3位2位1位000H控制/状态寄存器1TFST0STOP0TESTC00001H控制/状态寄存器2000TT/TPAFTFAIETIE0DHCLKOU输出寄存器FE-----FD1FD00EH定时器控制寄存器TE-----TD1TD00FH定时器倒计数数值寄存器定时器倒计数数值(二制)表2BCD格式寄存器概况地址寄存器名称位7位6位5位4位3位2位1位002h秒VL00~59BCD码格式数03h分-00~59BCD码格式数04h时--00~23BCD码格式数05h日--00~59BCD码格式数06h星期-----0~607h月/世纪C--01~12BCD码格式数08h年00~99BCD码格式数09h分钟报警AE00~59BCD码格式数0Ah小时报警AE-00~23BCD码格式数0BH日报警AE-01~31BCD码格式数0CH星期报警AE----0~6按I2C总线规约,
b PCF8563的从地址:
读地址SLAR为A3H、写地址SLAW为A2H,PCF8563I2C通信实现有字节写/读两种状态。
适用80C51的虚拟I2C总线软件包。
本系统直接调用该I2C总线软件包的数据读写子程序(其中WRNBYT为N字节的子程序,RDNBYT为读取N字节的字节),来实现PCF8563的I2C总线操作。
根据硬件电路及资源分配,将I2C软件包中符号单元赋值如下:
SDAEQAP0.0;数据传送SCLEQUP0.1;时钟控制状态MINDATA30H;秒寄存器SECDATA31H;分寄存器HOURDATA32H;时寄存器DAYDATA33H;日寄存器WEEKDATA34H;周寄存器MONTHDATA35H;月寄存器YEARDATA36H;年寄存器SLADATA37H;37H为被控器的地址NUMBYTDATA38H;38H为数据字节计数器MRTDATA40H;接收数据缓冲区首地址MTDDATA50H;发送数据缓冲区首地址①PCF8563定时器工作模式MOV51H,#81H;设置PCF8563的0EH为81H,启动定时器,定时器频率64HzMOV52H,#64;设置PCF8563的0FH为64,定时器倒计数值为64MOVMTD,#0EH;定时器控制寄存器字节首地址MOVNUMBYT,#3;写字节MOVSLA,#0A2H;取写器件地址LCALLWRNBYT;写8563
以上配置完成后,PCF8563的INT脚产生周期为1s,脉冲宽度(低电平)约为15ms的脉冲中断信号。
②PCF8563当前时间设定子程序如下:
MOV51H,#00H;启动时钟MOV52H,#11H;定时器为中断模式,脉冲形式MOV53H,MIN;将秒至年的时间写入发送缓冲区MOV54H,SECMOV55H,HOURMOV56H,DAYMOV57H,WEEKMOV58H,MONMOV59H,YEARMOVSLA,#0A2H;取写器件地址MOVNUMBYT,#10;写字节数MOVMTD,#00H;写入8563寄存器首地址为00HLCALLWRNBYT;写入8563RET③读出时钟芯片当前值子程序设计MOVMTD,#02H;读时钟寄存器首字节地址02HMOVSLA,#0A2H;取写器件地址MOVNUMBYT,#1;写字节数LCALLWRNBYT;写8563MOVSLA,#0A3H;取读器件地址MOVNUMBYT,#7;读七个时钟信息LCALLRDNBYT;读取时间并放入缓冲区MOVA,40H;取滗字节ANLA,#7FH;屏蔽无效位MOVMIN,A;送秒寄存器MOVA,41H;取分字节ANLA,#7EH;屏蔽无效位
MOVMIN,A;送分寄存器MOVA,42H;取小时字节ANLA,#3FH;屏蔽无效位MOVHOUR,A;送时寄存器MOVA,43H;取天字节ANLA,#3FH;屏蔽无效位MOVDAY,A;送天寄存器MOVA,44H;取星期字节ANLA,#07H;屏蔽无效位MOVWEEK,A;送星期寄存器MOVA,45H;取月字节ANLA,#1FH;屏蔽无效位MOVMOTH,A;送月寄存器RET系统程序流程如图4所示,中断服务程序如5所示。
结语此倒计时系统于广东省六届大运会中标,在整个运行过程正常稳定工作,达到了大会提出的要求。
#include
#include
#defineucharunsignedchar
sbitSDA=P3^4;
sbitSCL=P3^5;
sbitP10=P1^0;
ucharg8563_Store[4];/*时间交换区,全局变量声明*/
ucharcodec8563_Store[4]={0x00,0x59,0x07,0x01};/*写入时间初值:
星期一07:
59:
00*/
/********************************************
内部函数,延时1
********************************************/
voidDelay()
{
//{P10=1;_nop_();P10=0;}
_nop_();
_nop_();/*根据晶振频率制定延时时间*/
}
/********************************************
内部函数,I2C开始
********************************************/
voidStart()
{ EA=0;
SDA=1;
SCL=1;
Delay();
SDA=0;
Delay();
SCL=0;
}
/********************************************
内部函数,I2C结束
********************************************/
voidStop()
{
SDA=0;
SCL=0;
Delay();
SCL=1;
Delay();
SDA=1;
Delay();
EA=1;
}
/********************************************
内部函数,输出ACK,每个字节传输完成,输出ack=0,结束读书据,ack=1;
********************************************/
voidWriteACK(ucharack)
{
SDA=ack;
Delay();
SCL=1;
Delay();
SCL=0;
}
/********************************************
内部函数,等待ACK
********************************************/
voidWaitACK()
{ ucharerrtime=20;
SDA=1;
Delay();/*读ACK*/
SCL=1;
Delay();
while(SDA)
{ errtime--;
if(!
errtime)Stop();
}
SCL=0;
Delay();
}
/********************************************
内部函数.输出数据字节
入口:
B=数据
********************************************/
voidwritebyte(ucharwdata)
{
uchari;
for(i=0;i<8;i++)
{
if(wdata&0x80)SDA=1;
elseSDA=0;
wdata<<=1;
SCL=1;
Delay();
SCL=0;
}
WaitACK(); //I2C器件或通讯出错,将会退出I2C通讯
}
/********************************************
内部函数.输入数据
出口:
B
********************************************/
ucharReadbyte()
{
uchari,bytedata;
SDA=1;
for(i=0;i<8;i++)
{
SCL=1;
bytedata<<=1;
bytedata|=SDA;
SCL=0;
Delay();
}
return(bytedata);
}
/********************************************
输出数据->pcf8563
********************************************/
voidwriteData(ucharaddress,ucharmdata)
{
Start();
writebyte(0xa2);/*写命令*/
writebyte(address);/*写地址*/
writebyte(mdata);/*写数据*/
Stop();
}
/********************************************
输入数据<-pcf8563
********************************************/
ucharReadData(ucharaddress)/*单字节*/
{ ucharrdata;
Start();
writebyte(0xa2);/*写命令*/
writebyte(address);/*写地址*/
Start();
writebyte(0xa3);/*读命令*/
rdata=Readbyte();
WriteACK
(1);
Stop();
return(rdata);
}
voidReadData1(ucharaddress,ucharcount,uchar*buff)/*多字节*/
{ uchari;
Start();
writebyte(0xa2);/*写命令*/
writebyte(address);/*写地址*/
Start();
writebyte(0xa3);/*读命令*/
for(i=0;i { buff[i]=Readbyte(); if(i } WriteACK (1); Stop(); } /******************************************** 内部函数,读入时间到内部缓冲区 ********************************************/ voidP8563_Read() { uchartime[7]; ReadData1(0x02,0x07,time); g8563_Store[0]=time[0]&0x7f;/*秒*/ g8563_Store[1]=time[1]&0x7f;/*分*/ g8563_Store[2]=time[2]&0x3f;/*小时*/ g8563_Store[3]=time[4]&0x07;/*星期*/ } /******************************************** 读入时间到内部缓冲区----外部调用 ********************************************/ voidP8563_gettime() { P8563_Read(); if(g8563_Store[0]==0) P8563_Read();/*如果为秒=0,为防止时间变化,再读一次*/ } /******************************************** 写时间修改值 ********************************************/ voidP8563_settime() { uchari; for(i=2;i<=4;i++){writeData(i,g8563_Store[i-2]);} writeData(6,g8563_Store[3]); } /******************************************** P8563的初始化-----外部调用 ********************************************/ voidP8563_init() { uchari; if((ReadData(0xa)&0x3f)! =0x8)/*检查是否第一次启动,是则初始化时间*/ { for(i=0;i<=3;i++)g8563_Store[i]=c8563_Store[i];/*初始化时间*/ P8563_settime(); writeData(0x0,0x00); writeData(0xa,0x8);/*8: 00报警*/ writeData(0x1,0x12);/*报警有效*/ writeData(0xd,0xf0); } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PCF8563 源程序