《分支程序設(shè)計實驗》由會員分享,可在線閱讀,更多相關(guān)《分支程序設(shè)計實驗(12頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、 《單片機實驗》報告
實驗名稱 分支程序設(shè)計實驗
指導(dǎo)教師 劉冬生
專業(yè)班級 電子1103班
姓名 XXXXXX
學(xué)號 XXXXXXXXXXX
聯(lián)系方式 XXXXXXXXXXX
一、任務(wù)要求
熟練掌握KeilC環(huán)境下匯編語言程序的調(diào)試方法,加深對匯編語言指令、機器碼、尋址方式等基本內(nèi)容的理解,掌握分支程序和簡單程序的
2、設(shè)計與調(diào)試方法,了解并行IO口的使用
1. 設(shè)有8bits符號數(shù)X存于外部RAM單元,按以下方式計算后的結(jié)果Y也存于外部RAM單元,請按要求編寫程序。
2. 利用51系列單片機設(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ù),控制方式自定。
思考題:
1.實現(xiàn)多分支結(jié)
3、構(gòu)程序的主要方法有哪些?舉例說明。
2.在編程上,十進制加1計數(shù)器與十六進制加1計數(shù)器的區(qū)別是什么?怎樣用十進制加法指令實現(xiàn)減1計數(shù)?
二、設(shè)計思路
1.分段函數(shù)設(shè)計?
第一個任務(wù)相當(dāng)于一個分段函數(shù)程序,根據(jù)變量X的值所處的區(qū)間進行相應(yīng)的計算??衫帽容^轉(zhuǎn)移指令CJNE來判斷X是否等于臨界值20、40,若不等,再根據(jù)執(zhí)行CJNE指令后的進位位CY的值來判斷X與臨界值的的大小關(guān)系,易知CY=0則X大于臨界值,CY=1則X小于臨界值;如此,再進行相應(yīng)的計算。另外若乘方運算結(jié)果大于255,高八位與低八位應(yīng)分開存儲;本次除法采用右移一位來處理,未考慮余數(shù)。
2.?24小時制時鐘程序?
首先
4、構(gòu)建一個三重循環(huán)實現(xiàn)“一秒延時”,循環(huán)體利用NOP指令(單字節(jié)指令,1μs)經(jīng)多次循環(huán)達到延時一秒的效果。再利用已經(jīng)構(gòu)建好的“一秒延時”部分,設(shè)計計時系統(tǒng):秒(0-59)、分(0-59)、時(0-23)。需要注意的是,在小時、分、秒達到59時,下一次應(yīng)該為零。程序運行時修改P3.0的值可以實現(xiàn)暫停和繼續(xù)的功能。
三、資源分配
1.分段函數(shù)?
?? ?假設(shè)該8位無符號數(shù)的地址2000H分配給它,把片外地址2001H和2002H分配給經(jīng)分段函數(shù)計算得到的結(jié)果Y。按位取反計算結(jié)果存于2001H單元,乘方計算中結(jié)果的高、低八位分開存儲于2001H-2002H單元,除法運算結(jié)果放在2001H中。
5、寄存器A,B存放在乘除運算中所得的中間結(jié)果。?
????
???2.二十四小時制時鐘?
??? 工作寄存器R0、R1、R2分別用于秒、分、時循環(huán)次數(shù)的計數(shù),R5-R7用于“一秒延時”循環(huán)中的循環(huán)次數(shù)設(shè)定。秒、分、時數(shù)值分別由P2、P1、P0端口輸出。
四、流程圖
1.分段函數(shù)
開始
將C置零取出外部數(shù)據(jù)
是否大于20
取反并存儲結(jié)果
是否小于40
平方并存儲結(jié)果
除以2并存儲結(jié)果
結(jié)束
否
否
是
是
?2.二十四小時制時鐘
開始
P3.0=1?
等待
端口初始化,輸出端口置0;計數(shù)R0、R1、R2置1
延時1秒,P2←R2,R2加
6、1,并轉(zhuǎn)化為十進制
R6=60H?
R2置1,P2置0,P1←R1 R1加1,并轉(zhuǎn)化為十進制
R1=60H?
R2、R1置1,P2、P1置0,
P0←R0, R0加1,并轉(zhuǎn)化為十進制
R0=24H?
是
否
否
否
否
是
是
是
五、源代碼 (含文件頭說明、資源使用說明、語句行注釋)
1.分段函數(shù)?
clr c ; 清零
mov dptr ,#2000h ; 取外部數(shù)據(jù)
movx a ,@dptr
// mov a ,#1h
cjne a,#14h ,cmp20 ; 與20比較大小
qufa
7、n: cpl a ;
inc dptr
movx @dptr ,a
sjmp jieshu
cmp20: jc qufan
cjne a ,#28h , cmp40 ; 與40比較大小
sq: mov r7, a ; 平方
mov b , r7
mul ab
inc dptr
movx @dptr ,a
mov a, b
inc dptr
movx @dptr ,a
sjmp jieshu
cmp40: jnc sq
chu2: rr a ; 除以2(右移一
8、位)
inc dptr
movx @dptr ,a
sjmp jieshu
jieshu: nop
end
?2.二十四小時制時鐘
start: mov r0,#01h ; 寄存器初始化
mov r1,#01h
mov r2,#01h
mov p0 ,#00h ; 端口初始化
mov p1 ,#00h
mov p2 ,#00h
mov a ,#0
// setb p3.0 ; 設(shè)置、判斷p3.0
clr p3.0
jb p3.0 ,$
onesec: mov r7
9、 , #10 ; 1秒延時
del1: mov r6 ,#200
nop
del2: mov r5,#248
del3: djnz r5 ,del3
djnz r6 ,del2
djnz r7 ,del1
mov p2 ,r2 ; 把秒數(shù)送入p2
mov a,r2
add a,#01h
da a
mov r2 ,a
cjne r2 ,#60h ,onesec ; 判斷r2是否計到60,跳轉(zhuǎn)
onemin: mov r2 ,#01h ; 把r2,p2初始化,開始分鐘計數(shù)
10、mov p2 ,#00h
mov p1 ,r1
mov a ,r1
add a ,#01h
da a
mov r1 ,a
cjne r1 ,#60h, onesec ; 判斷r1是否計到60,跳轉(zhuǎn)
hour: mov r2 ,#01h ; 把r2,p2,r1,p1初始化,開始小時計數(shù)
mov p2 ,#00h
mov r1 ,#01h
mov p1 ,#00h
mov p0 ,r0
mov a ,r0
add a ,#01h
da a
mov r0 ,a
cjne r0 ,
11、#24h ,onesec ; 判斷r0是否計到24,跳轉(zhuǎn)
sjmp start
end
六、程序測試方法與結(jié)果、軟件性能分析
1.分段函數(shù)
X=01H
X=1EH
X=31H
功能分析:該程序可正常執(zhí)行要求的3項功能
2.二十四小時制時鐘
功能分析:該程序運行后可按正確的二十四小時制時鐘進行計時,程序功能完整可靠。
【思考題】?
●實現(xiàn)多分支結(jié)構(gòu)程序的主要方法有哪些?舉例說明。?
答:一是利用條件轉(zhuǎn)移指令實現(xiàn),如DJNZ,JNC等等,二是利用分支表來實現(xiàn),如分支地址
表、轉(zhuǎn)移指令表、地址偏移量表。??
●在編程上,十進制加1計數(shù)器與十六進制加1計數(shù)器的區(qū)別是什么?怎樣用十進制加法指令實現(xiàn)減1計數(shù)?
答:十進制加一后需要在計算結(jié)果的基礎(chǔ)上進行修正,運用DA指令,而十六進制加一指令
所得結(jié)果即為最終結(jié)果,無需進行修正。??
用十進制加法指令實現(xiàn)減1計數(shù),可通過以下代碼實現(xiàn):??????????
????????????ADD?A?,?#63H?????????????
DA??A?