新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 將AT89C52用作多功能外圍器件使用

將AT89C52用作多功能外圍器件使用

作者: 時間:2016-10-15 來源:網(wǎng)絡 收藏

摘要:介紹利用單片機作為可編程接口的方法。該接口具有1個鍵盤/顯示接口,2個16位定時/計數(shù)器和1個全雙工異步串行通信口。其模塊化的設計,可以給用戶使用帶來許多方便。 關(guān)鍵詞:接口 串行通信 軟件譯碼 (簡稱89C52)的廣泛使用,使單片機的價格大大下降。目前,89C52的市場零售價已經(jīng)低于8255、8279、8253、8250等專用接口芯片中的任何一種;而89C52的功能實際上遠遠超過以上芯片。因此,如把89C52作為接口芯片使用,在經(jīng)濟上是合算的。在本人設計的系統(tǒng)中,將89C52設計為可編程接口,其相關(guān)程序固化在片內(nèi)的Flash ROM中。該芯片(以下簡稱多功能接口)具有如下功能:①有1個專用的鍵盤/顯示接口;②有1個全雙工異步串行通信接口;③有2個16位定時/計數(shù)器。這樣,1個89C52芯片,承擔了3個專用接口芯片的工作;不僅使成本大大下降,而且優(yōu)化了硬件結(jié)構(gòu)和軟件設計,給用戶帶來許多方便。 1 硬件結(jié)構(gòu) 把89C52當作接口使用,接口自身必須盡可能地少占用硬件資源,與主系統(tǒng)之間的連接線也應盡可能少,這樣才能少占主機引腳,把更多的資源留給系統(tǒng)。本設計中,主機與多功能接口之間采用串行通信。主機與多功能接口之間有四根連接線:CE、CLK、DAT、INTR。CE用于作片選信號輸入端。此引腳為低電平時,主機能與多功能接口進行數(shù)據(jù)傳送。CLK為時鐘輸入端,當主機向多功能接口發(fā)送指令時,此引腳電平上升表示數(shù)據(jù)有效。DAT為串行數(shù)據(jù)輸入/輸出端。INTR為多功能接口輸出端。當多功能接口內(nèi)的數(shù)據(jù)準備好時,由INTR向主機發(fā)低電平,通知主機,數(shù)據(jù)已準備就緒,可以進行讀操作。該信號可供主機查詢,也可用作發(fā)向主機的中斷請求信號。 89C52的P0、P1、P2口用作鍵盤/顯示接口。用程序掃描的方法進行鍵盤輸入和顯示輸出。P0口作為字段口,P1口作為鍵盤的列輸入口,P2作為顯示器的字位口以及鍵盤的行掃描輸出口。由于顯示器字位口電流較大,P2口需進行電流驅(qū)動。該多功能接口最多可連接8個LED顯示器和1個 8%26;#215;8鏈盤矩陣。其硬件原理如圖1所示。 P3.2、P3.3、P3.6、P3.7分別用作CE、CLK、DAT和INTR信號;而P3.0、P3.1用作異步串行通信數(shù)據(jù)線RXD和 TXD;P3.4、P3.5分別是OUT0/T0和OUT1/T1信號線。該引腳在定時器工作于連續(xù)脈沖方式時,可輸出通斷比與頻率可編程的連續(xù)脈沖;工作在計數(shù)器方式時,該引腳作為外部計數(shù)脈沖輸入端輸入計數(shù)脈沖。 圖1 2 通信協(xié)議 實現(xiàn)多功能接口的關(guān)鍵是主機和多功能接口之間的通信。在本設計中,采用主從方式進行通信,所有的操作都由主機發(fā)出操作指令。多功能接口在收到主機發(fā)來的操作指令后,對操作碼進行軟件譯碼。根據(jù)操作碼的內(nèi)容轉(zhuǎn)入相應的工作通道,并從操作數(shù)部分獲取所需要的數(shù)據(jù)。 多功能接口采用串行方式與主機通信。串行數(shù)據(jù)從DAT引腳送入芯片,并由CLK端同步。當片選信號CE變低后,DAT引腳上的數(shù)據(jù)在CLK引腳的上升沿被寫入多功能接口的寄存器中。 串行接口的時序如圖2所示。 圖2 由于多功能接口接收指令的工作用軟件進行,因此,圖中的t1、t2、t3、t4、t5時間較長,要求t1-t4時間在10μs~1000μs。指令有兩類:一類寫指令,一類是讀指令。寫指令中不管是操作碼還是操作數(shù),其數(shù)據(jù)傳送方向均為從主機到多功能接口;而對讀指令來講,操作碼部分的數(shù)據(jù)方向是從主機到多功能接口,而操作數(shù)部分的數(shù)據(jù)方向是從多功能接口到主機。 t5是讀指令中操作碼與操作數(shù)之間需要的時間間隔,t5應在30μs~1000μs的范圍。在讀操作時,CLK時鐘的上升沿來到時,多功能接口將數(shù)據(jù)送到 DAT引腳上。 3 指令編碼 多功能接口共有13條指令。指令長度為1字節(jié)、2字節(jié)、3字節(jié)和4字節(jié)不等。 (1)復位指令 機器碼為00H。當多功能接口收到復位指令后,所有字符消隱,所有定時器清零,定時中斷和串行中斷關(guān)閉。其狀態(tài)與系統(tǒng)上電復位的情況相似。 (2)顯示數(shù)據(jù)指令 該指令向多功能接口的顯示緩沖器中發(fā)送顯示數(shù)據(jù)。這是一個2字節(jié)指令,其指令編碼如下: D7 D6 D5 D4 D3 D2 D1 D0 0 0 0 1 0 0 0 0 D7 D6 D5 D4 D3 D2 D1 D0 dip 0 0 0 d3 d2 d1 d0 其中dip為小數(shù)點控制位,a2、a1、a0為位地址,d3、d2、d1、d0為待顯示的字符,其格式如表1、2所列。 (3)閃爍指令 該指令控制各個數(shù)碼管的閃爍屬性。d7~d0分別對應數(shù)碼管1~8,1為閃爍,0為不閃爍。 D7 D6 D5 D4 D3 D2 D1 D0 0 0 0 1 0 0 0 0 D7 D6 D5 D4 D3 D2 D1 D0 d7 d6 d5 d4 d3 d2 d1 d0 (4)循環(huán)左移指令 指令碼為11H。該指令將所有顯示從左向右移動1位。 表1 a2 a1 a0 顯示位 0 0 0 1 0 0 1 2 0 1 0 3 0 1 1 4 1 0 0 5 1 0 1 6 1 1 0 7 1 1 1 8 表2 d3 d2 d1 d0 顯示字符 0 0 0 0 0 0 0 0 1 1 0 0 1 0 2 0 0 1 1 3 0 1 0 0 4 0 1 0 1 5 0 1 1 0 6 0 1 1 1 7 1 0 0 0 8 1 0 0 1 9 1 0 1 0 - 1 0 1 1 H 1 1 0 0 L 1 1 0 1 P 1 1 1 0 E 1 1 1 1 空(5)循環(huán)右移指令 指令碼為12H。該指令將所有顯示從右向左移動1位。 (6)讀鍵盤指令 指令為2字節(jié)指令,操作數(shù)為讀到的鍵值。各鍵盤的鍵值如圖1所示。該指令格式如下: D7 D6 D5 D4 D3 D2 D1 D0 0 0 0 1 0 0 1 1 D7 D6 D5 D4 D3 D2 D1 D0 d7 d6 d5 d4 d3 d2 d1 d0 (7)連續(xù)脈沖輸出指令 該指令對定時器進行編程。使OUT0/OUT1輸出連續(xù)脈沖,脈沖的通斷比和頻率可以通過編程設定。其指令為4,格式如下: 第1字節(jié) D7 D6 D5 D4 D3 D2 D1 D0 0 0 0 1 0 0 1 1/0 第2字節(jié) D7 D6 D5 D4 D3 D2 D1 D0 M3 M2 M1 M0 N3 N2 N1 N0 第3字節(jié) D7 D6 D5 D4 D3 D2 D1 D0 f15 f14 f13 f12 f11 f10 f9 F8 第4字節(jié) D7 D6 D5 D4 D3 D2 D1 D0 f7 f6 f5 f4 f3 f2 f1 f0 其中M:N是脈沖的通斷比,M或N的設置范圍是1~10。f15~f0是頻率設置,其設置范圍是1~9999Hz。采用BCD碼設置。指令操作碼中,D0 設置定時器0或定時器1工作。 (8)定時器方式指令 該指令為3字節(jié)指令。操作碼為22H、23H,其中D0位確定對定時器0還是定時器1進行操作。第2、第3字節(jié)為定時時間。 (9)計數(shù)器方式指令 該指令為3字節(jié)指令。操作碼為24H、25H,其中D0位確定對定時器0還是定時器1進行操作。第2、第3字節(jié)為計數(shù)初值。 (10)讀計數(shù)器指令 為3字節(jié)指令。操作碼為26H、27H,第2、第3字節(jié)為從計數(shù)器讀到的計數(shù)值。操作碼的D0位確定對計數(shù)器0還是計數(shù)器1進行操作。通過該指令讀以16 位計數(shù)器的當前計數(shù)值。 (11)串行發(fā)送指令 該指令對異步串行通信進行初始化,其指令格式如下: 第1字節(jié) D7 D6 D5 D4 D3 D2 D1 D0 0 0 1 1 0 a2 a1 a0 表2字節(jié) D7 D6 D5 D4 D3 D2 D1 D0 b1 b0 d5 d4 d3 d2 d1 d0 第3字節(jié) D7 D6 D5 D4 D3 D2 D1 D0 d7 d6 d5 d4 d3 d2 d1 d0 第4字節(jié) D7 D6 D5 D4 D3 D2 D1 D0 d7 d6 d5 d4 d3 d2 d1 d0 串行通信采用批傳送的方法進行。每條指令傳送1個數(shù)據(jù)幀。指令中,第1、第2字節(jié)用來進行串行通信初始化,第3字節(jié)以后是發(fā)送的各個數(shù)據(jù)。b1、b0用來確定奇校驗、偶校驗還是不校驗。第2字節(jié)的操作數(shù)d5、d4、d3、d2、d1、d0用來設定該幀數(shù)據(jù)的個數(shù),最多1幀可發(fā)送64個字符。a2、a1、 a0設定串行通信的波特率。其波特率如表3所列。 表3 a2 a1 a0 波特率/baud 0 0 0 110 0 0 1 150 0 1 0 300 0 1 1 600 1 0 0 1200 1 0 1 2400 1 1 0 4800 1 1 1 9600 (12)串行接收指令 指令格式如下: 第1字節(jié) D7 D6 D5 D4 D3 D2 D1 D0 0 0 1 1 1 a2 a1 a0 第2字節(jié) D7 D6 D5 D4 D3 D2 D1 D0 b1 b0 d5 d4 d3 d2 d1 d0 第3字節(jié) D7 D6 D5 D4 D3 D2 D1 D0 d7 d6 d5 d4 d3 d2 d1 d0 第4字節(jié) D7 D6 D5 D4 D3 D2 D1 D0 d7 d6 d5 d4 d3 d2 d1 d0 指令編碼與串行發(fā)送送似,第3字節(jié)之后為接收到的數(shù)據(jù)。 (13)讀狀態(tài)指令 指令格式如下: D7 D6 D5 D4 D3 D2 D1 D0 0 1 0 0 0 0 0 0 D7 D6 D5 D4 D3 D2 D1 D0 0 0 0 d4 d3 d2 d1 d0 在鍵盤輸入、計數(shù)器回等或串行通信中斷時,多功能接口將向INTR發(fā)出負脈沖,主機在響應后應發(fā)讀狀態(tài)指令,查詢狀態(tài)標志,確定是哪個狀態(tài)標志動作。其中 d0為鍵盤輸入標志,d1為計數(shù)器0回零動作。d2為計數(shù)器1回零標志。d3為串行接收結(jié)束標志,d4為串行發(fā)送結(jié)束標志。 4 多功能接口的軟件設計 在主程序中進行顯示掃描和鍵盤掃描,如有鍵盤輸入,則找出鍵盤矩陣的鍵號。鍵號存入鍵值寄存器,并置位狀態(tài)標志,同時發(fā)出INTR負脈沖,通知主機來取鍵值。 主機通過指令對多功能接口進行操作。主機首先要將CE置0。該下降沿通過P3.2向多功能接口發(fā)出外部中斷。在中斷服務程序中,多功能接口進行取指和譯碼操作,并通過散轉(zhuǎn)指令轉(zhuǎn)入相應的處理通道。則中斷返回。至此,一條指令的取指-譯碼-執(zhí)行的過程才告結(jié)束。程序回到主循環(huán)繼續(xù)進行顯示掃描和鍵盤掃描。 所謂取指操作實際上就是多功能接口與主機進行通信的過程。由于采取軟件進行通信,t1、t2、t3、t4、t5的寬度有一定的范圍。 在接收到主機的操作指令后,多功能接口與外設的串行通信及有關(guān)定時器的操作采用中斷方式進行。在中斷結(jié)束時,置位狀態(tài)標志,并向主機發(fā)INTR負脈沖。該負脈沖可供主機查詢,也可作為向主機發(fā)出的中斷請求信號。完成以上工作后,返回主程序。 89C52有三個定時器,其中T2在中串行通信時間來作為串行通信的波特率發(fā)生器。這樣T0和T1就可以出借給用戶作定時器內(nèi)。T2在波特率發(fā)生器方式時,可置位T2CON寄存器中的TCLK位或RCLK位。在TH2、TL2中裝入計數(shù)初值,使T2從這個初值開始計數(shù),但并不置位FT2。RCAR2H和 RCAP2L中的常數(shù)由軟件設定后,T2的溢出率是嚴格不變的,因而使串行通信的波特率非常穩(wěn)定。 5 應用實例 在本刊網(wǎng)絡補充版(http://www.dpj.com.cn)中,給出主機為時的應用實例。程序的功能為等待鍵盤輸入,然后將所讀到的鍵盤碼轉(zhuǎn)換成十進制后送LED數(shù)碼管顯示。

本文引用地址:http://butianyuan.cn/article/201610/307484.htm


關(guān)鍵詞: AT89C52 多功能 外圍器件

評論


相關(guān)推薦

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

關(guān)閉