程序一:用 SUBB 指令;将 RET 放在子程序最后。 P85 -例 4.2
假定在外部 RAM 中有 ST1 、 ST2 和 ST3 共 3 个连续单元,其中 ST1 和 ST2 单元中分别存放着两个 8 位无符号二进制数,要求找出其中最大的数并存入 ST3 单元。
ORG 0100H
START: CLR C
MOV DPTR,#ST1
MOVX A,@DPTR ;
MOV R2,A
INC DPTR
MOVX A,@DPTR ;
SUBB A, R2
JNC BIG1
XCH A,R2
BIG0: INC DPTR
MOVX @DPTR , A;
RET
BIG1: MOVX A,@DPTR ;
SJMP BIG0
ORG 0100H
START: CLR C
MOV DPTR,#ST1
MOVX A,@DPTR ;
MOV R2,A
INC DPTR
MOVX A,@DPTR ;
SUBB A, R2
JNC BIG1
XCH A,R2
BIG0: INC DPTR
MOVX @DPTR , A;
SJMP EXIT
BIG1: MOVX A,@DPTR ;
SJMP BIG0
EXIT: RET
ORG 0100H
START: CLR C
MOV DPTR,#ST1
MOVX A,@DPTR;
MOV R2,A
INC DPTR
MOVX A,@DPTR ;
SUBB A, R2
JC BIG0
MOVX A,@DPTR ;
SJMP BIG1
BIG0: MOV A,R2
BIG1: MOVX @DPTR , A ;
EXIT: RET
ORG 0100H
START: CLR C
MOV DPTR,#ST1
MOVX A,@DPTR ;
MOV R2,A
INC DPTR
MOVX A,@DPTR ;
CJNE A, 02H, BIG
SETB F0
SJMP BIG1
BIG: JNC BIG1
MOV A,R2
BIG1: INC DPTR
MOVX @DPTR , A ;
EXIT: RET
ORG 0100H
START: CLR C
MOV DPTR,#ST1
MOVX A,@DPTR ;
MOV R2,A
INC DPTR
MOVX A,@DPTR ;
SUBB A, R2
JNC BIG1
XCH A,R2
BIG0: INC DPTR
MOVX @DPTR , A ;
RET
BIG1: MOVX A,@DPTR ;
SJMP BIG0
程序二:用 CJNE 指令;如果两数相等,置 F0 为 1 ; 将 RET 放在子程序最后
MOV A, R3 ;分支转移值送 A
MOV DPTR,#BRTAB ;分支入口地址表首址
MOVC A,@A 十 DPTR ;查表
JMP @A 十 DPTR ;转移
BRTAB : DB BR0_BRTAB ; 4 04H
DB BRl_BRTAB ; 7 07H
DB BR2_BRTAB ; 10 0AH
DB BR3_BRTAB ; 19 13H
BR0 : MOV A,@R0 ; 1
SJMF BRE ; 2
BR1 : MOVX A,@R0 ; 1
SJMP BRE ; 2
BR2 : MOV A,R1 ; 1
ANL A,#0FH ; 2
ANL P2,#0F0H ; 3
ORL P2,A ; 2
MOVX A,@R0 ; 1
BR3 : MOV DPL,R0 ;从外部 RAM 64KB 取数
MOV DPH,R1
MOVX A,@DPTR
BRE : SJMP $
差值表(补充作业)
设 A=0A8H , R0=25H ,( 25H ) =43H ,执行下列指令后, A= ?要求写出过程。
ANL A , #25H ;(A)=10101000/\00100101
ORL 25H , A ;(25H)=01000011\/00100000
XRL A , @R0 ; (A)= 00100000 01100011
CPL A ; A=/(01000011)=10111100=BCH
下面程序执行后, SP= ?, A= ?, B= ?,解释每一条指令的作用,并翻译成机器代码: ORG 2000H ; ORG 2100H ;
MOV SP , #40H ; SUB1 :
MOV A , #30H ; MOV DPTR , #2009H ;
LCALL SUB1 ; PUSH DPL ;
ADD A , #04H ; PUSH DPH ;
MOV B , A ; RET ;
L1 : SJMP L1 ;
ORG 2000H ; ORG 2100H ;
2000H:MOV SP , #40H ; SUB1 : MOV DPTR , #2009H ;
2003H:MOV A , #30H ; PUSH DPL ;
2005H:LCALL SUB1 ; PUSH DPH ;
2008H:ADD A , #04H ; RET ;
200AH:MOV B , A ;
200CH: L1 : SJMP L1 ; (A)=(B)=31H (SP)=42H
设 C 的初值为 1 , ACC.7=0 , P1 口的内容为 :
0101 1101B , P3 口的内容为 :1011 0110B,问执行下列程序段后 ,C,P1,P3 口的内容有何变化 ?
ORL C, ACC.7; (C)=1
MOV P1.0, C; P1.0=1
MOV C, P3.7; (C) =1
ANL C, ACC.7; (C) =0
MOV P3.7, C; P3.7=0
MOV C, P1.0; (C) =1
MOV P3.5, C; P3.5=1
P1=01011101BP3=00110110B
Q=(X*Y+G)+(D+E)*F; 其中变量 X,Y,G 分别为 P1.0,P1.1, 定时器 0 溢出标志 TF0, D,E,F 分别为 20H.0, 20H.2, 外部中断方式标志 IF0, 输出变量 Q 为 P1.3 。请编写软件实现上述逻辑功能的程序段。
X BIT P1.0
Y BIT P1.1
G BIT TF0
D BIT 20H.0
E BIT 20H.1
F BIT IF0
Q BIT P1.3
MOV C,X
ANL C,X
ORL C,G
MOV G,A
MOV C,D
ORL C,E
ANL C,F
ORL C,G
MOV Q,C
MCS-51 有哪几种无条件转移指令?绝对调用和长调用指令有何区别?无条件转移: LJMP addr16
AJMP addr11
SJMP rel
JMP @A+PC
绝对调用 :ACALL addr11
长调用 :LCALL addr16
设 CY=1, A=55H, 请问执行下列指令 , 程序的转向何处 ?
JNC ROUT0;
CPL C;
JNC LOOP1;
MOV A, #0FFH;
LJMP ROUT1;
NOP;
LOOP1: JB ACC.1, LOOP2;
SETB ACC.1;
LOOP2: JNB ACC.3,ROUT2; 转向何处 ROUT2
CLR ACC.3;
LOOP3: JNC ACC.4, ROUT3;
8 、编程查找内部 RAM 的 30H~50H 单元中是否有 0FFH 这个数 , 若查到 ,则将 51H 单元置为 01H, 若没有找到 , 则将 51H 单元置为 00H 。
MOV R0,#30H
MOV R2,#21H
MOV 51H,#0
LOOP: MOV A,@R0
CJNE A,#0FFH,NEXT
INC 51H
SJMP BCK
NEXT: INC R0
DJNZ R2,LOOP
BCK: RET ; 或 SJMP $
MOV R0,#30H
MOV R2,#21H
MOV 51H,#0
LOOP: MOV A,@R0
INC A
JNZ NEXT
INC 51H
SJMP BCK
NEXT: INC R0
DJNZ R2,LOOP
BCK: RET ; 或 SJMP $
9 、编程将外部 RAM 单元中的高 3 位清零,第 4 位、第 0 位置 1 ,其余位求反。
MOVX A,@DPTR
CPL A
ANL A,#1FH
ORL A,#11H
MOV @DPTR,A
P112 - 1 、把长度为 10H 的字符串 从内部 RAM 的输入缓冲区 inbuf 向外部RAM 的输出缓冲区 outbuf 进行传送,一直进行到遇见回车符 CR 或整个字符传传送完毕。
MOV R0,#inbuf
MOV DPTR,#outbuf
MOV R2,#10H
LOOP:MOV A,@R0
CJNE A,#0DH,LP
SJMP EXIT
LP: MOV A,@R0
MOVX @DPTR,A
INC R0
INC DPTR
DJNZ R2,LOOP
EXIT:RET
P112 - 4 、把一个 8 为二进制数以 ASCII 表示之(亦即“ 0” 的位用 30H 表示,“ 1” 的位用 31H 表示)。该数存放在内部 RAM 中的 byte 单元,变换后存放在外部 RAM 以 buf 开始的存储单元中。
MOV R0,#buf
MOV R2,#8
MOV A,byte
LOOP:RLC A
JC ONE
MOV @R0,#30H
SJMP LP1
ONE:MOV @R0,#31H
LP1:INC R0
DJNZ R2,LOOP
SJMP $
P112 - 7 、在外部 RAM 首地址 table 的数据表中,有十个字节的数据。编程将每个字节的最高位无条件的置 1 。
MOV DPTR,#table
MOV R2,#10
LOOP:MOVX A,@DPTR
ORL A,#80H
MOVX @DPTR,A
INC DPTR
DJNZ R2,LOOP
SJMP $
P112 - 8 、将 8000H 开始的有 200 个字节的源数据区,每隔一个单元送到 4000H 开始的数据区。在目的数据区中,每隔两个单元写一个数据。如遇 OD (回车)则传送结束。
MOV DPTR,#8000H
MOV R2,#100
MOV R1,#40H
MOV R0,#00H
LOOP: MOVX A,@DPTR
CJNE A,#0DH,N1
SJMP EXIT
N1: PUSH DPH
PUSH DPL
MOV DPH,R1
MOV DPL,R0
MOVX @DPTR,A
INC DPTR
INC DPTR
INC DPTR
MOV R1,DPH
MOV R0,DPL
POP DPL
POP DPH
DJNZ R0,N2
SJMP EXIT
N2: INC DPTR
INC DPTR
LJMP LOOP
EXIT: SJMP $
单片机用内部定时方法产生频率为 100KHz 等宽矩形波,假定单片机的晶振频率为 12MHz ,请编程实现。
1 、计算初值:因为晶振频率为 12MHz 所以 1T 机= 1us
定时时间= 0.5*10 - 5S = 5us
方式 0 : ( 213 - x ) *1us = 5
x = 8187D = 1FFBH
TH=FFH TL=1BH
2 、 TMOD=00H
3 、程序MOV TMOD,#00H
MOV TH0,#0FFH
MOV TL0,#1BH
SETB TR0
LOOP: JBC TF0,LP1
SJMP LOOP
LP1: MOV TL0,#1BH
MOV TH0,#0FFH
CPL P1.0
SJMP LOOP
1 、计算初值:方式 2 : ( 28 - x ) *1us = 5
x = 251D = FBH
TH=FBH TL=FBH
2 、 TMOD=02H
3 、程序MOV TMOD,#02H
MOV TH0,#0FBH
MOV TL0,#0FBH
SETB TR0
LOOP: JBC TF0,LP1
SJMP LOOP
LP1: CPL P1.0
SJMP LOOP
有晶振频率为 6MHz 的 MCS—51 单片机,使用定时器 0 以定时方法在 P1.0 输出周期为 400us 占空比为 1 : 10 的矩形脉冲,以定时工作方式 2 编程实现。方法一:
1 、计算初值:
因为晶振频率为 6MHz 所以 1T 机=2us
定时时间= 40us
方式 2: ( 28 - x ) *2us = 40
x = 236D = ECH
TH0=TL0=ECH
2 、 TMOD=02H
3 、程序MOV TMOD,#02H
MOV TH0,#0ECH
MOV TL0,#0ECH
SETB TR0
START: SETB P1.0
MOV R2,#10
LP: JBC TF0,LP1
SJMP LP
LP1: CLR P1.0
DJNZ R2,LP
SJMP START
有晶振频率为 6MHz 的 MCS—51 单片机,使用定时器 0 以定时方法在 P1.0 输出周期为 400us 占空比为 1 : 10 的矩形脉冲,以定时工作方式 2 编程实现。方法二:
1 、计算初值:因为晶振频率为 6MHz 所以 1T 机=2us定时时间= 40us方式 2: ( 28 - x ) *2us = 40 x = 236D = ECHTH0=TL0=ECH
( 28 - x ) *2us = 360 x = 76D = 4CHTH0=TL0=4CH
2 、 TMOD=02H
3 、程序MOV TMOD,#02H
SETB TR0
START: MOV TH0,#0ECH
MOV TL0,#0ECH
SETB P1.0
LP: JBC TF0,LP1
SJMP LP
LP1: CLR P1.0
MOV TL0,#04CH
MOV TH0,#04CH
LP2: JBC TF0, START
SJMP LP2
以定时器/计数器 1 进行外部事件计数。每计数 1000 个脉冲后,定时器/计数器 1 转为定时工作方式,定时 10ms 后,又转为计数方式,如此循环不止。假定单片机晶振频率为 6MHz ,请使 用方式 1 编程实现。
1 、计算初值:因为晶振频率为 6MHz 所以 1T 机=2us
定时时间= 10mS方式 1: ( 216 - x ) *2us = 10×1000us x = 60536D = EC78HTH1=ECH TL1 =78H
计数 1000方式 1 :( 216 - x )= 1000 x = 64536D = FC18HTH1=FCH TL1 =18H
2 、定时: TMOD=10H
计数: TMOD=50H
3 、程序START: MOV TMOD,#50H
MOV TL1,#18H
MOV TH1,#0FCH
SETB TR1
LP JBC TF1,LP1
SJMP LP
LP1: MOV TMOD,#10H
MOV TL1,#78H
MOV TH1,#0ECH
LP2: JBC TF1, START
SJMP LP2
假定单片机晶振频率为 6MHz ,要求每隔 100ms ,从外部 ROM 以 data 开始的数据区传送一个数据到 Pl 输出,共传送 l00 个数据。要求以两个定时器串行定时方法实现。
1 、计算初值:因为晶振频率为 6MHz 所以 1T 机=2us
定时时间= 100mS两个定时 / 计数器串行定时一个定时 500us 一个计数 200 次采用方式 2 :方式 2: ( 28 - x ) *2us = 500us x = 6D = 06HTH1=TL1 =06H
计数 200方式 2 :( 28 - x )= 200 x = 56D = 38HTH0 = TL0 =38H
2 、 TMOD=26H
3 、定时时刻到时, P3.0 口输出脉冲信号给T0 引脚,定时 / 计数器 0 开始计数 ,
4 、程序 :
MOV TMOD,#26H
MOV TL1,#06H
MOV TH1,#06H
MOV TL0,#38H
MOV TH0,#38H
MOV DPTR,#data
MOV R2,#100
SETB TR0
START: SETB TR1
LP: JBC TF1,LP1
SJMP LP
LP1: SETB P3.0
CLR P3.0
LP2: JBC TF0, LP3
SJMP LP
LP3: CLR TR1
MOVX A,@DPTR
MOV P1,A
INC DPTR
DJNZ R2,START
SJMP $
每隔 1 秒钟读一次 P1.0 ,如果所读的状态为“ l” ,内部 RAM 10H 单元加 1 ;如果所读的状态为“ 0” ,则内部 RAM11H 单元加 1 。假定单片机晶振频率为 12MHz ,请以软硬件结合方法定时实现之。1 、计算初值:因为晶振频率为 12MHz 所以 1T 机=1us
计时时间 1S 方式 1 最大定时小于 100ms所以取定时时间= 50mS ;循环 20 次方式 1: ( 216 - x ) *1us = 50000us x = 15536D = 3CB0HTH1=3CH TL1 =B0H
2 、定时: TMOD=10H
3 、程序MOV TMOD,#10H
CLR A
MOV 10H,A
MOV 11H,A
SETB TR1
START: MOV R2,#20
RE: MOV TL1,#0B0H
MOV TH1,#3CH
LP: JBC TF1,LP1
SJMP LP
LP1: DJNZ R2,RE
SETB P1.0
MOV C,P1.0
JC LP2; JB P1.0,LP2
INC 11H
SJMP START
LP2: INC 10H
SJMP START
以 2 片 Intel2716 给 805l 单片机扩展一个 4KB 的外部程序存储器,要求地址空间与 8051 的内 部 ROM 相衔接,请画出逻辑连接图。
A7~A0
D7~D0
A10~A8
OE
CE
2716 I
P0
ALE
P2.2~P2.0
PSEN
P2.3
A7~A0
D7~D0
A10~A8
OE
CE
2716 II
74LS373
G
非
EA+5V
80C51
0000H~0FFFH
1000H~17FFH1800H~1FFFH
P2.7 P2.6 P.25 P2.4 P.23 P2.2 P.21 P2.0 P0X X X 1 0 0 0 0 00HX X X 1 0 1 1 1 FFHX X X 1 1 0 0 0 00HX X X 1 1 1 1 1 FFH
试以一片 Intel2716 和一片 Intel6116 组成一个既有程序存储器又有数据存储器的存储器
扩展系统,请画出逻辑连接图,并说明各芯片的地址范围。
A7~A0
D7~D0
A10~A8
OE
CE
2716
P0
ALE
P2.2~P2.0
PSEN
A7~A0
D7~D0
A10~A8
CE
6116
OE
74LS373
G
EA
GND
80C51
RD
WR
WR
0000H~0FFFH
0000H~07FFH 0000H~07FFH
2716:
6116:
有 32 个映像区
P2.7 P2.6 P.25 P2.4 P.23 P2.2 P.21 P2.0 P0X X X X X 0 0 0 00HX X X X X 1 1 1 FFHX X X X X 0 0 0 00HX X X X X 1 1 1 FFH
试以一片 Intel2716 和一片 Intel6116 组成一个既有程序存储器又有数据存储器的存储器
扩展系统,请画出逻辑连接图,并说明各芯片的地址范围。
A7~A0
D7~D0
A10~A8
OE
CE
2716
P0
ALE
P2.2~P2.0
PSEN
P2.4
A7~A0
D7~D0
A10~A8
CE
6116
OE
74LS373
G
EA+5V
80C51
RD
WR
WR
0000H~0FFFH
1000H~17FFH 0000H~07FFH
P2.7 P2.6 P.25 P2.4 P.23 P2.2 P.21 P2.0 P0X X X 1 X 0 0 0 00HX X X 1 X 1 1 1 FFHX X X X X 0 0 0 00HX X X X X 1 1 1 FFH
2716:
6116:
非
有 32 个映像区
有 16 个映像区
以译码编址方式,把 4 片 Intel 6116 组成 8KB 的数据存储器,请画出逻辑连接图,并说明各芯片地址范围。
D7
Q7
Q0
D0
74H
C3
73
P2.7P2.6
P2.5P2.4P2.3
P2.2P2.1P2.0
ALE
P0
WRRD
80C51A0A0A0A0
A7A7A7A7A8A8A8A8A9A9A9A9A10A10A10A10
OEOEOEOE
CECECECEA11A11A11A11A12A12A12A12
611
6
WE D7
-D0
A10A10A10A10
A0A0A0A0
OEOEOEOE
A7A7A7A7A8A8A8A8A9A9A9A9
A12A12A12A12A11A11A11A11
CECECECE
611
6
WE D7
-D0
A0A0A0A0
A7A7A7A7A8A8A8A8A9A9A9A9A10A10A10A10
OEOEOEOE
CECECECEA11A11A11A11A12A12A12A12
611
6 WE D
7-D
0
A0A0A0A0
A7A7A7A7A8A8A8A8A9A9A9A9A10A10A10A10
OEOEOEOE
CECECECEA11A11A11A11A12A12A12A12
611
6
WE D7
-D0
I
G
EA+5V
GBA
Y2Y1Y074
HC
13
9 Y3
P.27 P2.6 P.25 P2.4 P.23 P2.2 P.21 P2.0 P0X X 0 0 0 0 0 0 00HX X 0 0 0 1 1 1 FFHX X 0 0 1 0 0 0 00HX X 0 0 1 1 1 1 FFHX X 0 1 0 0 0 0 00HX X 0 1 0 1 1 1 FFHX X 0 1 1 0 0 0 00HX X 0 1 1 1 1 1 FFH
I II III IV
I:
II:
III:
IV: