| | 网站首页 | 网络文摘 | 资料下载 | 软件下载 | 零售商城 | IC库存查询 | 维修论坛 | 供求信息 | 图片中心 | 留言本 | | |
![]() |
![]() |
| 您现在的位置: Chinadz.Net-中国电子网 >> 网络文摘 >> IC应用 >> 文章正文 |
|
|||||
| PCF8563 I2C实时时钟/日历芯片在8051系统的应用 | |||||
作者:佚名 文章来源:本站转载 点击数: 更新时间:2006-9-14 ![]() |
|||||
|
关键词:I2C总线 串行接口 PCF8563 BCD码 C语言 1 PCF8563简介 PCF8563是PHILIPS公司生产的低功耗CMOS实时时钟/日历芯片,芯片最大总线速度为400kbits/s,每次读写数据后,其内嵌的字地址寄存器器会自动产生增量。PCF8563可广泛应用于移动电话、便携仪器、传真机、电池电源等产品中。 PCF8563的引脚排列如图1所示,各引脚功能说明如表1所列。
PCF8563有16个8位寄存器,其中包括:可自动增量的地址寄存器、内置32.768kHz的振荡器(带有一个内部集成电容)、分频器(用于给实时时钟RTC提供源时钟)、可编程时钟输出、定时器、报警器、掉电检测器和400kHz的I2C总线接口。 所有16个寄存器设计成可寻址的8位并行寄存器,但不是所有位都有用。当一个RTC寄存器被读时,所有计数器的内容将被锁存,因此,在传送条件下,可以禁止对时钟/日历芯片的错读。 表2、表3所列为各寄存器概况及对应的内存地址和功能,同时列出了它们的BCD格式编码。表中“——”表示无效位,“0”表示此位应置逻辑。表3中的世纪位C=0指定世纪数为20XX,C=1指定世纪数为19XX。当年寄存器中的99变00时,世纪位才会改变。 表1 PCF8563的管脚描述 符 号 管脚号 描 述 OSCI 1 振荡器输入 OSCO 2 振荡器输出 INT 3 终端输出(开漏:低电平有效) Vss 4 地 SDA 5 串行数据I/O SCL 6 串行时钟输入 CLKOUT 7 时钟输出(开漏) VDD 8 正电源 2 I2C总线 2.1 I2C总线特性 I2C总线用两条线(SDA和SCL)在芯片和模块间传递信息。SDA为串行数据线,SCL为串行时钟线,这两条线必须用一个上拉电阻与正电源相连,其数据只有在总线不忙时才可传送。I2C总线的系统配置参见图2,产生信号的设备是传送器,接收信号的设备是接收器,控制信号的设备是主设备,受控制信号的设备是从设备。 表2 寄存器概况 地址 寄存器名称 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 00H 控制/状态寄存器1 TEST 0 STOP 0 TESTC 0 0 0 01H 控制/状态寄存器2 0 0 0 TI/TP AF TF AIE TIE 0DH CLKOUT频率寄存器 FE — — — — — FD1 FD0 0EH 定时器控制寄存器 TE — — — — — TD1 TD0 0FH 定时器倒计数数值寄存器 定时器倒计数数值 表3 BCD格式寄存器概况 地 址 寄存器名称 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 01H 秒 VL 00~59BCD码格式数 03H 分钟 - 00~59BCD码格式数 04H 小时 - - 00~23BCD码格式数 05H 日 - - 01~31BCD码格式数 06H 星期 - - - - - 0~6 07H 月/世纪 C - - 01~12BCD码格式数 08H 年 00~99BCD码格式数 09H 分钟报警 AE 00~59BCD码格式数 0AH 小时报警 AE - 00~23BCD码格式数 0BH 日报警 AE - 01~31BCD码格式数 0CH 星期报警 AE - - - - 0~6 2.2 启动和停止条件 总线不忙时,数据线和时钟线保持在高电平。数据线(SDA)在下降沿而时钟线(SCL)为高电平时,为起动条件(S);数据线在上升沿而时钟线为高电平时为停止条件(P),参见图3。 2.3 位传送 每个时钟脉冲传送一个数据位,SDA线上的数据在时钟脉冲高电平时应保持稳定,否则将成为控制信号,参见图4。
2.4 标志位 在起动条件和停止条件之间,传送器传送给接收器的数据数量没有限制。在每个8位字节后加一个标志位,传送器便产生一个高电平的标志位,这时主设备产生一个附加标志位时钟脉冲。 从接受器必须在接收到每个字节后产生一个标志位,主接收器也必须在接收从传送器传送的每个字节后产生一个标志位。在标志位时钟脉冲出现时,SDA线应保持低电平(应考虑起动和保持时间)。传送器应在从设备接收到最后一个字节时变为低电平,而使接收器产生标志位,这时主设备即可产生停止条件。参见图5。 2.5 I2C总线协议 用I2C总线传递数据前,接收的设备应先标明地址,在I2C总线起动后,这个地址与第一个传送字节一起被传送出去。PCF8563可以作为一个从接收器或从传送器,此时的时钟信号线SCL只能输入信号线,数据信号线SDA则为一条双向信号线。PCF8563的从地址参见图6。 3 应用概述
图7所示为PCF8563的具体应用电路图,对图中石英晶片频率的调整,笔者给出3种可行性方法,供参考: 方法1:定值OSCI电容。计算所需的电容平均值,用此值的定值电容,通电后在CLKOUT管脚上测出的频率应为32.768kHz,测出的频率值偏差取决于石英晶片本身,电容偏差和器件之间的偏差平均为±5×10 -6。平均偏差可达5分钟/年。 方法2:OSCI微调电容。可通过调整OSCI管脚的微调电容式振荡器的频率来获得更高的精度,此时可测出通电时管脚CLKOUT上的信号频率为32.768kHz。 方法3:OSCI输出。直接测量管脚OSCI的输出。 4 程序范例
以下的C语言源程序是用8051单片机的普通I/O口(如P0.0/P0.4)模拟实现PCF8563的I2C时钟/日历芯片的操作,有字节写/读两种状态。程序中从地址的读地址为0A3H,写地址为0A2H.所发送的数据字节为9个,发送的初始数据在rom_sed[9]中,rom_sed[9]定义了寄存器中当前发送的值:控制/状态寄存器1为0,控制/状态寄存器2为0,秒寄存器为0,分钟寄存器55,小时寄存器为23,日寄存器为31,星期寄存器为6,月/世纪寄存器为0x12,年寄存器为0x99(即1999年12月31日23点55分0秒),当程序运行一段时间(5分钟)后,从地址寄存器02H开始读数据,数据存放在rom_rec7中,发现变量rom_rec7变为2000年1月1日0点0分。若外转帐电路有显示,则时间可以显示在面板上。 #include #define byte unsigned char sbit scl=0x81; //定义串行I/O口 sbit sda=0x80; idata byte rom_sed[9]; idata byte rom_rec[7]; idata byte j,k; bit flag,flag1; void delay(void) //延时子程序 {data byte i; for(i=0;i<6;i++); } void I_start(void) //发送I2C总线起始条件子程序 {sda=1; ; scl=1; delay(); sda=0; delay(); scl=0; ; } void I_stop(void) //I2C总线停止条件子程序 {sda=0; ; scl=1; delay(); sda=1; delay(); } bit I_send(byte I_data) //字节数据传送子程序 {data byte i; for(i=0,i<8;i++) {sda-(bit)(I_data&0x80); I_data=I_data<<1; ; scl=1; delay(); scl=0; } ;; sda=1; ;; //ready for receiving ACK bit scl=1; ;; //start receiving ack bit flag=0; if(sda= =0)flag=0; else flag=1; //return(~I_clock()); scl=0; return(flag); } byte I_receive(void) //字节数据接收子程序 { data byte i; byte I_data=0; sda=1; for(i=0;I<8;i++) { I_data*=2; ; scl=0; delay(); scl=1; ;; if(sda= =1)I_data++; ;; } scl=0; ;;; sda=0; if(flag1= =0){;;scl=1;delay();scl=0;} //not last receic_byte ACK else{sda=1; ;;scl=1;delay();scl=0;flag1=0;} //the last receive_byte ~ACK return(I_data); } main() //主程序 {data byte i; rom_sed[0]=0x00; rom_sed[1]=0x00; rom_sed[2]=0x00; rom_sed[3]=0x55; rom_sed[4]=0x23; rom_sed[5]=0x31; rom_sed[6]=0x06; rom_sed[7]=0x92; rom_sed[8]=0x99; for(i=0;i<255;i++)delay(); I_start(); if(~I_send(rom_sed[i])); else; } I_stop(); } else; } else; start: I_start(); if(~I_send(0xa2)) //pcf_write address {if(~I_send(0x02)) //pcf_status register address {I_start(); if(~I_send(0xa3)) //write status register {for(i=0;i<7;i++) {if(i= =6)flag1=1; else flag1=0; rom_rec[i]=I_receive(); switch(i) {case 1:rom_rec[i]=rom_rec[i]&0x7f;break; ease2: case3:rom_rec[i]=rom_rec[i]&0x3f;break; case4:rom_rec[i]=rom_rec[i]&0x07;break; case5:rom_rec[i]=rom_rec[i]&0x9f;brealk;default:break; } } I_stop() } } } goto start; }
|
|||||
| 【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 | |||||
| 最新热点 | 最新推荐 | 相关文章 | ||
| 用AD7416+PIC16F84+PC机构建 基于PCF8563户外型倒计时系统 高性能串行接口模拟多路转换 以太网供电管理专用芯片TPS2 AD7730在发动机燃油消耗测量 视频解码芯片SAA7113的初始化 基于AT89S52的IC卡数据循环存 |
网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
| | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | | |
![]() |
Copyright ©1998 - 2006 Chinadz.Net中国电子网 ChinaDZ.Com 粤ICP备05002474号 站长:汽车 |