《单片机基础》练习题及答案 下载本文

ADD MOV END

A, #01H R1, A ; 末位加 1 ; 补码存入R1

第4章 单片机汇编语言程序设计

(一)填空题

1. 假定A=40H,R1=23H,(40H)= 05H。执行以下两条指令后,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=5804?s

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=?X?Y???Y?Z? X&?1Y&F?1&Z

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

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=30696?s (二)编程题

1. 把长度为10H的字符串从内部RAM的输入缓冲区inbuf向位于外部RAM的输出缓冲

区outbuf传送,一直进行到遇见回车或整个字符串传送完毕,试编程实现。

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 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 JC NEG ;X为负,转至NEG RRC A RRC A JNC EVEN1 ; X为偶数,转至EVEN1 MOV A, X ADD A, Y ; X为正奇数,Z =X+Y SJMP RETULT

EVEN1: MOV A, X

ORL A, Y ; X为正偶数,Z =X∨Y SJMP RETULT

NEG: RRC A,

RRC A

JNC EVEN2 MOV A, X ANL A, Y ; X为负奇数,Z =X∧Y SJMP RETULT

EVEN2: MOV A, X

XRL A, Y ; X为负偶数,Z =X⊕Y

RETULT: MOV Z, A END

4. 把一个8位二进制数的各位用ASCII码表示之(例如,为0的位用30H表示,为1的

位用31H表示等)。该数存放在内部RAM的byte单元中。变换后得到的8个ASCII码存放在外部RAM以buf开始的存储单元中,试编程实现。

ORG 0030H

MOV DPTR, #buf MOV R0, # byte MOV R7, #08H MOV A, @ R0 CLR C

LOOP1 : RRC A

MOV R6, A JC ONE MOV A, #30H SJMP LOOP2

ONE: MOV A, #31H LOOP2 : MOVX @DPTR, A

INC DPTR MOV A, R6

DJNZ R7, LOOP1

225. 编程实现运算式c?a?b。假定a、b、c 3个数分别存放于内部RAM的DA、DB、

DC单元中,另有平方运算子程序SQR供调用。

ORG 0030H MOV A, DA PUSH ACC ACALL SQR POP ACC

MOV DC, A MOV A, DB PUSH ACC ACALL SQR POP ACC ADD A, DC MOV DC, A

SQR: POP ACC MOV B, A MUL AB PUSH ACC RET END

6. 试编程实现两个ASCII码字符串是否相等。字符串的长度在内部RAM 41H单元中,第

1个字符串的首地址为42H,第2个字符串的首地址为52H。如果两个字符串相等,则置内部RAM 40H单元为00H;否则置40H单元为FFH。

ORG 0030H MOV R0, #42H MOV R1, #52H MOV R7, 41H

LOOP: MOV A, @R0

MOV 30H, @R1 CJNE A, 30H, LK INC R0 INC R1

DJNZ R7, LOOP MOV 40H, #00H SJMP DD

LK: MOV 40H, #0FFH