微機實驗:程序設計實驗
實驗目的
進一步熟悉指令系統,提高編程能力。
(一)分支程序
實驗內容:
????????? 2x??????????? x>0
計算y=? 2????????????? x=0?? (-128≤x≤+63)
????????? x/2(取整)????? x<0
假設x存于R0,Y存于片內RAM 30H。
參考程序:
ORG? 1080H |
||
MOV? A,R0 |
||
JZ ?ZERO |
;x=0,轉 | |
ANL ?A,#80H |
;判符號位 | |
JZ? P0 |
;x>0,轉 | |
? |
SJMP? M0 |
;x<0,轉 |
ZERO: |
MOV? A,#02H |
;y=2 |
SJMP? STORE |
||
?? P0: |
MOV? A,R0 |
|
RL? A |
;y=2x | |
SJMP? STORE |
||
???M0: |
MOV? A,R0 |
|
SETB? C |
;y=x/2 | |
RRC? A |
||
STORE: |
MOV? 30H,A |
|
SJMP $ |
實驗要求:
1、根據程序畫出流程圖。
2、計算偏移量。
3、分別給R0 置入正數、0、負數,運行程序,檢查結果。
思考題:
對乘2或除2的運算可用左移一位或右移一位來完成。利用該法,編寫R0×4,R0×10,R0÷4的程序模塊。
(二)循環程序
實驗內容:
某班共10名學生,某科成績已以16進制形式存放在片外RAM,首址為SOUR的連續單元內。要求統計成績優秀(≥90分)和不及格(<60分)的人數,分別存放于片內RAM的30H和31H單元。
參考程序:
ORG ?10A0H |
||
? |
MOV ?30H,#00H |
;清0 |
MOV ?31H,#00H |
||
MOV? R2,#0AH |
;人數置R2 | |
MOV ?DPTR,#SOUR |
;DPTR指向成績表? | |
?LOP: |
MOVX? A,@DPTR |
;讀成績 |
CJNE? A,#90,LOP1 |
;和90分比較 | |
?LOP1: |
JNC? NEX1 |
;≥90,轉 |
CJNE? A,#60,LOP2 |
;和60分比較 | |
?LOP2: |
JNC? NEX2 |
;若≥60,轉 |
?? |
INC? 31H |
;<60,存31H |
SJMP? NEX2 |
||
NEX1: |
INC? 30H |
;≥90,存30H |
NEX2: |
INC? DPTR |
;修改成績指針 |
DJNZ? R2,LOP |
;未統計完,轉 | |
SJMP? $ |
||
ORG? 10D0H |
||
SOUR: |
64H,32H,50H,4FH, |
;學生成績表 |
5AH,3CH,60H,5FH, |
||
3FH,42H |
實驗要求
1、根據程序畫出流程框圖。
2、輸入程序。然后運行,檢查結果
(三)散轉程序
實驗內容:
所謂散轉,就是根據某種輸入或運算的結果,分別轉向各個處理程序。例如,微機化儀表的設計中,需要根據不同的鍵號(存于R2,值0,1,2,……)分別轉向不同的處理程序prgo,prg1,prg2……。
參考程序:
ORG? 10E0H |
||
MOV? DPTR,#TB |
;DPTR指向轉移表首址 | |
MOV? A,R2 |
;取鍵號 | |
ADD? A,R2 |
||
ADD? A,R2 |
||
JMP ±A+DPTR ┇ ┇ |
;轉移目標地址 =TB=R2×3 | |
ORG? 1100H |
||
? TB: |
LJMP? prog0 |
;處理程序的轉移表 |
LJMP? prog1 |
||
LJMP? prog2 |
實驗步驟:
1、輸入程序? 2、假設R2為某值并輸入之,單步運行程序,檢查結果。
思考題:
1、上述程序中,鍵號R2的限制范圍是多少?
2、若將轉移表中的LJMP改為AJMP,上述程序將如何修改?
(四)數制轉換
單片機系統內部運算用二進制,而輸入輸出常用十進制,以符合日常習慣,因此,數制轉換是儀表設計中常用的程序之一。
實驗內容1:
把R3中的8位二進制整數轉換為壓縮BCD,放在R4R5中。
根據? A=b7×27+b6×26+b5×25+……+b1×21+b0
=(((b7×2+b6)×2+b5)×2+b4)×2+……+b1)×2+b0
只要反復運算B×2+b,就能把二進制整數轉換為十進制。
參考子程序:
ORG ?1200H |
||
?IBTD: |
CLR ?A |
|
MOV ?R4, A |
;0→R4R5 | |
MOV ?R5, A |
||
MOV ?R7, #08H |
||
?LOP: |
CLR ?C |
|
MOV ?A, R3 |
||
RLC ?A |
;取bi,送C | |
MOV ?R3, A |
||
MOV ?A, R5 |
;(R4R5)×2+C→R4R5 | |
ADDC ?A, R5 |
||
DA ?A |
||
MOV ?R5, A |
||
MOV ?A, R4 |
||
ADDC ?A, R4 |
||
DA ?A |
||
MOV ?R4, A |
||
DJNZ ?R7, LOP |
;循環8次 | |
RET |
實驗內容2:
把R3中的二進制小數轉換為非壓縮BCD碼,存放在R0指向的字節中(假設精度要求為小數二位)。
一個二進制小數B的十進制值為
?????? B=a-1×10-1+a-2×10-2+a-3×10-3+……
式中,a-1、a-2、a-3……分別為十進制小數的第1、2、3……位,若兩邊乘以10,得
10×B=a-1+a-2×10-1+a-3×10-2+…
???????????????????? ??????B1
顯然,乘積的整數部分就是十進制小數的最高a-1,而且也必定是非壓縮a-1的BCD碼。若再將B1乘以10,得
?10×B1=a-2+a-3×10-1+a-4×10-2+…
該乘積的整數部分就是十進制小數的第二位的BCD碼。
參考子程序
ORG ?1220H |
||
PBTD: |
MOV ?A, R3 |
|
MOV ?B, #0AH |
||
MUL ?A, B |
;乘10 | |
XCH ?A, B |
;乘積整數存A,小數存B | |
MOV ?@R0, A |
;存入十進制小數最高位 | |
INC? R0 |
;修改指針 | |
MOV ?A, #0AH |
||
MUL? A, B |
;再乘10 | |
MOV ?@R0, A |
;存十進制小數第二位 | |
RET |
實驗要求:
1、輸入程序。
2、輸入原始數據(例如,整數FFH、80H,小數80H、40H、20H等),單步運行上述程序,觀察運行結果正確否?
評論