第3章 单片机的汇编语言与程序设计题解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第3章单片机的汇编语言与程序设计习题
1.MCS-51单片机有哪几种寻址方式?适用于什么地址空间?
答:MCS-51单片机有7种寻址方式:直接寻址、寄存器寻址、寄存器间接寻址、立即寻址、变址寻址、位寻址、相对寻址。
直接寻址方式:操作数的地址由指令直接给出,适用于片内RAM的所有地址空间;如MOV A,68H
MOV A,PSW
寄存器寻址方式:指令给出的是寄存器的编码,操作数在编码指定的寄存器中,适用于片内00H至1FH的32个字节,用R0,…,R7表示,通过PSW的RS1和RS0选择组号确定对应32个字节中的其中8个,还有累加器A,以及乘除法指令中的A和B寄存器,位寻址方式中的布尔累加器C;
MOV A,R1
MUL AB
INC DPTR
寄存器间接寻址方式:指令给出的是寄存器的编码,操作数地址在编码指定的寄存器中,适用于片内RAM的全部空间,其中52系列中的80H至FFH只能用寄存器间接寻址;如
MOV A,@R0
MOV A,@R1
MOVX A,@DPTR
立即寻址方式:操作数本身在指令中直接,给出适用于用8位立即数对片内RAM所有地址单元赋值,也可用16位立即数对DPTR赋值;如
MOV A,#0E2H
MOV DPTR,#2000H
变址寻址方式:以DPTR或PC作为基地址寄存器,以累加器A作为变址寄存器,将基址寄存器与变址寄存器的内容相加形成操作数的实际地址的一种寻址方式,变址寻址方式适用于程序存储器ROM,仅有三条指令如下:
MOVC A,@A+DPTR
MOVC A,@A+PC
JMP @A+DPTR
位寻址方式:指令中直接给出操作数所在单元的位地址,适用于片内RAM 中地址20H至2FH中的16个字节中的128个位地址空间和80H至FFH中地址中可以被8整除的所有SFR中的每个位地址空间;如
MOV C,7FH
MOV F0,C
MOV C,ACC.7
相对寻址方式:为相对转移指令而设,指令中直接给出转移的相对偏移量,其转移目标在当前指令-128至+127字节范围内的地址空间。如
SJMP START
HERE: SJMP HERE ;等效于:SJMP $
2.MCS-51单片机的PSW程序状态字中无ZERO(零)标志位,怎样判断某内部数据单元的内容是否为零?
答:M CS-51单片机的PSW程序状态字中无ZERO(零)标志位,判断某内部数据单元的内容是否为零是能通过取数到A累加器,再判断A中的每一位是否为零来确定其值是否为零。
3.编程将内部RAM的20H--30H单元内容清零。
解:设一个片内RAM指针R0,先指向首地址20H,通过累加器A清零,然后采用间接寻址方式依次将A中的零值传送到指针所指的片内RAM单元,每传送一个字节,地址指针加1,直到达到地址为30H或达到计数器规定的17个字节为止。程序1:
MOV R0,#20H ;设地址指针初值
CLR A ;累加器清0
CONT: MOV @R0,A ;置0指针所指单元
INC R0 ;地址指针加1
CJNE R0,#31H,CONT ;指针未超过终点则继续
SJMP $ ;暂停
程序2:
MOV R0,#20H ;设地址指针初值
CLR A ;累加器清0
MOV R7,#17 ;计数器赋初值,从20H到30H共17个字节CONT: MOV @R0,A ;置0指针所指单元
INC R0 ;地址指针加1
DJNZ R7,CONT ;计数器减1,非0,则继续
SJMP $ ;暂停
4.编程查找内部RAM的32H~41H单元中是否有0AAH这个数据,若有这一数据,则将50H单元置为0FFH,否则将50H单元清零。
解:设一个片内RAM指针R0,先指向首地址32H,比较@R0与#0AAH,若相等,则退出循环,给50H单元赋0FFH,若不相等,则R0加1为继续比较下一个字节做准备,直到达到地址为41H或达到计数器规定的16个字节为止还没找到,则给50H单元赋00H
程序1:
MOV R0,#32H ;设地址指针初值
CONT: CJNE @R0,#0AAH,NEXT;比较查找值与指针所指单元的值,不相等转移MOV A,#0FFH ;相等,则准备好要赋的标志值0FFH
SJMP DOWN ;转存到保存结果处
NEXT: INC R0 ;修改地址指针
CJNE R0,#42H,CONT ;若指针未越过终点,则继续
MOV A,#00H ;查找失败,则将00H存入结果标志单元DOWN: MOV 50H,A ;将比较结果标志存入50H单元
SJMP $ ;暂停
END
程序2:
MOV R7,#16 ;计数器赋初值,从20H到30H共16个字节
MOV R0,#32H ;设地址指针初值
CONT: CJNE @R0,#0AAH,NEXT ;比较查找值与指针所指单元的值,不相等转移
MOV A,#0FFH ;相等,则准备好要赋的标志值0FFH
SJMP DOWN ;转存到保存结果处
NEXT: INC R0 ;修改地址指针
DJNZ R7,CONT ;计数器减1,非0,则继续
MOV A,#00H ;查找失败,则将00H存入结果标志单元DOWN: MOV 50H,A ;将比较结果标志存入50H单元
SJMP $ ;暂停
END
5.查找20H~4FH单元中出现00H的次数,并将查找结果存入50H单元。
解:从20H到4FH共48个字节
MOV R7,#48 ;字节计数器赋初值
MOV R0,#20H ;设地址指针初值
CONT: CJNE @R0,#00H,NEXT ;比较查找值与指针所指单元的值,不相等转移INC R6 ;相等,0的个数计数器加1
NEXT: INC R0 ;修改地址指针
DJNZ R7,CONT ;计数器减1,非0,则继续
MOV 50H,R6 ;保存O的个数计数值到50H单元
SJMP $ ;暂停
END
6.已知A=83H,R0=17H,(17H)=34H,写出下列程序段执行之后的A中的内容。
ANL A,#17H Array
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的子程序。答:已知单片机的晶振频率为12MHz,则机器周期为1us,延时子程序是通过执行指令序列中机器周期数来达到,如果要0.1s,即100ms,也就是100000us,所以需要机器周期数达到100000。要延时达到1S,可通过对延时为0.1秒的子
程序调用10次来实现。
DELAY100MS: MOV R6,#200 ;1个机器周期
D1: MOV R7,#250 ;1个机器周期
D2: NOP ;1个机器周期
DJNZ R7,D2 ;2个机器周期,3*251=753
DJNZ R6,D1 ;2个机器周期,(1+753+2)*132=99792
RET ;2个机器周期,1+99792+2=99795,约100ms