【文章內(nèi)容簡介】
1Hz; (4) 內(nèi)含 復(fù)位電路振蕩器電容和掉電檢測電路; (5) 四種報(bào)警功能和定時(shí)器功能; (6) I2C 總線從地址:讀, 0A3H;寫, 0A2H。 PCF8563 的芯片引腳排布及引腳介紹如圖 2 所示 : O S C I :振蕩器輸入; O S C O :振蕩器輸出; / I N T :中斷輸出(開漏,低電平有效); V ss :接地; S D A :串行數(shù)據(jù) I / O ; S C L :串行時(shí)鐘輸入; C L K O U T :時(shí)鐘輸出(開漏); V DD 正電源。 圖 2 PCF8563芯片引腳排布及說明 畢業(yè)設(shè)計(jì) (論文)報(bào)告紙 共 21 頁 第 8 頁 第 3 章 系統(tǒng)的軟硬件設(shè)計(jì) 硬件電路設(shè)計(jì) 最小系統(tǒng)設(shè)計(jì)電路 單片機(jī)要正常運(yùn)行,必須具備一定的硬件條件,其中最主要的就是三個(gè)基本條件:( 1)電源正常;( 2)時(shí)鐘正常;( 3)復(fù)位正常。在 AT89C51 單片機(jī)的 40 個(gè)引腳中,電源引 腳2 根,晶振引腳 2 根,控制引腳 4 根,可編程輸入輸出引腳 32 根。 最小系統(tǒng)連接圖 如 圖 3所示。 圖 3 AT89C51最小系統(tǒng)連接圖 時(shí)鐘模塊電路 PCF8563 芯片的工作原理如下:它有 16 個(gè) 8 位寄存器,一個(gè)可自動(dòng)增量的地址寄存器,一個(gè)內(nèi)置 的振蕩器(帶有一個(gè)內(nèi)部集成的電容),一個(gè)分頻器(用于給實(shí)時(shí)時(shí)鐘 RTC 提供源時(shí)鐘),一個(gè)可編程時(shí)鐘輸出,一個(gè)定時(shí)器,一個(gè)報(bào)警器,一個(gè)掉電檢畢業(yè)設(shè)計(jì) (論文)報(bào)告紙 共 21 頁 第 9 頁 測器和一個(gè) 400KHz I2C 總線接口。 I2C 總線從地址:讀, 0A3H;寫, 0A2H。 所有 16 個(gè)寄 存器設(shè)計(jì)成可尋址的 8 位并行寄存器,但不是所有位都有用。前兩個(gè)寄存器(內(nèi)存地址 00H, 01H)用于控制寄存器和狀態(tài)寄存器,內(nèi)存地址 02H~ 08H 用于時(shí)鐘計(jì)數(shù)器(秒 ~年計(jì)數(shù)器),地址 09H~ 0CH 用于報(bào)警寄存器(定義報(bào)警條件),地址 0DH 控制 CLKOUT 管腳的輸出頻率,地址 0EH 和 0FH 分別用于定時(shí)器控制寄存器和定時(shí)器寄存器。秒、分鐘、小時(shí)、日、月、年、分鐘報(bào)警、小時(shí)報(bào)警、日?qǐng)?bào)警寄存器,編碼格式為 BCD,星期和星期報(bào)警寄存器不以 BCD 格式編碼。當(dāng)一個(gè) RTC 寄存器被讀時(shí),所有計(jì)數(shù)器的內(nèi)容被鎖存, 因此,在傳送條件下,可以禁止對(duì)時(shí)鐘 /日歷芯片的錯(cuò)讀。 連接原理圖如圖 4 所示。 1 2 3 4 5 6ABCD654321DCBAT i t leN u m be r R e v i s i onS i z eBD a t e : 5 A ug 2 00 8 S he e t o f F i l e : E : \ W o r k f i l e \ 單片機(jī)實(shí)例編寫 \ R S 48 5 C A N 智能嵌入式網(wǎng)關(guān)的設(shè)計(jì) \ R S 48 5 C A N .ddbD r a w n B y :1234 5678O S C IO S C O/ I N TV s sV D DO U TS C LS D AU 4 00P C F 85 6332 .76 8KX2C 40 015P V C CR 40 0 KR 40 1 KV C CP C F _S C LP C F _S D A 圖 4 PCF8563連接原理圖 顯示模塊電路 1602B 可以顯示 2 行 16 個(gè)字符,有 8 位數(shù)據(jù)總線 D0D7,和 RS、 R/W、 EN 三個(gè)控制端口,工作電壓為 5V,并且?guī)в凶址麑?duì)比度調(diào)節(jié)和背光。 LCD 顯示模塊 與單片機(jī)的連接如圖 5 所示 。 畢業(yè)設(shè)計(jì) (論文)報(bào)告紙 共 21 頁 第 10 頁 圖 5 LCD連接圖 軟件設(shè)計(jì) 系統(tǒng)軟件設(shè)計(jì)內(nèi)容 本設(shè)計(jì)的軟件程序包括主程序、中斷子程序、鬧鐘設(shè)定子程序、時(shí)鐘顯示子程序。 在整個(gè)系統(tǒng)中,在單片機(jī)的 30H、 31H 和 32H 中存儲(chǔ)當(dāng)前時(shí)間的小時(shí)、分鐘和秒。用LCD 顯示當(dāng)前的時(shí)間,必須用到分字和合字,因此在 33H、 34H、 35H、 36H、 37H 和 38H中存儲(chǔ)當(dāng)前時(shí)間的時(shí)十位、時(shí)個(gè)位、分十位、分個(gè)位、秒十位和秒個(gè)位,方便顯示。 本設(shè)計(jì)有由四個(gè)輕觸按鍵組成的小鍵盤,這些按鍵可以任意改變當(dāng)前的狀態(tài)。按功能移位鍵一次,表示當(dāng)前要校對(duì)小時(shí)的十位;按第二次,表示當(dāng)前校對(duì)的是小時(shí)的個(gè)位;按第三次,則表示校對(duì)的是分鐘的十位;第四次,表示的校對(duì)的是分鐘的個(gè)位。按下數(shù)字 “ +” 鍵和數(shù)字 “ ” 鍵可在當(dāng)前校對(duì)的數(shù)字上相應(yīng)加上 1 或者減去 1。 系統(tǒng) 軟件采用 C 語言編寫。時(shí)鐘的最小計(jì)時(shí)單位是秒,但使用定時(shí)器的方式 1,最大的定時(shí)時(shí)間也只能達(dá)到 131ms。我們可把定時(shí)器的定時(shí)時(shí)間定為 50ms。這樣,計(jì)數(shù)溢出20 次即可得到時(shí)鐘的最小計(jì)時(shí)單位:秒。而計(jì)數(shù) 20 次可以用軟件實(shí)現(xiàn)。秒計(jì)時(shí)是采用中斷方式進(jìn)行溢出次數(shù)的累積,計(jì)滿 20 次,即得到秒計(jì)時(shí)。從秒到分,從分到時(shí)是通過軟件累加并進(jìn)行比較的方法來實(shí)現(xiàn)的。要求每滿 1 秒,則 “ 秒 ” 單元中的內(nèi)容加 1; “ 秒 ” 單元滿 60,則 “ 分 ” 單元中的內(nèi)容加 1; “ 分 ” 單元滿 60,則 “ 時(shí) ” 單元中的內(nèi)容加 1; “ 時(shí) ”單元滿 24,則將時(shí)、分、秒的內(nèi)容全 部清零。實(shí)時(shí)時(shí)鐘程序設(shè)計(jì)步驟: 畢業(yè)設(shè)計(jì) (論文)報(bào)告紙 共 21 頁 第 11 頁 ( 1)選擇工作方式,計(jì)算初值; ( 2)采用中斷方式進(jìn)行溢出次數(shù)累計(jì); ( 3)從秒 —— 分 —— 時(shí)的計(jì)時(shí)是通過累加和數(shù)值比較實(shí)現(xiàn)的; ( 4)時(shí)鐘顯示緩沖區(qū):時(shí)鐘時(shí)間在方位數(shù)碼管上進(jìn)行顯示,為此在內(nèi)部 RAM 中要設(shè)置顯示緩沖區(qū),共 6 個(gè)地址單元。顯示緩沖區(qū)從左到右依次存放時(shí)、分、秒數(shù)值; ( 5)主程序:主要進(jìn)行定時(shí)器 /計(jì)數(shù)器的初始化編程,然后反復(fù)調(diào)用顯示子程序的方法等待中斷的到來。 ( 6)中斷服務(wù)程序:進(jìn)行計(jì)時(shí)操作; ( 7)加 1 子程序:用于完成對(duì)時(shí)、分、秒的加操作,中斷服務(wù)程序在秒、 分、時(shí)加 1 時(shí)共三次調(diào)用加 1 子程序,包括:合字、加 1 并進(jìn)行進(jìn)制調(diào)整、分字。 畢業(yè)設(shè)計(jì) (論文)報(bào)告紙 共 21 頁 第 12 頁 主程序 MAIN 流程框圖 畢業(yè)設(shè)計(jì) (論文)報(bào)告紙 共 21 頁 第 13 頁 時(shí)鐘 芯片驅(qū)動(dòng) 程序 時(shí)鐘芯片采用的是 PCF8563 芯片,它提供一個(gè)可編程時(shí)鐘輸出,一個(gè)中斷輸出和掉電檢測器,所有的地址和數(shù)據(jù)通過 I2C 總線接口串行傳遞。驅(qū)動(dòng)程序代碼如下: ************************************************************************** * ( 1)函數(shù)名: void I2CStart(void) * 功能:發(fā)送 I2C 總線的起始位 * 輸入:無 * 輸出:無 **************************************************************************/ void I2CStart(void) { EA=0。 SDA=1。 SCL=1。 SomeNOP()。 SDA=0。 SomeNOP()。SCL=0。 } /************************************************************************** * ( 2)函數(shù)名: