新聞中心

        EEPW首頁 > 測試測量 > 設(shè)計應(yīng)用 > 外國器件PCF8563I2C實時時鐘/日歷芯片在8051系統(tǒng)中的應(yīng)用

        外國器件PCF8563I2C實時時鐘/日歷芯片在8051系統(tǒng)中的應(yīng)用

        作者: 時間:2006-05-07 來源:網(wǎng)絡(luò) 收藏

        摘要:PCF8563是PLILIPS公司生產(chǎn)的低功耗CMOS實時時鐘/日歷芯片,文中介紹了PCF8563的結(jié)構(gòu)、功能及工作原理。結(jié)合其在8051系統(tǒng)中的應(yīng)用實例,給出了PCF8563與8051單片機(jī)的硬件接口電路和C語言軟件編程程序。

        本文引用地址:http://www.104case.com/article/255593.htm

        關(guān)鍵詞:I2C總線 串行接口 PCF8563 BCD碼 C語言

        1 PCF8563簡介

        PCF8563是PHILIPS公司生產(chǎn)的低功耗CMOS實時時鐘/日歷芯片,芯片最大總線速度為400kbits/s,每次讀寫數(shù)據(jù)后,其內(nèi)嵌的字地址寄存器器會自動產(chǎn)生增量。PCF8563可廣泛應(yīng)用于移動電話、便攜儀器、傳真機(jī)、電池電源等產(chǎn)品中。

        PCF8563的引腳排列如圖1所示,各引腳功能說明如表1所列。

        PCF8563有16個8位寄存器,其中包括:可自動增量的地址寄存器、內(nèi)置32.768kHz的振蕩器(帶有一個內(nèi)部集成電容)、分頻器(用于給實時時鐘RTC提供源時鐘)、可編程時鐘輸出、定時器、報警器、掉電檢測器和400kHz的I2C總線接口。

        所有16個寄存器設(shè)計成可尋址的8位并行寄存器,但不是所有位都有用。當(dāng)一個RTC寄存器被讀時,所有計數(shù)器的內(nèi)容將被鎖存,因此,在傳送條件下,可以禁止對時鐘/日歷芯片的錯讀。

        表2、表3所列為各寄存器概況及對應(yīng)的內(nèi)存地址和功能,同時列出了它們的BCD格式編碼。表中“——”表示無效位,“0”表示此位應(yīng)置邏輯。表3中的世紀(jì)位C=0指定世紀(jì)數(shù)為20XX,C=1指定世紀(jì)數(shù)為19XX。當(dāng)年寄存器中的99變00時,世紀(jì)位才會改變。

        表1 PCF8563的管腳描述

        符 號 管腳號

        描 述

        OSCI 1 振蕩器輸入
        OSCO 2 振蕩器輸出
        INT 3 終端輸出(開漏:低電平有效)
        Vss 4
        SDA 5 串行數(shù)據(jù)I/O
        SCL 6 串行時鐘輸入
        CLKOUT 7 時鐘輸出(開漏)
        VDD 8 正電源

        2 I2C總線

        2.1 I2C總線特性

        I2C總線用兩條線(SDA和SCL)在芯片和模塊間傳遞信息。SDA為串行數(shù)據(jù)線,SCL為串行時鐘線,這兩條線必須用一個上拉電阻與正電源相連,其數(shù)據(jù)只有在總線不忙時才可傳送。I2C總線的系統(tǒng)配置參見圖2,產(chǎn)生信號的設(shè)備是傳送器,接收信號的設(shè)備是接收器,控制信號的設(shè)備是主設(shè)備,受控制信號的設(shè)備是從設(shè)備。

        表2 寄存器概況

        地址 寄存器名稱 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
        00H 控制/狀態(tài)寄存器1 TEST 0 STOP 0 TESTC 0 0 0
        01H 控制/狀態(tài)寄存器2 0 0 0 TI/TP AF TF AIE TIE
        0DH CLKOUT頻率寄存器 FE FD1 FD0
        0EH 定時器控制寄存器 TE TD1 TD0
        0FH 定時器倒計數(shù)數(shù)值寄存器 定時器倒計數(shù)數(shù)值

        表3 BCD格式寄存器概況

        地 址 寄存器名稱 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
        01H VL 00~59BCD碼格式數(shù)
        03H 分鐘 - 00~59BCD碼格式數(shù)
        04H 小時 - - 00~23BCD碼格式數(shù)
        05H - - 01~31BCD碼格式數(shù)
        06H 星期 - - - - - 0~6
        07H 月/世紀(jì) C - - 01~12BCD碼格式數(shù)
        08H 00~99BCD碼格式數(shù)
        09H 分鐘報警 AE 00~59BCD碼格式數(shù)
        0AH 小時報警 AE - 00~23BCD碼格式數(shù)
        0BH 日報警 AE - 01~31BCD碼格式數(shù)
        0CH 星期報警 AE - - - - 0~6

        2.2 啟動和停止條件

        總線不忙時,數(shù)據(jù)線和時鐘線保持在高電平。數(shù)據(jù)線(SDA)在下降沿而時鐘線(SCL)為高電平時,為起動條件(S);數(shù)據(jù)線在上升沿而時鐘線為高電平時為停止條件(P),參見圖3。

        2.3 位傳送

        每個時鐘脈沖傳送一個數(shù)據(jù)位,SDA線上的數(shù)據(jù)在時鐘脈沖高電平時應(yīng)保持穩(wěn)定,否則將成為控制信號,參見圖4。

        2.4 標(biāo)志位

        在起動條件和停止條件之間,傳送器傳送給接收器的數(shù)據(jù)數(shù)量沒有限制。在每個8位字節(jié)后加一個標(biāo)志位,傳送器便產(chǎn)生一個高電平的標(biāo)志位,這時主設(shè)備產(chǎn)生一個附加標(biāo)志位時鐘脈沖。

        從接受器必須在接收到每個字節(jié)后產(chǎn)生一個標(biāo)志位,主接收器也必須在接收從傳送器傳送的每個字節(jié)后產(chǎn)生一個標(biāo)志位。在標(biāo)志位時鐘脈沖出現(xiàn)時,SDA線應(yīng)保持低電平(應(yīng)考慮起動和保持時間)。傳送器應(yīng)在從設(shè)備接收到最后一個字節(jié)時變?yōu)榈碗娖剑菇邮掌鳟a(chǎn)生標(biāo)志位,這時主設(shè)備即可產(chǎn)生停止條件。參見圖5。

        2.5 I2C總線協(xié)議

        用I2C總線傳遞數(shù)據(jù)前,接收的設(shè)備應(yīng)先標(biāo)明地址,在I2C總線起動后,這個地址與第一個傳送字節(jié)一起被傳送出去。PCF8563可以作為一個從接收器或從傳送器,此時的時鐘信號線SCL只能輸入信號線,數(shù)據(jù)信號線SDA則為一條雙向信號線。PCF8563的從地址參見圖6。

        3 應(yīng)用概述

        圖7所示為PCF8563的具體應(yīng)用電路圖,對圖中石英晶片頻率的調(diào)整,筆者給出3種可行性方法,供參考:

        方法1:定值OSCI電容。計算所需的電容平均值,用此值的定值電容,通電后在CLKOUT管腳上測出的頻率應(yīng)為32.768kHz,測出的頻率值偏差取決于石英晶片本身,電容偏差和器件之間的偏差平均為±5×10 -6。平均偏差可達(dá)5分鐘/年。

        方法2:OSCI微調(diào)電容。可通過調(diào)整OSCI管腳的微調(diào)電容式振蕩器的頻率來獲得更高的精度,此時可測出通電時管腳CLKOUT上的信號頻率為32.768kHz。

        方法3:OSCI輸出。直接測量管腳OSCI的輸出。

        4 程序范例

        以下的C語言源程序是用8051單片機(jī)的普通I/O口(如P0.0/P0.4)模擬實現(xiàn)PCF8563的I2C時鐘/日歷芯片的操作,有字節(jié)寫/讀兩種狀態(tài)。程序中從地址的讀地址為0A3H,寫地址為0A2H.所發(fā)送的數(shù)據(jù)字節(jié)為9個,發(fā)送的初始數(shù)據(jù)在rom_sed[9]中,rom_sed[9]定義了寄存器中當(dāng)前發(fā)送的值:控制/狀態(tài)寄存器1為0,控制/狀態(tài)寄存器2為0,秒寄存器為0,分鐘寄存器55,小時寄存器為23,日寄存器為31,星期寄存器為6,月/世紀(jì)寄存器為0x12,年寄存器為0x99(即1999年12月31日23點55分0秒),當(dāng)程序運(yùn)行一段時間(5分鐘)后,從地址寄存器02H開始讀數(shù)據(jù),數(shù)據(jù)存放在rom_rec7中,發(fā)現(xiàn)變量rom_rec7變?yōu)?000年1月1日0點0分。若外轉(zhuǎn)帳電路有顯示,則時間可以顯示在面板上。

        #included:.h>

        #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;i6;i++);

        }

        void I_start(void) //發(fā)送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) //字節(jié)數(shù)據(jù)傳送子程序

        {data byte i;

        for(i=0,i8;i++)

        {sda-(bit)(I_data0x80);

        I_data=I_data1;

        ;

        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(xiàn)_clock());

        scl=0;

        return(flag);

        }

        byte I_receive(void) //字節(jié)數(shù)據(jù)接收子程序

        { data byte i;

        byte I_data=0;

        sda=1;

        for(i=0;I8;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;i255;i++)delay();

        I_start();

        if(~I(xiàn)_send(rom_sed[i]));

        else;

        }

        I_stop();

        }

        else;

        }

        else;

        start: I_start();

        if(~I(xiàn)_send(0xa2)) //pcf_write address

        {if(~I(xiàn)_send(0x02)) //pcf_status register address

        {I_start();

        if(~I(xiàn)_send(0xa3)) //write status register

        {for(i=0;i7;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;

        }

        linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)


        評論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 泉州市| 星座| 阿拉尔市| 金沙县| 定南县| 江西省| 兴业县| 宁阳县| 布尔津县| 尼玛县| 西林县| 长海县| 沁水县| 巩留县| 华蓥市| 扬州市| 什邡市| 绩溪县| 玉树县| 乐平市| 华坪县| 满城县| 台前县| 巧家县| 宁蒗| 巩留县| 香河县| 明水县| 池州市| 安徽省| 吉水县| 兖州市| 遂宁市| 三明市| 松原市| 娱乐| 新宁县| 玉山县| 汾阳市| 台南县| 汝阳县|