程序一:用 subb 指令;将 ret 放在子程序最后。 p85- 例4.2

25
程程 一: 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

Upload: osmond

Post on 15-Jan-2016

140 views

Category:

Documents


0 download

DESCRIPTION

程序一:用 SUBB 指令;将 RET 放在子程序最后。 P85- 例4.2. 假定在外部 RAM 中有 ST1、ST2 和 ST3 共3个连续单元,其中 ST1 和 ST2 单元中分别存放着两个8位无符号二进制数,要求找出其中最大的数并存入 ST3 单元。 ORG0100H START:CLR C MOVDPTR,#ST1 MOVX A,@DPTR ; MOVR2,A INC DPTR MOVXA,@DPTR ; SUBBA, R2 JNCBIG1 XCHA,R2 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 程序一:用 SUBB 指令;将 RET 放在子程序最后。 P85- 例4.2

程序一:用 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

Page 2: 程序一:用 SUBB 指令;将 RET 放在子程序最后。 P85- 例4.2

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 放在子程序最后

Page 3: 程序一:用 SUBB 指令;将 RET 放在子程序最后。 P85- 例4.2

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 $

差值表(补充作业)

Page 4: 程序一:用 SUBB 指令;将 RET 放在子程序最后。 P85- 例4.2

设 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

Page 5: 程序一:用 SUBB 指令;将 RET 放在子程序最后。 P85- 例4.2

下面程序执行后, 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

Page 6: 程序一:用 SUBB 指令;将 RET 放在子程序最后。 P85- 例4.2

设 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

Page 7: 程序一:用 SUBB 指令;将 RET 放在子程序最后。 P85- 例4.2

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

Page 8: 程序一:用 SUBB 指令;将 RET 放在子程序最后。 P85- 例4.2

MCS-51 有哪几种无条件转移指令?绝对调用和长调用指令有何区别?无条件转移: LJMP addr16

AJMP addr11

SJMP rel

JMP @A+PC

绝对调用 :ACALL addr11

长调用 :LCALL addr16

Page 9: 程序一:用 SUBB 指令;将 RET 放在子程序最后。 P85- 例4.2

设 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;

Page 10: 程序一:用 SUBB 指令;将 RET 放在子程序最后。 P85- 例4.2

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 $

Page 11: 程序一:用 SUBB 指令;将 RET 放在子程序最后。 P85- 例4.2

9 、编程将外部 RAM 单元中的高 3 位清零,第 4 位、第 0 位置 1 ,其余位求反。

MOVX A,@DPTR

CPL A

ANL A,#1FH

ORL A,#11H

MOV @DPTR,A

Page 12: 程序一:用 SUBB 指令;将 RET 放在子程序最后。 P85- 例4.2

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

Page 13: 程序一:用 SUBB 指令;将 RET 放在子程序最后。 P85- 例4.2

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 $

Page 14: 程序一:用 SUBB 指令;将 RET 放在子程序最后。 P85- 例4.2

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 $

Page 15: 程序一:用 SUBB 指令;将 RET 放在子程序最后。 P85- 例4.2

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 $

Page 16: 程序一:用 SUBB 指令;将 RET 放在子程序最后。 P85- 例4.2

单片机用内部定时方法产生频率为 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

Page 17: 程序一:用 SUBB 指令;将 RET 放在子程序最后。 P85- 例4.2

有晶振频率为 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

Page 18: 程序一:用 SUBB 指令;将 RET 放在子程序最后。 P85- 例4.2

有晶振频率为 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

Page 19: 程序一:用 SUBB 指令;将 RET 放在子程序最后。 P85- 例4.2

以定时器/计数器 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

Page 20: 程序一:用 SUBB 指令;将 RET 放在子程序最后。 P85- 例4.2

假定单片机晶振频率为 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 $

Page 21: 程序一:用 SUBB 指令;将 RET 放在子程序最后。 P85- 例4.2

每隔 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

Page 22: 程序一:用 SUBB 指令;将 RET 放在子程序最后。 P85- 例4.2

以 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

Page 23: 程序一:用 SUBB 指令;将 RET 放在子程序最后。 P85- 例4.2

试以一片 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

Page 24: 程序一:用 SUBB 指令;将 RET 放在子程序最后。 P85- 例4.2

试以一片 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 个映像区

Page 25: 程序一:用 SUBB 指令;将 RET 放在子程序最后。 P85- 例4.2

以译码编址方式,把 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: