李紅波,張曉娟,孔令云,李 盛
(西京學院理學院,陜西 西安710123)
I/O 端口是單片機最為常用的簡單外設[1],學好教好I/O 端口內(nèi)容具有重要意義。因為對初學單片機的學生來說,I/O 端口內(nèi)容是單片機課程的入門首選,更是通向微控制領(lǐng)域的必經(jīng)之路。另外,單片機的高度封裝和集成,其不透明性給學生理解帶來了障礙,同時在單片機課程講述中,往往是通過框圖的形式體現(xiàn)內(nèi)部電路組成和結(jié)構(gòu)原理[2],學生難以明白I/O 端口編程控制原理和電路信號細節(jié),對深入理解I/O 端口工作原理、理清程序和電路關(guān)系、探究程序控制邏輯電平的實質(zhì)和正確使用外設部件造成了阻礙。
Proteus 軟件具有“單片機仿真軟件”和“虛擬實驗室”的美稱[3-4],它提供有豐富的電子元器件和調(diào)試儀器,可以通過搭建單片機仿真電路,并借助豐富的工具,探究單片機運行原理和信號跟蹤,是目前單片機課程教學中常用的軟件之一。眾多高校通過Proteus虛擬教學改革或虛實結(jié)合的Proteus 教學實踐[4]探索創(chuàng)新,取得了積極的效果[5]。為了使得學生深入認知I/O端口工作原理,探究I/O 口輸出電平的實質(zhì),文中設計了片外I/O 端口電路及程序,跟蹤程序運行,仿真和觀測電路細節(jié),揭開信號控制的秘密,詳細明確了程序執(zhí)行過程與電平的轉(zhuǎn)變過程,為理解芯片的可編程方法提供了設計思路,為理解單片機的I/O 端口軟件控制奠定了基礎,提升了教學效果。
I/O 端口是由總線接口邏輯、端口鎖存器和端口驅(qū)動電路組成的,如圖1 所示。
圖1 I/O 端口框圖
CPU 通過三總線接口對其進行訪問。CPU 和I/O端口部件按照總線要求和地址編號進行相連,CPU 的AB 總線和CB 總線連接端口的總線接口邏輯,CPU 的DB 總線連接端口的鎖存器數(shù)據(jù)口,數(shù)據(jù)總線寬度一般為8 位的整數(shù)倍。CPU 對端口的訪問實質(zhì)上是對端口鎖存器進行尋址讀寫訪問的。
為了模擬按位尋址和并行尋址,設計了可按位按端口進行訪問的總線邏輯接口,如圖2 所示。地址線對應連接A0~A2,并由74HC138 譯碼器和三輸入或門OR_3 產(chǎn)生端口基地址片選CS_ALL 和端口位選信號CS0~CS7,兩者片選信號通過AORB 二選一選擇器切換。當A0~A2 為X:000 時,OR_3 或門輸出CS_ALL=0,AORB 選擇器輸出Q0=1,致使所有端位的讀寫控制與門AND_2 都被有效,此時全部端口位皆可訪問。當A0~A2 非X:000 時(X:001~X:111),OR_3 或門輸出CS_ALL=1,AORB 選擇器輸出Q0=B0,而B0 受74HC138 譯碼器輸出CSx 控制,此時CSx=0的端口位可被訪問,其余被禁止訪問。所以,地址X:000是并行端口基地址,各B0~B7 位地址分別是X:000~X:111。另外,WR 線連W,RD 線連R,位選信號通過讀寫與門與W 和R 信號相與作為數(shù)據(jù)端口的最終位選信號。
該端口功能只提供有輸入/輸出數(shù)據(jù)的能力。為了使得輸出的數(shù)據(jù)得以穩(wěn)定保持,通過數(shù)據(jù)鎖存器進行有條件輸出。同時,為了兼顧輸入的三態(tài)功能,采用三態(tài)門進行控制輸入,如圖2 中的I/O 端口電路所示。該端口電路包括1 個鎖存器、2 個三態(tài)門、1 個電子開關(guān)及1 個上拉電阻。鎖存器提供有開鎖CL 信號,用于對數(shù)據(jù)進行輸出鎖存,確保數(shù)據(jù)的可靠穩(wěn)定,數(shù)據(jù)從/Q端輸出。三態(tài)門有3 種工作狀態(tài):導通高態(tài)、導通低態(tài)和高阻態(tài)。當控制端有效時,三態(tài)門導通,否則斷開。三態(tài)門主要用來提供數(shù)據(jù)輸入。內(nèi)部數(shù)據(jù)總線連接在鎖存器的D 端,內(nèi)部控制信號連接在CL 端,內(nèi)部地址信號通過地址總線連接在I/O 口的片選信號上。
以MCS-51 單片機的通用雙向I/O 端口為例,I/O端口共8 位,每端口位都具有同樣的I/O 口電路結(jié)構(gòu),如圖2 驅(qū)動電路所示,電子開關(guān)T 和上拉電阻R 用于輸入輸出的電平轉(zhuǎn)換。當T 控制端高有效時,開關(guān)閉合和地相接;低無效時,開關(guān)斷開。利用MOS 管進行輸出設計,可以增大下拉電流,上拉通過電阻,使得拉電流較小。
圖2 I/O 端口電路圖
以MCS-51 單片機為例,通過Proteus 建立單片機片外總線最小仿真系統(tǒng)電路,利用74HC373 地址鎖存芯片擴展單片機片外總線,并與I/O 端口電路連接,然后在關(guān)鍵點添加信號電氣斷點RTDBREAK(DBT1~DBT4)和邏輯狀態(tài)探針LOGICPROBE 工具,以實時跟蹤獲知指令的執(zhí)行過程、指令數(shù)據(jù)以及I/O 口電平的變化。
在Keil uVision 環(huán)境下編寫MCS-51 單片機C51程序,以實施對端口讀寫操作,并通過調(diào)試察看匯編代碼功能,把其匯編代碼記錄下來。
/////////////////////////C 語言程序///////////////////
volatile char xdata LED_Data_at_0x00;//定義輸出地址
void main(void)
{
while(1)
{
LED_Data=0x81; //(1)輸出0x81
P1=LED_Data; //(2)輸入到P1
LED_Data=0x00; //(3)輸出0x00
P1=LED_Data; //(4)輸入到P1
}
}
/////////////////////////匯編語言程序////////////////////
main:
MOV DPTR,#LED_Data(0x0000)//(DPTR)=0x0
MOV A,#0x81 //(A)=0x81
MOVX @DPTR,A //輸出0x81
MOVX A,@DPTR //讀取
MOV P1(0x90),A
CLR A //(A)=0x00
MOVX @DPTR,A //輸出0x00
MOVX A,@DPTR //讀取
MOV P1(0x90),A
SJMP main
//////////////////////////////////////////////////////////////////
上述C 語言程序?qū)崿F(xiàn)了對外部8 位端口地址X:00進行讀寫訪問的例子。語句(1)和(3)用于對端口寫操作賦值,語句(2)和(4)用于對端口進行讀操作,并把讀得的數(shù)據(jù)賦值給P1 口輸出。從匯編代碼來看,主要采用MOV(片內(nèi)尋址)或MOVX(片外尋址)指令進行數(shù)據(jù)操作。當要輸出數(shù)據(jù)時,DPTR 寄存器被賦值為目標地址,A 寄存器被賦值為輸出數(shù)據(jù),利用MOVX@DPTR,A 指令進行寫操作,以實現(xiàn)對端口的寫賦值;當要輸入數(shù)據(jù)時,通過MOVX A,@DPTR指令對端口引腳進行讀操作,之后利用MOV P1,A 指令進行數(shù)據(jù)輸出到P1 口。
把HEX 程序加載到虛擬單片機中,啟動Proteus虛擬調(diào)試環(huán)境。進入調(diào)試環(huán)境后,連續(xù)執(zhí)行指令,當遇到DBT 斷點時,就會停止運行,此時電路關(guān)鍵點邏輯電平信息可從邏輯狀態(tài)探針LOGICPROBE 中獲得。其中DBT1 和DBT4 斷點分別設置在WR 寫信號的低有效和高有效時刻,DBT2 和DBT3 斷點分別設置在RD 讀信號的低有效和高有效時刻。這樣設置可以有效跟蹤MOVX 指令的執(zhí)行過程,以監(jiān)控I/O 端口信號狀態(tài)變化的前后過程,有助于探明數(shù)據(jù)輸出細節(jié)。
2.3.1 輸出電平
輸入輸出狀態(tài)如圖3 所示。
從輸出前的圖3(a)知,此時刻地址A0~A2=X:000,數(shù)據(jù)D[0..7]=10000001 B,讀寫與門皆開啟,已準備好了輸出,就等WR 變高輸出。
從輸出后的圖3(b)圖知,鎖存器數(shù)據(jù)在CLK 高跳沿時,D 信號被鎖存到Q 端,同時/Q 端為0 電平,經(jīng)驅(qū)動電路反相后,GPIO.0 和GPIO.7 由輸出前0 電平轉(zhuǎn)變?yōu)? 電平了,成功實現(xiàn)了數(shù)據(jù)D 到GPIO 的輸出控制。
2.3.2 輸入電平
從輸入前的圖3(c)知,此時刻地址A0~A2=X:000,數(shù)據(jù)D[0..7]=11111111 B,讀寫與門皆開啟,已準備好了輸入,就等RD 變高輸入。
從輸出后的圖3(d)知,在R[0..7]高跳沿時,三態(tài)緩沖門開啟,引腳數(shù)據(jù)GPIO.0 和GPIO.7 信號被傳送到數(shù)據(jù)總線D[0..7]上,D[0..7]由輸入前的11111111 B轉(zhuǎn)變?yōu)?1111110 B,成功實現(xiàn)了引腳數(shù)據(jù)到數(shù)據(jù)總線的輸入獲取。
圖3 輸入輸出狀態(tài)
從實驗過程和結(jié)果來看,采用單片機片外總線接口的I/O 端口電路較好地反映出單片機I/O 端口的結(jié)構(gòu)原理、工作過程和電路信號傳輸轉(zhuǎn)變細節(jié)。通過I/O端口電路設計和信號跟蹤實驗,消除了由于封裝造成的單片機不透明性給學生帶來的疑惑,為學生理解單片機的總線工作機制、端口輸入輸出數(shù)據(jù)、信號產(chǎn)生和外設控制等方面奠定了基礎,而且補充完善了課程內(nèi)容,為單片機外設電路設計提供了參考。