朱娟,岳曉峰,張煒,唐新星
(長春工業(yè)大學機電工程學院,吉林長春,130021)
單片機課程主要培養(yǎng)學生對單片機的原理的理解及編程應(yīng)用,其中單片機指令系統(tǒng)是編程過程中極其重要的內(nèi)容,學生對單片機指令的理解需要透徹,準確,這里的學習如果模棱兩可將嚴重影響學生后期對單片機的使用,所以對單片機指令系統(tǒng)的教學十分重要。為了提高單片機指令系統(tǒng)的教學方法,提出抽象指令到具體實物理解的教學方法。
MCS-51 單片機匯編指令共有111 條。包括數(shù)據(jù)傳送類指令28 條,算術(shù)運算類指令24 條,邏輯運算類指令25 條,控制轉(zhuǎn)移類指令17 條,位及布爾操作類指令17 條,在進行指令講解時,要將清楚單片機的尋址方式,和指令的執(zhí)行過程。一般的單片機教材將單片機的運算其、控制器、存儲器等硬件資源安排在一章,指令系統(tǒng)安排在另一章,而兩章之間有密切的聯(lián)系,但是在教材中沒有以語言、數(shù)據(jù)的形式描述,學生在讀教材的時候,很難理解其中的工作機理。
這就要求教師在講解的時候?qū)⒉煌恼鹿?jié)有機的融合起來,將指令所對應(yīng)的硬件運行機理講解清楚,讓學生體驗到具體的運行過程。
單片機指令是針對單片機中的寄存器和RAM、ROM 等進行操作的,因此關(guān)于RAM 和ROM 的知識要融合到指令講解過程中,而在51 單片機中,片內(nèi)RAM 和特殊功能寄存器SFR 的使用頻率尤其高,在教材中,一般低128 字節(jié)片內(nèi)RAM 用圖1 來表示。后面附上若干表格,對圖中的各個空間進一步描述。
圖1 低128 字節(jié)片內(nèi)RAM 的地址空間結(jié)構(gòu)
因此為片內(nèi)RAM 和特殊功能寄存器SFR 設(shè)計存儲器盒子,并由學生完成盒子的制作過程,片內(nèi)RAM 地址從00H-7FH 共需128 個盒子,每8 個盒子排成一排,合計排成16 排,由學生對盒子進行擺位,排序并為每個盒子貼上字節(jié)地址標簽。
接下來,根據(jù)為不同功能的盒子做不同的處理,其中,第一排00H-07H 分別對應(yīng)R0-R7,第二排從08H-0FH 也分別對應(yīng)R0-R7,第三排和第四排同上。為他們再次貼上其寄存器名稱。經(jīng)過這個步驟,細心的學生會發(fā)現(xiàn),不同的盒子竟然會有相同的名稱,那么怎么用名稱來區(qū)分不同的盒子呢?這時,將程序狀態(tài)字寄存器的RS1,RS0 兩個位進行講解,當RS1=0,RS0=0 時,第一組寄存器工作,當RS1=0,RS0=1 時,第二組寄存器工作,當RS1=1,RS0=0 時,第三組寄存器工作,當RS1=1,RS0=1 時,第四組寄存器工作。此時的盒子邊上帶有條件,如圖3 所示。
圖2 部分指令盒子的制作效果
圖3 部分指令盒子的制作效果
接下來要設(shè)計支持位尋址的盒子,如果不支持位尋址,那么盒子中的內(nèi)容要8 位作為一個字節(jié)整體取出,支持位尋址的盒子中每一位可以單獨拿出來,將支持位尋址的盒子分成小盒子。在每一個小盒子中再次貼上位地址的標簽,以字節(jié)地址是20H 的盒子為例。這里可以順其自然的講出來一個字節(jié)地址內(nèi)存放8 個位,一個位地址內(nèi)存放1 位,即要么‘0’,要么‘1’。
對于外部RAM 和ROM,其字節(jié)地址與片內(nèi)RAM不同,因為空間大,所以需要的地址位數(shù)高,分別為0000H-FFFFH,這里只做部分存儲器盒子即可,盒子的制作過程類似。
一共制作256 個片內(nèi)RAM 盒子,一部分片外RAM 盒子和一部分ROM 盒子,將這些盒子分成三類,即片內(nèi)RAM類,外部RAM 類,ROM 類,通過存儲器盒子的制作過程,得出如下結(jié)論:在同一個類型中,不同的存儲器盒子具有不同的字節(jié)地址,不同的位具有不同的位地址,位地址和字節(jié)地址即使是相同的數(shù)代表的內(nèi)容也不同。在此基礎(chǔ)上,分析單片機匯編指令與存儲器盒子的關(guān)系。
數(shù)據(jù)轉(zhuǎn)移,即從哪個盒子提取內(nèi)容,將盒子里的內(nèi)容送到哪個盒子中去,如MOV A,R0 這條指令,假設(shè)RS1=0,RS0=0,將R0 的內(nèi)容取出,在這里進行操作,取出盒子中的內(nèi)容,而不是撕下標簽,盒子中的內(nèi)容是一個字節(jié),或者說是8 位二進制數(shù),將這個內(nèi)容,(8 位二進制數(shù))送到標簽為A 的盒子中。
從執(zhí)行過程中自然而然便會考慮,為什么從地址為00H 的盒子中取數(shù),而不是從08H 或其他的R0 中取數(shù),這里必須要查詢RS1 和RS0 的取值才能確定;R0 中的數(shù)原來不能單獨使用某一位,現(xiàn)在被轉(zhuǎn)移到ACC(或A)中,可以使用某一位了,因為ACC 寄存器有位地址;找R0 寄存器時用寄存器的名稱進行查找,不是用地址00H 查找的,所以叫寄存器尋址。如果語句改為MOV A,00H,那就是通過查找地址為00H 的盒子來取數(shù),這就是直接尋址了。
MOV A,@R0,這條指令中有個符號@,那么R0 中存儲的內(nèi)容不是要傳送的內(nèi)容,而是一個地址,將這個地址所對應(yīng)的內(nèi)容傳送到A 中,假設(shè)RS1=1,RS2=0,相應(yīng)組R0中存儲的內(nèi)容是32H,則存儲器盒子的使用方法如圖6 所示,這里同時可以講清楚寄存器間接尋址的尋址方式。
另外片內(nèi)RAM 中有些盒子是有位地址的,這些位地址支持位運算,以MOV 20H,C 為例,將程序狀態(tài)字寄存器PSW 中的進位標志位Cy 的值傳送到位地址為20H 的單元中,操作如圖7 所示。
匯編指令中,位尋址與直接尋址是極其容易混淆的兩種尋址方式,尤其是在字節(jié)地址為20H-2FH 的尋址空間中,地址就更加難以區(qū)分,通過存儲器盒子的轉(zhuǎn)移過程,可使學生更加清楚的了解位尋址的尋址方式。
以MOVX A,@DPTR 為例,這個指令實現(xiàn)兩個組的盒子之間的數(shù)據(jù)傳送,因此需要兩個組的盒子來進行操作,從前面的內(nèi)容知道,@說明DPTR 中的內(nèi)容是一個地址,而MOVX 中的X 說明這個地址指向片外RAM 區(qū),所以這條指令執(zhí)行時,需要在片外RAM 區(qū)找到相應(yīng)地址,提取內(nèi)容送到A 中,假設(shè)DPTR 中DPH 為03H,DPL 為25H,則執(zhí)行過程為找到片外RAM 地址為0325H 的指令盒子的內(nèi)容,將數(shù)據(jù)傳送到片內(nèi)A 中。
ROM 與RAM 類似,也是若干盒子,每個盒子也有自己的標簽,即地址,盒子中存儲的字節(jié)即8 位二進制數(shù)表達的意義是程序,某一個字節(jié)所對應(yīng)的程序都是固定的,比如存儲E8H 表示要執(zhí)行匯編語言為MOV A,R0 的操作,稱E8H 是機器語言,是編程的時候不易閱讀的,也不需要記憶,但卻是在ROM中存儲的,因此ROM中的數(shù)據(jù)表示的是程序,如指令MOV A,@R0;代碼E7H,ROM 中的數(shù)據(jù)可以傳送到累加器A 中,如指令MOVC A,@A+DPTR,A 和DPTR 的和對應(yīng)地址,MOVC 中的C 表示ROM 區(qū)數(shù)據(jù),所以可以將這個地址所對應(yīng)的ROM 數(shù)據(jù)傳送至累加器A 中,假設(shè)累加器A 中的內(nèi)容為03H,DPTR 值為1010H。執(zhí)行MOVC A,@A+DPTR 后,首先找到PC 指針為1010H+03H 及1013H處對應(yīng)的指令,將數(shù)據(jù)提取出來,轉(zhuǎn)移至A 中。
通過存儲器盒子的制作,可以讓學生將抽象的單片機指令以非常直觀具體的方式操作出來,每條指令對應(yīng)的儲器盒子的操作過程即是單片機指令內(nèi)部運行的過程,對學生學習單片機指令系統(tǒng)有重要作用,這種邊學習邊操作的模式,提升了學生的動手能力,激發(fā)了學生的探究意識,但本文只是以部分指令為例進行論述,對于111 條單片機指令的學習還需要任課老師逐一帶領(lǐng)學生學習。