内容发布更新时间 : 2024/12/24 8:39:06星期一 下面是文章的全部内容请认真阅读。
完美WORD格式.整理
MOV R1, #04H ; 4个单元 LOOP: MOV @R0, #0F0H ; 写入 INC R0
DJNZ R1, LOOP ; 循环4次 END
4. 在m和m+1单元中存有两个BCD数,将他们合并到m单元中,编写程序完成。 ORG 0030H MOV R0, #m
MOV A, @R0 ; 将m单元中的BCD数送入累加器A ANL A, #0FH ; 把m单元的高4位清0
SWAP A ; 将m单元中的BCD数移入高4位 MOV @R0, A ; m单元高4位为BCD数,低4位为0 INC R0 ; 指向m+1单元
MOV A, @R0 ; 将m+1单元中的BCD数送入累加器A ANL A, #0FH ; 把m+1单元的高4位清0 DEC R0 ; 指向m单元
ORL A, @R0 ; 将和m+1单元和m单元内容合并 MOV @R0, A ; 合并后结果送m单元 END
5. 将内部RAM中从data单元开始的10个无符号数相加,其和送sum单元。假定相加结果小于255。编写程序完成。 ORG 0030H
MOV R0, #10 ; 给 R0 置计数器初值 MOV R1, # data ; 数据块首址送R1 CLR A ; A清零 LOOP: ADD A, @R1 ; 加一个数
INC R1 ; 修改地址,指向下一个数 DJNZ R0, LOOP ; R0 减 1,不为零循环 MOV sum, A ; 存 10 个数相加和 END
6. 假定8位二进制带符号数存于R0中,要求编写一个求补(取反)程序,所得补码放入R1中。
分析:对存于R0中的二进制带符号数,如果是正数,则将其变成绝对值相等的负数(用补码表示);如果是负数(用补码表示),则将其变成绝对值相等的正数。 ORG 0030H
MOV A, R0 ; 将带符号数送入A CPL A
ADD A, #01H ; 末位加 1 MOV R1, A ; 补码存入R1 END
第4章 单片机汇编语言程序设计
(一)填空题 1. 假定A=40H,R1=23H,(40H)= 05H。执行以下两条指令后,
. 专业资料分享 .
完美WORD格式.整理
A=(25H),R1=(40H),(40H)=(03H)。 XCH A, R1 ; A=23H,R1=40H
XCHD A, @R1 ; A=20H,(40H)=03H
2. 假定80C51的晶振频率为6 MHz,执行下列程序后,在P1.1引脚产生的方波宽度为(5.804ms)
START: SETB P1.1 ; P1.1置1(1周期)
DL: MOV 30H, #03H ; 30H置初值(1周期) DL0: MOV 31H, #0F0H ; 31H置初值(1周期)
DL1: DJNZ 31H, DL1 ; 31H减1,不为0重复执行(2周期) DJNZ 30H, DL0 ; 30H减1,不为0转DL0(2周期) CPL P1.1 ; P1.1 取反(1 周期) SJMP DL ; 转DL(2 周期)
方波宽度={[(2*15*16+2+1)*3]+[(2*15*16+2+1)*3+1+2+1]}*2=5804s
3. 下列程序中,X、Y 和Z 为输入的8 位无符号二进制数,F 为输出的逻辑运 算结果。试画出该程序所模拟的组合逻辑电路。 MOV A, X ANL A, Y MOV R1, A MOV A, Y XRL A, Z CPL A
ORL A, R1 MOV F, A
F=
& & &
XYYZ
1 1
X Y Z F
4. 分析下列跳转程序,程序中A 与30H 单元中的数都是符号数,说明当(A= (30H))时转向LOOP1,当(A>(30H))时转向LOOP2,当(A<(30H)) 时转向LOOP3。
MOV R0, A ; R0←A ANL A, #80H
JNZ NEG ; A<0,转NEG MOV A, 30H ANL A, #80H
. 专业资料分享 .
完美WORD格式.整理
JNZ LOOP2 ; A≥0,(30H) <0,转LOOP2 SJMP COMP ; A≥0,(30H)≥0,转COMP NEG: MOV A, 30H ANL A, #80H
JZ LOOP3 ; A<0,(30H) ≥0,转LOOP3 COMP: MOV A, R0
CJNE A, 30H, NEXT ; A≠(30H),转NEXT SJMP LOOP1 ; A=(30H),转LOOP1 NEXT: JNC LOOP2 ; A>(30H),转LOOP2 JC LOOP3 ; A<(30H),转LOOP3
综上分析可知,当A=(30H)时转向LOOP1,A>(30H)时转向LOOP2,A<(30H)时转向LOOP3。
5. 假定80C51的晶振频率为6 MHz,下列程序的执行时间为(30.696ms)。已知程序中前2条指令机器周期数为1,后4条指令机器周期数为2。 MOV R3, #15 1周期 DL1: MOV R4, #255 1周期 DL2: MOV P1, R3 2周期 DJNZ R4, DL2 2周期 DJNZ R3, DL1 2周期 RET 2周期
执行时间:T={[(2+2)*255+2+1]*15+2+1}*2=30696s
(二)编程题
1. 把长度为10H的字符串从内部RAM的输入缓冲区inbuf向位于外部RAM的输出缓冲区outbuf传送,一直进行到遇见回车或整个字符串传送完毕,试编程实现。
11
ORG 0030H
MOV R0, #inbuf MOV DPTR, #outbuf MOV R4, #10H
LOOP: MOV A, @R0 ; 从内部RAM取数 CJNE A,#0DH, LL ; 是否为回车符CR
SJMP STOP ; 是回车符,则转STOP,停止传送 LL: MOVX @ DPTR, A ; 不是回车符,则传送到外部RAM INC R0 INC DPTR
DJNZ R4, LOOP ; 沒传送完则循环 STOP: SJMP $
2. 内部RAM从list单元开始存放一正数表,表中之数作无序排列,并以﹣1作结束标志。编程实现找出表中最小数。 分析:从list+1单元开始判断其中的数是否为-1,将比较得到的小数放入累加器A
ORG 0030H MOV R0, #list
. 专业资料分享 .
完美WORD格式.整理
MOV A, @R0 ;取第一个正数
LOOP: INC R0 ;指向下一个正数 MOV 30H, @R0
CJNE A, 30H, CHK ;前一个数与后一个数比较 CHK: JC LOOP1 ;前一个数小,则转LOOP1 MOV A, 30H ;前一个数大,取后一个数 LOOP1: XCH A, 30H
CJNE A, #0FFH, LOOP ;判断后一个数是否为-1 XCH A, 30H ;取最小数 SJMP $
3. 内部RAM的X,Y 单元中各存放一个带符号的数,试编程实现按如下条件进行的运算,并将结果存入Z单元中。 若X为正奇数,Z =X+Y; 若X为正偶数,Z =X∨Y; 若X为负奇数,Z =X∧Y; 若X为负偶数,Z =X⊕Y。
分析:正数:第7位为0,负数:第7位为1;奇数:第0位为1,偶数:第0位为0 方法1:利用ANL指令判断正负、奇偶 ORG 0030H MOV A, X
ANL A, #80H ; 判断X正负 JNZ NEG ; 若X为负,转NEG MOV A, X ; X为正 ANL A, #01H ; 判断X奇偶
JZ EVEN1 ; 若X为偶数,转EVEN1 MOV A, X
ADD A, Y ; 若X为正奇数,Z=X+Y SJMP RESULT EVEN1: MOV A, X
ORL A, Y ; 若X为正偶数,Z=X∨Y SJMP RESULT
NEG: MOV A, X ; X为负
ANL A, #01H ; 判断X奇偶
JZ EVEN2 ; 若X为偶数,转EVEN2 MOV A, X
ANL A, Y ; 若X为负奇数,Z=X∧Y SJMP RESULT
EVEN2: MOV A, X ; 若X为负偶数,Z=X⊕Y XRL A, Y
RESULT: MOV Z, A
方法2:RL指令将符号位移入CY判断正负,RR指令将最低位移入CY判断奇偶 MOV A, X CLR C RLC A
. 专业资料分享 .