林立张俊亮版单片机原理及应用第三章答案
- 格式:pdf
- 大小:146.61 KB
- 文档页数:5
第三章习题
1.MCS-51单片机有哪几种寻址方式?适用于什么地址空间? 答: MCS-51单片机共有7种寻址方式:直接寻址、寄存器寻址、寄存器间接
寻址、立即寻址、变址寻址、位寻址和相对寻址。
直接寻址:操作数所在存储单元地址由指令直接给出,仅限于在片内RAM
中寻址。
寄存器寻址:指令中以通用寄存器的形式表示操作数。通用寄存器这里特指:A、B、DPTR、R0-R7、CY。操作数在编码指定的寄存器中,适用于片内00H
至1FH的32个字节,用R0,…,R7表示。注意B寄存器仅在乘法和除法指令中属
于寄存器寻址。
寄存器间接寻址:指令指出某一个寄存器的内容作为操作数地址,操作数
地址在编码指定的寄存器中,适用于片内RAM的全部空间,它是一种二次寻找操作数地址的寻址方式。
立即寻址:操作数在指令中直接给出,并与操作码的机器码一起存放在程
序存储器中,程序执行时可以立即得到,而不需要另外寻找。适用于用8位二进
制立即数对片内RAM所有地址单元赋值,也可用16位二进制立即数对DPTR赋值,
有些编译器中也可用十进制表示。 变址寻址:以DPTR或PC作为基址寄存器,以累加器A作为变址寄存器,
将基址寄存器与变址寄存器的内容相加形成操作数的实际地址的一种寻址方式,
变址寻址方式适用于程序存储器ROM。
位寻址:指令中直接给出操作数所在单元的位地址,适用于片内RAM里的
部分存储单元和某些特殊功能寄存器。 相对寻址:为相对转移指令而设,以PC内容为基址,指令中直接给出转
移的相对偏移量,其转移目标只能形成-128至+127字节范围内的跳转。
2.MCS-51单片机的PSW程序状态字中无ZERO(零)标志位,怎样判断某内部数据
单元的内容是否为零? 答: 由于MCS-51单片机的PSW程序状态字中无ZERO(零)标志位,无法直接进
行判断,则需要将PSW中的数字编程送到A累加器中,如
MOV A,PSW
再判断A中的数字是否为零来确定其值是否为零。
3.编程将内部RAM的20H--30H单元内容清零。
答: 设一个片内RAM指针R0,先指向首地址20H,通过累加器A清零,然后采
用间接寻址方式依次将A中的零值传送到指针所指的片内RAM单元中的20H,每
传送一个字节,地址指针加1,直到达到地址为30H为止。
编程: MOV R0,#20H ;首地址指初值20H CLR A ;累加器清0
LAB: MOV @R0,A ;置0指针指向R0初值20H单元
INC R0 ;地址指针加1
CJNE R0,#30H,LAB ;指针未到30H则继续循环
END
4.编程查找内部RAM的32H~41H单元中是否有0AAH这个数据,若有这一数据,
则将50H单元置为0FFH,否则将50H单元清零。 答: 设一个片内RAM指针R0,先指向首地址32H,比较@R0与#0AAH,若相等,
则退出循环,给50H单元赋0FFH,若不相等,则R0加1为继续比较下一个字节,
直到达到地址为41H还没有与OAAH相等的数值时,则给50H单元清零。
编程:
MOV R0,#32H ;首地址指初值32H CONT: CJNE @R0,#0AAH,NEXT;比较查找值与指针所指单元的值,不相等则继
续循环
MOV 50H, #0FFH ;相等,给50H单元赋0FFH
NEXT: INC R0 ;地址指针加1
CJNE R0,#42H,CONT ;若指针未越过终点,则继续 MOV A,#00H ;查找失败,则将00H存入结果标志单元
END
5.查找20H~4FH单元中出现00H的次数,并将查找结果存入50H单元。
答: MOV R2,0 ;计数器初值为0
MOV R0,#20H ;设地址指针初值20H
CONT: CJNE @R0,#00H,NEXT ;比较查找值与指针所指单元的值,不相等转移
INC R2 ;相等,个数计数器加1
NEXT: INC R0 ;地址指针加1 CJNE R0,#4FH,CONT ;未达到4FH则继续
MOV 50H,R2 ;保存O的个数计数值到50H单元
END
6.已知A=83H,R0=17H,(17H)=34H,写出下列程序段执行之后的A中的内容。 ANL A,#17H
ORL 17H,A
XRL A,@R0
CPL A
答: ANL A,#17H ;A=03H
ORL 17H,A ;(17H)=0011 0100 ∨ 0000 0011=0011 0111
XRL A,@R0 ;A= 0000 0011 ∨ 0011 0111 =0011 0100
CPL A ;A=1100 1011
7.已知单片机的晶振频率为12MHz,分别设计延时为0.1s、1s的子程序。 答:0.1s:
DEL50: MOV R7,
#3
MOV R6,#16665
DEL1: DJNZ R6,DEL2 ;循环16665次 DEL2: DJNZ R7,DEL1 ;循环3次 RET
1s:
DEL50: MOV R7,#333 MOV R6,#1500
DEL1: DJNZ R6,DEL2 ;循环1500次
DEL2: DJNZ R7,DEL1 ;循环333次
RET
8.内部RAM从20H单元开始处有一数据块,以ODH为结束标志,试统计该数据
块的长度,将该数据块送到外部数据存储器7E01H开始的单元,并将长度存入
7E00H单元。
答: 从20H的指针用R0,从外部RAM7E01开始的指针用DPTR,计数器用R7
MOV R7,#0 ;字节计数器赋初值 MOV R0,#20H ;设片内RAM地址指针初值
MOV DPTR,#7E01H ;设片外RAM地址指针初值
CONT: MOV A,@R0 ;取片内RAM中的一个字节
MOVX @DPTR,A ;存入片外RAM指针所指单元
INC R7 ;长度计数器加1 INC R0 ;片内RAM地址指针加1
INC DPTR ;片外RAM地址指针加1
CJNE A,#0DH,CONT ;未达到结束标志
MOV A,R7 ;取块计数长度值
MOVX @DPTR,A ;保存 SJMP $ ;暂停
END
9.内部RAM从DATA开始的区域中存放着10个单字节十进制数,求其累加和,
并将结果存入SUM和SUM+1单元。 答:R7计数,R6保存累加和高8位,R0用作地址指针
ORG 0000H
LJMP MAIN
ORG 100H
SUM EQU 30H DATAA EQU 40H
MAIN: MOV R7,#10 ;字节计数器赋初值
MOV R0,#DATAA ;设片内RAM地址指针初值
CLR A ;累加器清0
MOV R6,A ;累加结果的高8位 CONT: ADD A,@R0 ;加RAM中的一个字节到ACC
DA A
JNC NEXT ;若无进位则不用管高8位
INC R6 ;有进位,高8位加1
NEXT: INC R0 ;片内RAM地址指针加1 DJNZ R7,CONT ;未完继续
MOV SUM,A ;保存低8位
MOV SUM+1,R6 ;保存高8位
SJMP $ ;暂停 END
10.内部RAM从DATA1和DATA2单元开始处存放着两个等长的数据块,数据块的
长度在LEN单元中。请编程检查这两个数据块是否相等,若相等,将0FFH写入
RESULT单元,否则将0写入RESULT单元。
答:从DATA1开始的指针用R0,从DATA2开始的指针用R1,计数器用R7 LEN EQU 10
DATA1 EQU 30H
DATA2 EQU 40H
RESULT EQU 50H
MOV R7,#LEN ;字节计数器赋初值 MOV R0,#DATA1 ;设片内RAM地址指针初值
MOV R1,#DATA2 ;设片外RAM地址指针初值
CONT: MOV A,@R0 ;取片内RAM R0所指的的一个字节
MOV 7FH,@R1 ;将R1所指单元内容取到片内RAM地址7FH中
CJNE A,7FH,NOEQ ;比较,不相等则结束 INC R0 ;DATA1 RAM地址指针加1
INC R1 ;DATA2 RAM地址指针加1
DJNZ R7,CONT ;未完,继续
MOV A,#0FFH ;相等,准备写入FFH
SJMP DOWN ;转写入结果处 NOEQ: MOV A,#0 ;不相等,准备写入00H
DOWN: MOV RESULT,A ;保存比较结果标志
SJMP $ ;暂停
END
11.编制程序,将内部RAM中M1、M2、M3和M4单元中的无符号数xl、x2、x3
和x4相加,并把和存入RO和R1(R0中为高8位)中。
答:
M1 EQU 30H
M2 EQU 40H M3 EQU 45H
M4 EQU 4FH
MOV A,M1 ;取第一个数
ADD A,M2 ;与第二个数相加
JNC NEXT1 ;如果无进位,则转移至第三个相加 MOV R0,#1 ;有进位,高8位置1
NEXT1: ADD A,M3 ;与第三个数相加
JNC NEXT2 ;没有进位,则转至第四个数相加
INC R0 ;有进位,高8位加1
NEXT2: ADD A,M4 ;与第四个数相加 JNC NEXT3 ;没有进位,则转至结束