微机实验:程序设计实验
实验目的
进一步熟悉指令系统,提高编程能力。
(一)分支程序
实验内容:
????????? 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等),单步运行上述程序,观察运行结果正确否?
评论