複製鏈接
請複製以下鏈接發送給好友

pcf8563

鎖定
PCF8563 是PHILIPS 公司推出的一款工業級內含I2C 總線接口功能的具有極低功耗的多功能時鐘/日曆芯片。PCF8563 的多種報警功能、定時器功能、時鐘輸出功能以及中斷輸出功能能完成各種複雜的定時服務,甚至可為單片機提供看門狗功能。是一款性價比極高的時鐘芯片,它已被廣泛用於電錶水錶、氣表、電話、傳真機、便攜式儀器以及電池供電的儀器儀表等產品領域。
中文名
pcf8563
關鍵詞
BCD碼 C語言
寬電壓範圍
1.0~5.5V
開發商
PHILIPS 公司

pcf8563芯片介紹

外圍器件PCF8563I2C實時時鐘/日曆芯片

pcf8563系統應用

摘要
文中介紹了PCF8563的結構、功能及工作原理。結合其在8051系統中的應用實例,給出了PCF8563與8051單片機的硬件接口電路和C語言軟件編程程序。
關鍵詞
I2C總線串行接口PCF8563BCD碼 C語言
PCF8563簡介
PCF8563是PHILIPS公司生產的低功耗CMOS實時時鐘/日曆芯片,芯片最大總線速度為400kbits/s,每次讀寫數據後,其內嵌的字地址寄存器器會自動產生增量。PCF8563可廣泛應用於移動電話、便攜儀器、傳真機、電池電源等產品中。
PCF8563的引腳排列,各引腳功能説明如表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、寬電壓範圍 1.0~5.5V, 復位電壓標準值Vlow=0.9V。
2、超低功耗:典型值為 0.25uA (VDD=3.0V,Tamb=25℃)。
3、可編程時鐘輸出頻率為:32.768KHz 、1024Hz 、32Hz 、1Hz。
4、四種報警功能和定時器功能。
5、內含復位電路、振盪器電容和掉電檢測電路。
6、開漏中斷輸出。
7、400kHz I2C總線(VDD=1.8~5.5V),其從地址讀 0A3H;寫 0A2H。

pcf8563管腳描述

PCF8563 管腳圖 PCF8563 管腳圖
符號
管腳號
描 述
OSCI
1
振盪器輸入
OSCO
2
振盪器輸出
/INT
3
中斷輸出(開漏:低電平有效)
VSS
4
SDA
5
串行數據 I/O
SCL
6
串行時鐘輸入
CLKOUT
7
時鐘輸出(開漏)
VDD
8
正電源

pcf8563工作原理

PCF8563 有 16 個8位寄存器:一個可自動增量的地址寄存器,一個內置 32.768KHz的振盪器(帶有一個內部集成的電容)一個分頻器(用於給實時時鐘RTC 提供源時鐘)一個可編程時鐘輸出,一個定時器,一個報警器,一個掉電檢測器和一個 400KHz I2C總線接口
所有16 個寄存器設計成可尋址的 8 位並行寄存器,但不是所有位都有用。前兩個寄存器(內存地址 00H,01H)用於控制寄存器和狀態寄存器,內存地址 02H~08H 用於時鐘計數器(秒~年計數器) ,地址 09H~0CH 用於報警寄存器(定義報警條件) ,地址 0DH 控制CLKOUT 管腳的輸出頻率,地址 0EH 和 0FH 分別用於定時器控制寄存器和定時器寄存器。秒、分鐘、小時、日、月、年、分鐘報警、小時報警、日報警寄存器,編碼格式為 BCD, 星期和星期報警寄存器不以 BCD 格式編碼。當一個 RTC 寄存器被讀時,所有計數器的內容被鎖存,因此,在傳送條件下,可以禁止對時鐘日曆芯片的錯讀。

pcf8563寄存器概況

地址 寄存器名稱 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 定時器倒計數數值寄存器 定時器倒計數數值

pcf8563BCD寄存器

1.地址寄存器名稱 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0。
02H 秒: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.開始和停止
STOP和START狀態之間總線空置,數據線(SDA)和時鐘線(SCL)保持在高電平。SCL高電平時SDA下降沿,為啓動條件(S);SCL高電平時SDA上升沿為停止條件(P),參見圖1。
圖1 開始和停止定義 圖1 開始和停止定義
3. 位傳送
每個時鐘脈衝傳送一個數據位,SDA線上的數據在時鐘脈衝高電平時應保持穩定,否則將成為控制信號
4.標誌位
在START和STOP之間,發射器發送給接收器的數據數量沒有限制。在每個8位字節後加一個標誌位,發射器便產生一個高電平的標誌位,這時主設備產生一個附加標誌位時鐘脈衝。
“從接收器”必須在接收到每個字節後產生一個標誌位,“主接收器”也必須在接收“從發射器”傳送的每個字節後產生一個標誌位。
在標誌位時鐘脈衝出現時,SDA線應保持低電平(應考慮起動和保持時間)。
發射器應在從設備接收到最後一個字節時變為低電平,而使接收器產生標誌位,這時主設備即可產生停止條件。
5. I2C總線協議
用I2C總線傳遞數據前,接收的設備應先標明地址,在I2C總線起動後,這個地址與第一個傳送字節一起被傳送出去。PCF8563可以作為一個從接收器或從傳送器,此時的時鐘信號線SCL只能輸入信號線,數據信號線SDA則為一條雙向信號線。PCF8563的從地址。

pcf8563應用概述

PCF8563的具體應用電路圖,對圖中石英晶片頻率的調整,筆者給出3種可行性方法,供參考: 方法1:定值OSCI電容。計算所需的電容平均值,用此值的定值電容,通電後在CLKOUT管腳上測出的頻率應為32.768kHz,測出的頻率值偏差取決於石英晶片本身,電容偏差和器件之間的偏差平均為±5×10 -6。平均偏差可達5分鐘/年。 方法2:OSCI微調電容。可通過調整OSCI管腳的微調電容式振盪器的頻率來獲得更高的精度,此時可測出通電時管腳CLKOUT上的信號頻率為32.768kHz。 方法3:OSCI輸出。直接測量管腳OSCI的輸出。

pcf8563程序示例

以下的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<d:.h>
#define byte unsignedchar 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; ;; //readyfor 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;
byteI_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)
{
case1:rom_rec[i]=rom_rec[i]&0x7f;break;
case2:
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;
}