资源描述
第三章 9.试根据指令编码表写出下列指令的机器码。
(1)MOV A,#88H----------------74H, 88H
(2)MOV R3,50H----------------A8H,50H
(3)MOV P1,#55H----------75H,90H,55H
(4)ADD A,@R1---------------------27H
(5)SETB 12H----------------------D2H,12H
10.完成某种操作可以采用几条指令构成的指令序列实现,试写出完成以下每种操作的指令序列。
(1)将R0的内容传送到R1;
(2)内部RAM单元60H的内容传送到寄存器R2;
(3)外部RAM单元1000H的内容传送到内部RAM单元60H;
(4)外部RAM单元1000H的内容传送到寄存器R2;
(5)外部RAM单元1000H的内容传送到外部RAM单元2000H。
答:(1)MOV A,R0 (2)MOV R2,60H
MOV R1,A
(3)MOV DPTR,#1000H (4)MOV DPTR,#1000H
MOVX A,@DPTR MOVX A,@DPTR
MOV 60H,A MOV R2,A
(5)MOV DPTR,#1000H
MOVX A,@DPTR
MOV DPTR,#2000H
MOVX @DPTR, A
11.若(R1)=30H,(A)=40H,(30H)=60H,(40H)=08H。试分析执行下列程序段后上述各单元内容的变化。
MOV A,@R1
MOV @R1,40H
MOV 40H,A
MOV R1,#7FH
答:(R1)=7FH (A)=60H (30H)=08H (40H)=60H
12.若(A)=E8H,(R0)=40H,(R1)=20H,(R4)=3AH,(40H)=2CH,(20H)=0FH,试写出下列各指令独立执行后有关寄存器和存储单元的内容?若该指令影响标志位,试指出CY、AC、和OV的值。(1)MOV A,@R0 (2)ANL 40H,#0FH (3)ADD A,R4
(4)SWAP A (5)DEC @R1 (6)XCHD A,@R1
答:(1)(A)=2CH (2)(40H)=0CH (3)(A)=22H,(CY)=1,(AC)=1,(OV)=0
(4)(A)=8EH (5)(20H)=0EH,P=1 (6)(A)=EFH,(20)=08H
13.若(50H)=40H,试写出执行以下程序段后累加器A、寄存器R0及内部RAM的40H、41H、42H单元中的内容各为多少?
MOV A,50H
MOV R0,A
MOV A,#00H
MOV @R0,A
MOV A,#3BH
MOV 41H,A
MOV 42H,41H
答:(A)=3BH,(R0)=40H,(40H)=00H,(41H)=3BH,(42H)=3BH。
14.试用位操作指令实现下列逻辑操作。要求不得改变未涉及的位的内容。
(1)使ACC.0置位; (2)清除累加器高4位; (3)清除ACC.3,ACC.4,ACC.5,ACC.6。
答:(1)SETB ACC.0 (2)ANL A,#0FH (3)ANL A,#87H
15.试编写程序,将内部RAM的20H、21H、22H三个连续单元的内容依次存入2FH、2EH和2DH单元。答:MOV 2FH,20H
MOV 2EH,21H
MOV 2DH,22H
16.试编写程序,完成两个16位数的减法:7F4DH-2B4EH,结果存入内部RAM的30H和31H单元,30H单元存差的高8位,31H单元存差的低8位。
答:CLR CY
MOV 30H,#7FH
MOV 31H,#4DH
MOV R0, #31H
MOV A,@R0
SUBB A ,#4E
MOV @R0,A ;保存低字节相减结果
DEC R0
MOV A, @R0
SUBB A,#2BH
MOV @R0,A ;保存高字节相减结果
17.试编写程序,将R1中的低4位数与R2中的高4位数合并成一个8位数,并将其存放在R1中。
答:MOV A,R2
ANL A,#0F0H
ORL R1,A
18.试编写程序,将内部RAM的20H、21H单元的两个无符号数相乘,结果存放在R2、R3中,R2中存放高8位,R3中存放低8位。
答:MOV A,20H
MOV B,21H
MUL AB
MOV R3,A
MOV R2,B
19.若(CY)=1,(P1)=10100011B,(P3)=01101100B。试指出执行下列程序段后,CY、P1口及P3口内容的变化情况。
MOV P1.3,C
MOV P1.4,C
MOV C,P1.6
MOV P3.6,C
MOV C,P1.0
MOV P3.4,C
答:(CY)=1, (P1)=10111011B, (P3)=00111100B
第四章 6.设被加数存放在内部RAM的20H、21H单元,加数存放在22H、23H单元,若要求和存放在24H、25H中,试编写出16位无符号数相加的程序(采用大端模式存储)。
答:程序如下:ORG 0000H
MOV R0,#21H
MOV R1,#23H
MOV A,@R0
ADD A,@R1
MOV 25H,A
DEC R0
DEC R1
MOV A,@R0
ADDC A,@R1
MOV 24H,A
SJMP $
END
7.编写程序,把外部RAM中1000H~101FH的内容传送到内部RAM的30H~4FH中。
答: ORG 0000H
MOV DPTR,#1000H
MOV R0,#30H
MOV R7,#32
LOOP:MOVX A,@DPTR
MOV @R0,A
INC R0
INC DPTR
DJNZ R7,LOOP
RET
8.编写程序,实现双字节无符号数加法运算,要求 (R0R1)+(R6R7)→(60H61H)。
答: ORG 0000H
MOV A,R1
ADD A,R7
MOV 61H,A
MOV A,R0
ADDC A,R6
MOV 60H,A
SJMP $
END
9.若80C51的晶振频率为6MHz,试计算延时子程序的延时时间。
DELAY:MOV R7,#0F6H
LP:MOV R6,#0FAH
DJNZ R6,$
DJNZ R7,LP
RET答:延时时间: 2µs*{[1+((1+2*250+2)*246)+2]+2}=0.247486秒(含调用指令2个机器周期)
10.在内部RAM 的30H~37H单元存有一组单字节无符号数。要求找出最大数存入BIG单元。试编写程序实现。
答: ORG 0000H
BIG DATA 2FH
ONE DATA 2AH
TWO DATA 2BH
START:MOV R7,#7 ;比较次数
MOV R0,#30H
LOOP:MOV A,@R0
MOV ONE,A
INC R0
MOV TWO,@R0
CLR C
SUBB A,@R0
JC NEXT ;ONE小,TWO大继续比下一对数
MOV @R0,ONE ;ONE大放后面(交换)
DEC R0
MOV @R0,TWO ;TWO小放前面
INC R0 ;
NEXT:DJNZ R7,LOOP
MOV BIG,37H
SJMP $
END
11.编写程序,把累加器A中的二进制数变换成3位BCD码,并将百、十、个位数分别存放在内部RAM的50H、51H、52H中。
答:单字节二进制数转换为压缩的BCD码仅需要2个字节;在将压缩的BCD码拆分存于3个单元。
ORG 0000H
MOV 52H,#0
MOV 51H,#0
MOV 50H,#0
MOV A,#0FDh
LCALL DCDTH
SJMP $
DCDTH:MOV R7,#8
MOV R0,A ;暂存于R0
LOOP:CLR C
MOV A,R0
RLC A
MOV R0,A
MOV R1,#51H;
MOV A,@R1 ;
ADDC A,@R1 ;
DA A ;
MOV @R1,A ;
DEC R1
MOV A,@R1
ADDC A,@R1
DA A
MOV @R1,A
DJNZ R7,LOOP
INC R1 ;50H已是结果,R1指向51H,51H单元需拆分
MOV A,#00H
XCHD A,@R1
MOV 52H,A
MOV A,@R1
SWAP A
MOV @R1,A
RET
END
12.编写子程序,将R1中的2个十六进制数转换为ASCII码后存放在R3和R4中。
答: ORG 0
MOV R1,#5BH
MOV A,R1
ANL A,#0F0H
SWAP A
ACALL ASCII
MOV R3,A
MOV A,R1
ANL A, #0FH
ACALL ASCII
MOV R4, A
SJMP $
ASCII:PUSH ACC
CLR C
SUBB A, #0AH
POP ACC
JC LOOP
ADD A, #07H
LOOP: ADD A, #30H
RET
END
13.编写程序,求内部RAM中50H~59H十个单元内容的平均值,并存放在5AH单元。
答: ORG 0000H
MOV R7,#10
MOV R0,#50H
MOV B,#10
CLR C
CLR A
LOOP:ADDC A,@R0
INC R0
DJNZ R7,LOOP
DIV AB
MOV 5AH,A
SJMP $
END
14.如图4.10所示,编制程序实现:上电后显示“P”,有键按下时显示相应的键号“0”~“7”。
答;实现程序如下:
TEMP EQU 30H
ORG 0000H
JMP START
ORG 0100H
START:MOV SP,#5FH
MOV P0,#8CH ;正序显示"P"
MOV P3,#0FFH ;输入方式
CLR CY
NOKEY:MOV A,P3
CPL A
JZ NOKEY ;无键按下
MOV TEMP,P3 ;有键按下
CALL D10ms
MOV A,P3
CJNE A,TEMP,NOKEY ;去抖动
MOV R2,#0 ;键号计数器复位
MOV A,TEMP
LP:RRC A
JNC DONE
INC R2
SJMP LP
DONE:MOV A,R2
MOV DPTR,#CODE_P0
MOVC A,@A+DPTR
MOV P0,A
JMP NOKEY
D10ms:MOV R5,#10 ;10MS
D1ms:MOV R4,#249
DL:NOP
NOP
DJNZ R4,DL
DJNZ R5,D1ms
RET
CODE_P0:
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H
DB 80H,90H,88H,83H,0C6H,0A1H,86H,8EH
END
第五章 8.利用定时/计数器T0从P1.0输出周期为1s,脉宽为20ms的正脉冲信号,晶振频率为12MHz。试设计程序。
答:采用定时20ms,然后再计数1、49次的方法实现。
a、T0工作在定时方式1时,控制字TMOD配置:
M1M0=01,GATE=0,C/=0,可取方式控制字为01H;
b、计算计数初值X:
晶振为12 MHz,所以机器周期Tcy为1。
N=t/ Tcy =20×10-3/1×10-6=20000
X=216-N=65536-20000=45536=4E20H
即应将4EH送入TH1中,20H送入TL1中。
c、实现程序如下:
ORG 0000H
AJMP MAIN ;跳转到主程序
ORG 0030H
MAIN:MOV TMOD,#01H ;设T1工作于方式2
MOV TH0,# 4EH ;装入循环计数初值
MOV TL0,#20H ;首次计数值
LP0:SETB P1.0
ACALL NT0
CLR P1.0
MOV R7,#49 ;计数49次
LP1:ACALL NT0
DJNZ R7,LP1
AJMP LP0
NT0:MOV TH0,# 4EH
MOV TL0,#20H
SETB TR0
JNB TF0,$
CLR TR0
CLR TF0
RET
END
9.要求从P1.1引脚输出1000Hz方波,晶振频率为12MHz。试设计程序。
答:采用T0实现
a、T0工作在定时方式1时,控制字TMOD配置:
M1M0=01,GATE=0,C/=0,可取方式控制字为01H;
b、计算计数初值X:
晶振为12 MHz,所以机器周期Tcy为1。1/1000=1×10-3
N=t/ Tcy =0.5×10-3/1×10-6=500
X=216-N=65536-500=65036=FE0CH
即应将FEH送入TH0中,0CH送入TL0中。
c、实现程序如下:
ORG 0000H
AJMP MAIN ;跳转到主程序
ORG 000BH ;T0的中断入口地址
LJMP DVT0
ORG 0030H
MAIN:MOV TMOD,#01H ;设T0工作于方式2
MOV TH0,# 0FEH ;装入循环计数初值
MOV TL0,#0CH ;首次计数值
SETB ET0 ;T0开中断
SETB EA ;CPU开中断
SETB TR0 ;启动T0
SJMP $ ;等待中断
DVT0:CPL P1.1
MOV TH0,# 0FEH
MOV TL0,# 0CH
SETB TR0
RETI
END
10.试用定时/计数器T1对外部事件计数。要求每计数100,就将T1改成定时方式,控制P1.7输出一个脉宽为10ms的正脉冲,然后又转为计数方式,如此反复循环。设晶振频率为12MHz。
答:a、T1工作在计数方式2时,控制字TMOD配置:
M1M0=10,GATE=0,C/=1,可取方式控制字为60H;
T1工作在定时方式1时,控制字TMOD配置:
M1M0=01,GATE=0,C/=0,可取方式控制字为10H;
b、计算初值X:
定时10ms时:
晶振为12 MHz,所以机器周期Tcy为1。
N=t/ Tcy =10×10-3/1×10-6=10000
X=216-N=65536-10000=55536=D8F0H
即应将D8H送入TH1中,F0H送入TL1中。
计数100时:
N=100
X=28-N=256-100=156=9CH
c、实现程序如下:
ORG 0000H
AJMP MAIN ;跳转到主程序
ORG 001BH ;T1的中断入口地址
LJMP DVT1
ORG 0030H
MAIN:MOV TMOD,#60H ;T1工作于计数方式2
MOV TH1,#9CH ;装入计数初值
MOV TL1,#9CH ;
CLR P1.7
SETB ET1 ;T1开中断
SETB EA ;CPU开中断
SETB TR1 ;启动T1
SJMP $ ;等待中断
DVT1:SETB P1.7
CLR ET1
CLR TR1
MOV TMOD,#10H ;T1工作于定时方式1
MOV TH1,#0D8H ;装初值
MOV TL1,#0F0H
SETB TR1
JNB TF1,$ ;查询等待10ms
CLR TF1
CLR TR1
CLR P1.7
MOV TMOD,#60H ;T1工作于计数方式2
MOV TH1,#9CH ;装初值
MOV TL1,#9CH ;
SETB ET1 ;T1开中断
SETB TR1 ;启动T1
RETI
END
11.利用定时/计数器T0产生定时时钟,由P1口控制8个指示灯。编一个程序,使8个指示灯依次闪动,闪动频率为1次/秒(即,亮1秒后熄灭并点亮下一个,-----)。
答:采用定时20ms,计数50次实现1秒定时。编制1秒延时子程序,由主程序调用。
a、T0工作在定时方式1时,控制字TMOD配置:
M1M0=01,GATE=0,C/=0,可取方式控制字为01H;
b、计算计数初值X:
晶振为12 MHz,所以机器周期Tcy为1。
N=t/ Tcy =20×10-3/1×10-6=20000
X=216-N=65536-20000=45536=4E20H
即应将4EH送入TH1中,20H送入TL1中。
c、实现程序如下:
ORG 0000H
AJMP MAIN ;跳转到主程序
ORG 0030H
MAIN:CLR CY
MOV A,#01H
LP0:MOV P1,A
CALL D1SEC
RL A
AJMP LP0
D1SEC:MOV R7,#50 ;计数50次
MOV TMOD,#01H
DL:MOV TH0,#4EH
MOV TL0,#20H
SETB TR0
JNB TF0,$
CLR TR0
CLR TF0
DJNZ R7,DL
RET
END
展开阅读全文