微机实验:程序设计实验
实验目的
进一步熟悉指令系统,提高编程能力。
(一)分支程序
实验内容:
2x x>0
计算y= 2 x=0 (-128≤x≤+63)
x/2(取整) x<0
假设x存于R0,Y存于片内RAM30H。
参考程序:
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 |
|
ADDCA, 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等),单步运行上述程序,观察运行结果正确否?
评论
查看更多