《分支程序設(shè)計實驗》由會員分享,可在線閱讀,更多相關(guān)《分支程序設(shè)計實驗(14頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、
《微機實驗》報告
實驗名稱 分支程序設(shè)計實驗
專業(yè)班級 xxxxx 姓名xxxxx 學(xué)號xxxxxx
聯(lián)系方式 xxxxxxxxxxxxxxxxxxxxxxx
一、 任務(wù)要求
1. 設(shè)有8bits符號數(shù)X存于外部RAM單元,按以下方式計算后的結(jié)果Y也存于外部RAM單元,請按要求編寫程序。
X2 當X≥40
Y= X/2 當20〈X〈40
/X =當X≤20 < <
2. 利用51系列單片機
2、設(shè)計一個24小時制電子時鐘,電子時鐘的時、分、秒數(shù)值分別通過P0、P1、P2端口輸出(以壓縮BCD碼的形式)。 P3.0為低電平時開始計時,為高電平時停止計時。
提高部分(選做):
a. 實現(xiàn)4位十進制加、減1計數(shù),千位、百位由P1口輸出;十位、個位由P2口輸出。利用P3.7狀態(tài)選擇加、減計數(shù)方式。
b. 利用P3口低四位狀態(tài)控制開始和停止計數(shù),控制方式自定。
二、 設(shè)計思路
任務(wù)1:
機器內(nèi)存入的數(shù)默認為無符號數(shù),所以應(yīng)該先判斷正負性。如果是負數(shù)則直接歸到取反區(qū)間;如果是正數(shù),則與20,40進行大小比較,即和20,40分別做減法,然后根據(jù)比較結(jié)果歸到各個區(qū)間。
3、
任務(wù)2:
先將R0~R2和P0~P2清零,開始先判斷控制位P3.0是否為0,當P3.0=1時原地踏步重復(fù)判斷,當P3.0=0時開始計時。計時開始,進行秒鐘R0計數(shù),每次計數(shù)完成用BCD碼子程序轉(zhuǎn)換,然后判斷計數(shù)后R0值是否到60,若R0的值不足60,就直接輸出給P2,若R0的值為60,就把R0和P2進行清零后,開始分鐘計數(shù)部分。同理,每次分鐘計數(shù)完之后用BCD碼子程序轉(zhuǎn)換,然后判斷計數(shù)后R1的值是否為60,若不為60,就直接輸出給P1,若R1的值為60,就把R1和P1清零后開始時鐘計數(shù)部分。時鐘計數(shù)完后同樣用BCD碼子程序轉(zhuǎn)換,然后判斷計數(shù)后的R2的值是否為24,若不為
4、24,就直接輸出給P0,若R2為24,就吧R2和P0清零后直接跳出計數(shù)部分,從判斷P3.0部分再開始.每兩次計數(shù)輸出之間穿插一個1s的延時程序。就可以達到時鐘的功能。
三、 資源分配
1.分支程序:
數(shù)據(jù)指針DPTR:對片外RAM進行讀寫操作
2000H:存放8bits符號數(shù)X
2010H:存放結(jié)果Y(取反后的數(shù),或者平方后 的高8位,或者除法后的商)
2011H:存放結(jié)果Y(平方后的低8位,或者除 法后的余數(shù))
5、2.時鐘程序:
R0、R1、R2:分別進行秒鐘,分鐘,時鐘的計數(shù)
P2、P1、P0:分別輸出秒鐘,分鐘,時鐘
P3.0:是否計數(shù)的控制位
R3、R4、R5:為1s延時程序指定循環(huán)次數(shù)
B:BCD碼轉(zhuǎn)換子程序的操作數(shù)
四、 流程圖
1, 分支程序設(shè)計
2, 時鐘程序
五、 源代碼 (含文件頭說明、資源使用說明、語句行注釋)
任務(wù)一:
File name : first.
6、asm
Description : 多向分支程序設(shè)計
Date : 2013.10.15
Designed by : 陳欣雨
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN: MOV DPTR,#2000H
MOV A,#10
MOVX @DPTR,A ;存數(shù)
MOV B,0 ;寄存器B清零
MOVX A,@DPTR ;從R0中取出數(shù)x
JNB ACC.7,COMP
7、1 ;判斷符號位,符號位為0時轉(zhuǎn)到COMP1
LP3: CPL A ;對x取反
SJMP STORE
COMP1: CJNE A,#20,COMP2 ;A≠20時,轉(zhuǎn)到COMP2
SJMP LP3 ;A=20時,轉(zhuǎn)到LP3取反
COMP2: JC LP3 ;C=1,A<20,轉(zhuǎn)到LP3取反
CJNE A,#40,COMP3 ;C=0,A>20.當A≠40時,轉(zhuǎn)到COMP3
LP1: MOV B,A ;A=40時,給B賦值為A
MUL AB ;計算x平方
SJMP STORE
C
8、OMP3: JNC LP1 ;C=0,A>40,轉(zhuǎn)到LP1計算x平方
MOV B,#02H ;C=1,A<40,賦值B=2
DIV AB ;計算x除以2
STORE: MOV DPTR,#2010H
MOVX @DPTR,A ;存數(shù):
INC DPTR ;對于平方,高位在前地位在后
MOV A,B ;對于除法,商在前余數(shù)在后
MOVX @DPTR,A
SJMP $
END
任務(wù)二:
ORG
9、 0000H
SJMP START
ORG 0030H
START: MOV SP,#40H
MOV P1,#0
MOV R3,#0 ;設(shè)定R3初值為0,用R3保存分鐘數(shù)
MOV R4,#0 ;設(shè)定R4初值為0,用R4保存小時數(shù)
MOV R0,#60 ;設(shè)定內(nèi)循環(huán)次數(shù)為60
MOV R1,#60 ;設(shè)定中循環(huán)次數(shù)為60
MOV R2,#24 ;設(shè)定外循環(huán)次數(shù)為24
CLR A
NEXT: JNB P3.0,DONE ;如果P3.0等于0,則結(jié)束計數(shù)
ADD A,#1 ;BCD碼加1
10、計數(shù)
DA A ;對A進行修正
MOV P2,A ;顯示計數(shù)
DJNZ R0,NEXT ;R0<----R0-1,R0不等于零,跳到NEXT繼續(xù)循環(huán)
MOV A,R3 ;將分鐘數(shù)賦給A
ADD A,#1 ;分鐘數(shù)加1
DA A
MOV R3,A ;分鐘數(shù)用R3保存
MOV P1,A ;顯示計數(shù)
CLR A
MOV R0,#60 ;重置內(nèi)循環(huán)次數(shù)為60
DJNZ R1,NEXT ;R1減一,若R1不為0,跳到最內(nèi)層循環(huán)入口處繼續(xù)循環(huán)
MOV R3,#0 ;分鐘數(shù)滿六十,
11、小時開始計數(shù),同時將分鐘數(shù)R3清零
MOV A,R4 ;將小時數(shù)賦給A
ADD A,#1 ;小時數(shù)加一
DA A
MOV R4,A ;用R4保存小時數(shù)
MOV P0,A
MOV R0,#60 ;重置內(nèi)循環(huán)數(shù)為六十
MOV R1,#60 ;重置次循環(huán)數(shù)為六十
DJNZ R2,NEXT ;R2減一,若R2不為0,跳到最內(nèi)層循環(huán)入口處繼續(xù)循環(huán)
DONE: SJMP $
END
程序測試方法與結(jié)果、軟件性能分析
實驗一:
(1) 取X=5,則最后結(jié)果應(yīng)為FA。編譯結(jié)果
12、如下圖:
(2) 取X=36,則最后結(jié)果應(yīng)為12。編譯結(jié)果如下圖:
(3) 取X=60,則最后結(jié)果應(yīng)為3600,即(2010H)=10H,(2011H)=0EH。編譯結(jié)果如下圖:
實驗二:
(1) P3.0設(shè)為低電平,開始計時,達60秒時,分從0變?yōu)?
分增加1,秒清零
P3.0置1則計數(shù)停止
六、 心得與體會
做分支程序的設(shè)計一定需要一個清醒的頭腦,必須在開始寫程序之前想好在什么地方進行跳轉(zhuǎn),什么時候跳轉(zhuǎn)回來等等。在做第二個實驗時,則需要很清楚循環(huán)的次數(shù)以及數(shù)據(jù)的存儲,不能混淆。總而言之,在寫完這兩個程序之后,我覺得,寫復(fù)雜
13、一點的程序必須有足夠的經(jīng)驗,這也就要求我們多鍛煉,多寫程序,才能夠有一個清晰的思路,不至于在編寫過程中陷入混亂。
七、 思考題
1.實現(xiàn)多分支結(jié)構(gòu)程序的主要方法有哪些?舉例說明。
答:⑴當分支比較少的時候,可以直接采用條件轉(zhuǎn)移指令,例如:
JB P3.7,SUBJS;P3.7為1時,跳到SUBJS進行減1計數(shù);P3.7為0時,進行ADDJS加1計數(shù)
ADDJS: MOV A,P2
┇
┇
SUBJS: CLR C
14、┇
┇
⑵當分支比較多的時候,可以采用分支表法,常用的分支表法有三種:分支地址表,轉(zhuǎn)移指令表,分支偏移量表。
①分支地址表法:
MOV DPTR,#BRATAB ;取表首地址
MOV A,R3
ADD A,R3 ;A←R3*2
JNC NADD
INC DPH ;R3*2的進位加到DPH
NADD: MOV R4,A
15、 ;暫存A
MOVC A,@A+DPTR ;取分支地址高8位
XCH A,R4
INC A
MOVC A,@A+DPTR ;取分支地址低8位
MOV DPL,A ;分支地址低8位送DPL
MOV DPH,R4 ;分支地址高8位送DPH
CLR A
JMP @A+DPTR ;轉(zhuǎn)相應(yīng)
16、分支程序
BRATAB: DW SUBR0 ;分支地址表
DW SUBR1
┇
DW SUBR7
②轉(zhuǎn)移指令表法:
MOV DPTR,#JMPTAB ;取表首地址
MOV A,R3
ADD A,R3 ;A←R32
JNC NADD
INC DPH ;有進位加到DPH
NADD: JMP
17、@A+DPTR ;轉(zhuǎn)相應(yīng)分支程序
JMPTAB: AJMP SUBR0 ;轉(zhuǎn)移指令表
AJMP SUBR1
┇
AJMP SUBR7
③地址偏移量表法:
MOV DPTR,#DIATAB ;取表首地址
MOV A,R3 ;表的序號數(shù)送A
MOVC A,@A+DPTR ;查表
JMP @A+DPTR
18、 ;轉(zhuǎn)相應(yīng)分支程序
DISTAB: DB SUBR0-DISTAB ;地址偏移量表
DB SUBR1-DISTAB
┇
DB SUBR7-DISTAB
SUBR0: ┇
SUBR1: ┇
2. 在編程上,十進制加1計數(shù)器與十六進制加1計數(shù)器的區(qū)別是什么?怎樣用十進制加法指令實現(xiàn)減1計數(shù)?
答:十六進制加1計數(shù)器可以直接對計數(shù)器進行加1的操作,相當于單字節(jié)或者多字節(jié)的加法運算,其中被加數(shù)為當前計數(shù)器值,加數(shù)始終為1;但是十進制加1計數(shù)器不能直接對計數(shù)器直接進行加1操作,而必須在對加1操作后緊跟一條DA A指令對其進行二—十進制修正才能實現(xiàn)。
用十進制加法進行減1計數(shù)時,應(yīng)講計數(shù)器當前值與1的十進制補碼99H進行想加,然后用DA A指令進行二—十進制修正,從而實現(xiàn)十進制減1計數(shù)功能。