新聞中心

        EEPW首頁(yè) > 設(shè)計(jì)應(yīng)用 > 基于C51串行時(shí)鐘DS1305在無(wú)紙記錄儀中的實(shí)現(xiàn)

        基于C51串行時(shí)鐘DS1305在無(wú)紙記錄儀中的實(shí)現(xiàn)

        作者:莊文斌 林穎 時(shí)間:2003-04-07 來(lái)源:電子設(shè)計(jì)應(yīng)用 收藏
        摘 要:
        隨著現(xiàn)代化工業(yè)過(guò)程控制領(lǐng)域的飛速發(fā)展,以CPU為核心的新型控制儀表得到了廣泛的應(yīng)用,與之配套的二次記錄儀表也發(fā)展到無(wú)紙記錄的新階段。對(duì)于工業(yè)現(xiàn)場(chǎng)信號(hào)記錄與監(jiān)測(cè)提供了相當(dāng)準(zhǔn)確與精確的記錄,而實(shí)現(xiàn)這一準(zhǔn)確與精確的記錄與該系統(tǒng)的時(shí)鐘是緊密聯(lián)系在一起的。文章介紹用來(lái)實(shí)現(xiàn)DALLAS公司的串行實(shí)時(shí)鐘芯片DS1305在應(yīng)用。

        關(guān)鍵詞:

        關(guān)于Dallas公司的串行實(shí)時(shí)鐘芯片DS1305工作原理,在參考文獻(xiàn)[2]有詳細(xì)的介紹,本文不再贅述。本文從的角度,來(lái)詳細(xì)介紹DS1305在我們所研制的無(wú)紙記錄儀上的實(shí)現(xiàn)。
        1 C51的特點(diǎn)
        C語(yǔ)言是一種編譯型程序設(shè)計(jì)語(yǔ)言,它兼顧了多種高級(jí)語(yǔ)言的特點(diǎn),并具備匯編語(yǔ)言的功能。C語(yǔ)言有功能豐富的庫(kù)函數(shù),運(yùn)算速度快,編譯效率高,有良好的可移植性而且可以直接實(shí)現(xiàn)對(duì)系統(tǒng)硬件的控制。
        C語(yǔ)言是一種結(jié)構(gòu)化程序設(shè)計(jì)語(yǔ)言,它支持由頂向下結(jié)構(gòu)化程序設(shè)計(jì)技術(shù)。
        C語(yǔ)言程序具有完善的模塊化程序結(jié)構(gòu),從而為軟件開(kāi)發(fā)中采用模塊化程序設(shè)計(jì)方法提供了有力保障。因此,使用C語(yǔ)言進(jìn)行程序設(shè)計(jì)來(lái)編寫(xiě)目標(biāo)系統(tǒng)軟件會(huì)大大縮短開(kāi)發(fā)周期,增加軟件的可讀性,便于改進(jìn)和擴(kuò)充。
        本系統(tǒng)采用Keil公司的C51編譯器,版本為V6.10a。

        2 DS1305與AT89C55WD的連接圖
        見(jiàn)圖1
        說(shuō)明:本系統(tǒng)SERMODE 腳與VCC相連,為MOTOROLA SPI 方式。INT0腳與AT89C55WD的INT0腳相連,對(duì)時(shí)鐘進(jìn)行每秒中斷1次編程,CPU每秒對(duì)4個(gè)通道進(jìn)行采樣。

        3 DS1305引腳定義
        根據(jù)C51 所提供的定義關(guān)鍵字SBIT,進(jìn)行如下的定義:
        SBIT clk_ce=P1^3; /*時(shí)鐘片選*/
        SBIT sclk_bit=P2^4; /*時(shí)鐘脈沖輸入端*/
        SBIT sdi_bit=P2^6; /*時(shí)鐘輸入引腳*/
        SBIT sdu_bit=P2^7; /*時(shí)鐘輸出引腳*/

        說(shuō)明:P1^3 等價(jià)于匯編語(yǔ)言P1.3的用法,由C51頭文件REG51.H定義,形式如下:
        #include
        3 時(shí)鐘初始化
        對(duì)DS1305的初始化主要有如下三個(gè)寫(xiě)操作:
        往控制寄存器寫(xiě)0x05;
        往狀態(tài)寄存器寫(xiě)0x01;
        往涓流充電寄存器寫(xiě)0xa5;
        對(duì)應(yīng)的C51程序如下,該程序調(diào)用了子程序dswr(uchar ac)在其后說(shuō)明:

        initclock() /*時(shí)鐘初始化*/
        {
        sclk_bit=0;
        dswr(0x8f);/* 往控制寄存器寫(xiě)0x05*/
        dswr(0x05);

        dswr(0x90); /*往狀態(tài)寄存器寫(xiě)0x01 */
        dswr(0x01);

        dswr(0x91); /*往涓流充電寄存器寫(xiě)0xa5*/
        dswr(0xa5);
        }

        函數(shù)dswr 中用到參數(shù)uchar 是在C51 主程序開(kāi)始定義的無(wú)符號(hào)字符:
        #define unsigned char uchar
        有了上述定義,整個(gè)程序都可以這樣使用。

        dswr(uchar ac) /*ACC中的數(shù)據(jù)從高位開(kāi)始送入ds1305 */
        {
        uchar i;
        clk_ce=1;
        sdu_bit=1;
        for (i=0;i<8;i++)
        {
        sdi_bit=(ac&0x80==0x80)?1:0;
        sclk_bit=1;
        sclk_bit=0;
        ac=ac<<1;
        }
        }

        4 時(shí)鐘的讀
        uchar dsrd() /*讀時(shí)鐘*/
        {
        uchar i,j,ac=0,x;
        clk_ce=1;
        for (i=0;i<=7;i++)
        {
        sclk_bit=1;
        j=2;
        while (j--);
        sclk_bit=0;
        x=P2;
        ac=(x&0x80)>>i|ac;/*高位在前,底位在后*/
        }
        return (ac);
        clk_ce=0;
        }

        說(shuō)明:因?yàn)镈S1305為串行方式,每次輸出1位,且高位在前,故上述程序用了向右移位再與原值相或的技巧來(lái)實(shí)現(xiàn)。
        5 時(shí)鐘的設(shè)置

        clockset() /*時(shí)鐘設(shè)置*/
        {
        uchar i,j;
        sclk_bit=0;
        dswr(0x8f);/* 往控制寄存器寫(xiě)0x05*/
        dswr(0x05);
        clk_ce=0;
        sclk_bit=0;
        for (i=0x80,j=0;i<=0x86;i++)
        if(i!=0x83)
        {
        clk_ce=1;
        dswr(i);/*address*/
        dswr(y_m_d_h_m[5-j]);/*data*/
        j++;
        clk_ce=0;

        }

        clockwp();
        }

        函數(shù)中用到數(shù)組y_m_d_h_m存放的是即將寫(xiě)入時(shí)鐘的年、月、日、時(shí)、分和秒的壓縮的BCD碼,在主程序中定義為
        uchar y_m_d_h_m[6]={0x01,0x05,0x19,0x23,0x10,0x00};

        一旦設(shè)置好,就必須調(diào)用時(shí)鐘寫(xiě)保護(hù)來(lái)防止對(duì)時(shí)鐘的誤操作。
        clockwp() /*時(shí)鐘寫(xiě)保護(hù)*/
        {
        clk_ce=1;
        dswr(0x8f);
        dswr(0x45);
        clk_ce=0;
        }

        6 時(shí)間的顯示
        在我們所研制的無(wú)紙記錄儀,顯示采用液晶顯示器,因?yàn)橐壕э@示器不同,則為液晶顯示器所寫(xiě)的驅(qū)動(dòng)程序也不一樣,在此不對(duì)液晶顯示器部分進(jìn)行詳細(xì)說(shuō)明,而僅對(duì)于我們所采用的技巧做一說(shuō)明。
        先定義兩個(gè)數(shù)組:
        其一:
        uchar clock[]={0x00,0x00,0x00,0x00,0x00,0x00};/*秒、分、時(shí)、日、月、年*/
        該數(shù)組把從時(shí)鐘讀來(lái)壓縮BCD數(shù)據(jù)暫存于此。
        其二:
        從BCD碼轉(zhuǎn)換為非壓縮BCD碼。

        uchar dispclock[]={0x12,0x10,0x10,0x11,0x0d,0x10,0x17,0x0d,0x11,0x10,0x00,0x11,0x12,0x1a,0x11,0x18,0x1a,0x11,0x18};

        /*年、月、日、星期、時(shí)、分、秒*/

        例子:2001-07-10 12:18:18
        0x10...0x19,0x0d,0x1a分別是液晶顯示器內(nèi)部CG-ROM字符0-9,- 和 :的壓縮BCD碼。

        clockread() /* 讀時(shí)鐘數(shù)據(jù)送入clock數(shù)組*/
        {
        uchar i,ac,j,m=1;
        for (i=0;i<7;i++)
        {
        dswr(i);
        ac=dsrd() ;

        switch (i)
        {
        case 0:
        case 1:
        case 2: clock[i]=ac ;break;
        case 3: break;
        default:clock[i-1]=ac;
        }
        clk_ce=0;
        }

        }


        clockdisp() /*把時(shí)間顯示數(shù)組中的數(shù)據(jù)顯示*/
        {
        uchar j=DELAY;
        uchar ac,i;
        for (i=0;i<=5;i++) /* 把clock 數(shù)組中的BCD碼轉(zhuǎn)換成clockdisp的非壓縮BCD碼*/
        {
        ac=clock[i];
        ac= ac>>4;
        ac+=0x10;
        dispclock[2+3*(5-i)]=ac;
        ac=clock[i];
        ac=ac & 0x0f;
        ac+=0x10;
        dispclock[2+3*(5-i)+1]=ac;
        }
        /*以下是對(duì)液晶進(jìn)行操作*/
        data_wri(0);
        data_wri(0);
        com_wri(0x24);
        com_wri(0xb0);
        for (i=0;i<19;i++)
        {
        wait3();
        lcd_ce=0;
        PLCD_DATA=dispclock[i];
        while (j--);
        lcd_ce=1;
        j=DELAY;
        }
        lcd_ce=0;
        com_wri(0xb2);
        lcd_ce=1;
        }

        7 時(shí)鐘每秒中斷一次
        clockalarm()
        {
        uchar set[]={0x87,0x81,0x88,0x81,0x89,0x80,0x8a,
        0x80,0x8f,0x05,0x90,0x01,0x91,0xa5};
        uchar i,j;
        clk_ce=0;
        sclk_bit=0;
        i=0;
        for (j=0;j<7;j++)
        {
        dswr(set[i++]);
        dswr(set[i++]);
        clk_ce=0;
        i=2;
        while (i--);
        }

        }

        8 結(jié)論
        我們用C51對(duì)DS1305進(jìn)行編程,可讀性強(qiáng),模塊化好,結(jié)構(gòu)清晰,方便今后的系統(tǒng)維護(hù),應(yīng)用于我們開(kāi)發(fā)的無(wú)紙記錄儀中,運(yùn)行穩(wěn)定,效果良好。該系統(tǒng)已經(jīng)通過(guò)福建省科技庁的鑒定。


        參考文獻(xiàn)

        [1] 馬忠梅等 單片機(jī)的C語(yǔ)言應(yīng)用程序設(shè)計(jì) 北京航空航天大學(xué)出版社,2000年 修訂版
        [2] 王潤(rùn)田等 DS1305在野外自容式設(shè)備中的應(yīng)用 電子技術(shù)1999年第11期
        [3] DALLAS 公司DS1305 Serial Alarm Real Time Clock(RTC) Data Sheet 08/10/99



        評(píng)論


        相關(guān)推薦

        技術(shù)專(zhuān)區(qū)

        關(guān)閉
        主站蜘蛛池模板: 宜章县| 湘西| 永安市| 农安县| 南川市| 贺州市| 高州市| 义乌市| 天峻县| 贵南县| 图们市| 蓬安县| 徐水县| 玉溪市| 手机| 桓台县| 惠水县| 三都| 驻马店市| 郸城县| 临武县| 婺源县| 琼海市| 开平市| 云霄县| 逊克县| 长岭县| 佛坪县| 宾阳县| 河曲县| 麟游县| 垦利县| 根河市| 剑阁县| 乌拉特后旗| 玉环县| 雅江县| 凌源市| 开封市| 东莞市| 浑源县|