编程实现将内部RAM_第1页
编程实现将内部RAM_第2页
编程实现将内部RAM_第3页
编程实现将内部RAM_第4页
编程实现将内部RAM_第5页
已阅读5页,还剩57页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

内容示意图00H69H99H68H88H67H77H66H66H65H55H64H44H63H33R62H22H61H11H60HOFFH00HOFOHODEHOBCH9AH78H56H34I12H内容39H38H37H36H35H34H33H32H31H30H地址1、编程实现将内部RAM30H开始的10个单元内容和60H开始的10

个单元内容对应一一互相交换,单元内容自定,交换前内部RAM地址内容地址OFFH69H00H68HOFOH67HODEH66HOBCH65H9AB64H78H63H56H62H34H61H12H60HI00H39H99H38H88H37H77H36H66H35H55H34H44H33H33H32H22H31H11H30H交换后内部RAM示意图内容地址1、程序功能----数据交换2、

程序结构----循环结构环3、

数据存放位置----均在内部RAM4、

传送方式-----顺序传送XCH/

MOVDJNZ

循R0,R1寻址指针同时INC解题思路:ORG

0000HMOVR0,#30HMOV

R1,#60HMOV

R7,#10LOOP:MOVA,ROXCH

A,R1MOV

RO,AINC

ROINC

R1DJNZ

R7,LOOP开始设置源指针R0设置目的指针R1

设置计数器R7取源数据→AA←→

目的单元A→

源数据单元修改源指针R0修改目的指针R1过数器R7-1-0结束SJMPENDN$解题思路:1、程序功能----无符号数比较

2、程序结构--分支程序3、数据存放位置—-内部RAM2、编程比较内部RAM中X单元和Y单元存放的两个无符号数,找出其

中的较大数,放入Z单元中.二数相减,判断借位标志.

条件判断指令JC/JNC伪指令定义X、Y、ZX

EQU

20HY

EQU

30HZ

EQU

40HORG

0000HMOV

A,XCLR

CSUBB

A,YJNC

L1开始X

-Y有借位吗?MOVSJMPL1:MOVEN:SJMPENDNX→ZYY>ZZ,YENZ,X$结束3、

编程比较内部RAM中X单元和Y单元存放的两个有符号数,

找出其中的较大数,放入Z单元中。解题思路:1、

基本思路同上一题2、重点是判断有符号数的方法利用溢出标志0V的状态来判断两个有符号数的大小.若X-Y为正数,则

OV=0时

X>Y;OV=1

时X<Y.若X

-Y为负数,则

OV=0

X<Y;OV=1

X>Y.Z

<XN旗工请转A-X骄Z

<

人N2田要单NZ←A人乙田要单单弱X

EQU

20HY

EQU

30HZ

EQU

40HORG

0000HMOV

A,XCLR

CSUBB

A,YACC.7,NGPSW.2

LTGT:MOV

Z,XSJMP

ENNG:

PSW.2,GTLT:MOVZ,YEN:SJMP$ENDOFH36HOFH46HOAH35HOAH45H90H34H90H44H78H33H78H43H56H32H56H42H34H31H34H41H12H30H12H40H07H2FHXXH3FH内容地址内容地址4、

编程实现数据传送:假定数据串存放在内部RAM从30H

开始的连

续单元中,数据串长度存放在2FH单元,传送的目的区起址是内部RAM从40H开始的连续单元.<具体数据可以自己设定>1、程序功能----数据传送2、

程序结构----循环结构环3、

数据存放位置-----均在内部RAM4、

传送方式----顺序传送MOVDJNZ

循R0,R1寻址指针同时INC解题思路:ORG

0000HMOVR0,#2FHMOVR1,#40H

MOV

A,R0MOV

R7,AINC

ROLOOP:MOV

A,ROMOV

R1,AINC

ROINC

R1DJNZ

R7,LOOPSJMP

$END开始设置源指针R0设置目的指针R1

设置计数器R7取源数据→AA→

目的单元修改源指针R0修改目的指针R1过数器R7-1-0结束N12H46H34H45H56H44H78H43H90H42HOAH41HOFH40HXXH3FH5、

编程实现数据传送:假定数据串存放在内部RAM从30H开始的连

续单元中,数据串长度存放在2FH单元,传送的目的区起址是内部RAM从40H开始的连续单元.<数据按反向顺序传送>OFHOAH90H78H56H34H12H07H内容36H35H34H33H32H31H30H2FH地址内容

地址解题思路:1、

程序功能----数据传送2、

程序结构----循环结构3、

数据存放位置----均在内部RAM4、传送方式----反向传送DEC反向传送的关键是要设置好指针的初始化值,数据

区的开始地址容易找到,一般程序中都表示出来了,但数据

区的结束地址比较难找,它和数据的长度有关.MOVDJNZ

环R0,R1寻址指

一INC、一开始设置源指针R0设置目的指针R1设置计数器R7取源数据→AA→

目的单元修改源指针R0修改目的指针R1过数器R7-1-0结束DEC

R1INC

ROLOOP:MOVA,ROMOVR1,AINC

R0DEC

R1DJNZR7,LOOP0000HRO,#2FHR1,#40HA,R0R7,AA,R1R1,AORGMOVMOVMOVMOVADDMOVSJMPENDN$1、程序功能----数据传送2、

程序结构----循环结构环3、

数据存放位置-----均在外部RAM4、

传送方式----顺序传送需要2个16位指针6、

编程实现数据传送:假定数据串存放在外部RAM

0001H

始的单元中,其中数据串的长度存放在0000H

单元,传送的目的区起址

部RAM1000H

.解题思路:MOVXDJNZ

循DPTR寻址指针同时INC开始设置源指针DPTR设置目的地址R2,RS

设置计数器R7取源数据

→A保存DPTR值

设置目的指针A→

目的单元修改目的指针

保存目的地址恢复源指针修改源指针DPTR过数器R7-1

-0结束NORG

0000HMOV

DPTR,#000OHMOV

R2,#10HMOV

R3,#0OHMOVX

A,DPTR

MOVR7,AINC

DPTRLOOP:MOVXA,DPTRPUSH

DPHPUSHDPLMOV

DPH,R2MOVDPL,R3MOVX

DPTR,AMOVRO,#0000H

MOV

R1,#1000H可以这样使用吗?INC

DPTRMOVR2,DPHMOV

R3,DPLPOP

DPLPOPDPHINC

DPTRDJNZ

R7,LOOPSJMP

$END7、

编程实现数据传送:假定数据串存放在外部RAM

0000H开始的

单元中,传送的目的区起址是外部RAM

1000H单元.需传送的数据串

个数事先并不知道,但数据串有一个结尾标志0DH.解题思路:1、

程序功能----数据传送2、

程序结构----循环结构环3、

位置----均在外部RAM4、

传送方式----

顺序传送MOVXCJNE

循DPTR寻

址指针同时INC需

2

1

6

针开始设置源指针DPTR设置目的地址R2,R3

设置计数器R7取源数据→A=0DH

?N保存DPTR

设置目的指针A→

目的单元修改目的指针保存目的地址结束恢复源指针修改源指针DPTRORG0000HMOVDPTR,#00O1HMOVR2,#10HMOV

R3,#00HLOOP:MOVX

A,DPTRCJNE

A,#ODH,NEXTSJMPOVERNEXT:PUSH

DPHPUSH

DPLMOVMOVMOVXINCMOVMOVPOPPOPINCSJMPOVER:SJMPENDDPH,R2DPL,R3DPTR,ADPTRR2,DPHR3,DPLDPLDPHDPTRLOOP$8、

设有两串多字节二进制数,分别存放在内部RAM从30H和40H开始

的连续单元中〔低位在前高位在后,现要将这两串数据相加,结果存

放在从30H开始的连续单元中,数据串的长度在RO中

.(要保存最高

位进位数据例如:

BA9876543210H+665544332211HR0

=06H内容

地址66H45H55H44H44H43H33H42H22H41H11H40HOBAH98H76H54H32H10H内容35H34H33H32H31H30H地址相加

前RAM

容01H36H20H35HOEDH34HOBAH33H87H32H54H31H21H30H66H45H55H44H44H43H33H42H22H41H11H40HBA9876543210H+

665544332211H内容

地址相加

后RAM

容120EDBA875421H内容地址ORG

0000HMOV

R7,R0MOVR0,#30HMOVR1,#40HCLR

CRADD:

MOVA,ROADDC

A,R1MOV

R0,AINC

R0INC

R1DJNZ

R7,RADDCLRAADDC

A,#0MOV

R0,ASJMP$END保存高位进位位的

方法还有其他什么方法吗?位

法JC

NEXTMOV

RO,#00HCLR

ARLC

AMOV

R0,ASJMP

$SJMPOVERNEXT:MOVR0,#01H移

法OVER:

SJMP$9、设有两串多字节BCD码(即十进制数数,分别存放在内部RAM从30H和外部RAM4000H开始的连续单元中,现要将这两串数据相加,结

果存放在从外部RAM4000H

开始的连续单元中,数据串的长度在R1中

.〔忽略最高位进位数据例如:332836543210H+665544332211H66H4005H55H4004H44H4003H33H4002H22H4001H11H4000H33H28H36H54H32H10H内容35H34H3332H31H30H地址内容

地址前RAM内

容十十十十

十相

加R1=06H99H4005H83H4004H80H4003H87H4002H54H4001H21H4000H+35H34H33H32H31H30H地址332836543210H665544332211H998380875421H内容

地址内

容33H28H36H54H32H10H内容相

后RAM开始设置源指针R0设置目的指针DPTR

设置计数器R7取源数据→A加上目的单元加数DA

A

调整A→

日的数据单元修改源指针N1

器R7-1-02结束修改目的指R针0DPTRORG

0000HMOVR7,R1MOV

R0,#30HMOV

DPTR,#4000HCLR

CRADD:MOVX

A,DPTRADDC

A,RODA

AMOVXDPTR,AINCR0INCDPTRDJNZ

R7,RADDSJMP

$ENDRAlDD:MOV

A,

ROADDC

A,DPTRDA

AMOVXDPTR,A可以这样替换吗

?答案:不能原因:ADDC

A,

DPTR指令非法1、

程序功能----数据转换2、

程序结构----循环结构环3、

数据存放位置----一个内部一个外部

址4、

传送方式----顺序传送的指针+210、

部RAM

从20H

开始的连续单元中存放着4字节的BCD码,现要

求将每一个BCD码(一字节存放两个BCD码转变成对应的ASCII

码,并

存放在外部RAM从3000H开始的连续单元中。ANL

/

ORLDJNZ

循R0,DPTR

寻源指针+1,目解题思路:38H3007H37H3006H35H3005H36H3004H33H3003H34H3002H31H3001H32H3000H地址

内容23H78H22H56H21H34H20H12H内

部RAM外

部RAM内容地址开始设置源指针R0设置目的指针DPTR设置计数器R7取源数据

→A保存A

中数据到R2求低4位数据的ACSⅡ

码A

→送目的单元恢复R2

中数据到A求高4位数据的ACSⅡ

码修改目的指针DPTRA→送目的单元修改源指针R0修改目的指针DPTR过敏器R7-1=0结束NORGAJMPORGSTA:

MOVMOVMOVLOOP:MOV0000HSTA0030HDPTR,#3000HR0,#20HR7,#4A,ROMOVR2,AANL

A,#OFHORLA

,#30HMOVXDPTR,AORL

A,#30HINCDPTRMOVXDPTR,AINC

R0INCDPTRDJNZR7,LOOPSJMP$AA,#OFHMOV

A,R2SWAPANLEND63H37HOBH36H00H35H5AH3484EH33H38H32H22H31HOCH30H11、

编程将内部RAM

从40H

开始的连续单元中存放着8个单字

节的压缩BCD码,转变成单字节的二进制数,并存放在内部RAM

从30H

开始的连续单元中.47H46H45H44H43H42H41H40H地址99H11H00H90H78H56H34H

12H

内容内容

地址内

RAM内

RAM解题思路:1、程序功能----数据转换

ANL/ORL2、

-

-

-

-

DJNZ

循环3、

数据存放位置----均在内部RAM

R0,R1寻址4、传2位BCD数转换为二进制数的方INC/DEC

法BCD

数高4

数据(

)

X10十

BCD

数低4位数据

(个位)普通二进制数据开始设置源指针R0设置目的指针R1

设置计数器R7取源数据→A保存A

中数据到R2

取高4位数据→AA.

K

10

→A保存A

中数据到B恢复R2中数据到A修改源指针R0修改目的指针R1过敏器R7-1=0

2取低4位教据→AA+B>A沙目

的单元结束NMOV

A,R2ANL

A,#OFHADD

A,BMOV

R1,AINC

R0INCR1DJNZ

R7,LOPSJMP$ENDORGMOVMOVMOVLOP:MOVMOVANLSWAPMOVMULMOV000OHR0,#40HR1,#30HR7,#8A,ROR2,AA,#OFOHAB,#10ABB,A3007H37H3006H35H3005H30H3004H39H3003B38H3002H36H3001H34H3000H31H12、

将外部RAM从地址3000H开始连续8个单元的ASCII码分别

转换成BCD码,并组成压缩BCD码存放在内部RAM从地址30H开

始的连续4个单元中。57H33H90H32H68H31H14H30H内容

地址外

部RAM内

RAM内容地址解题思路:1、

程序功能----数据转换2、

程序结构----循环结构3、

数据存放位置----一个内部一个外部4、

-

-

-

-

送指针+12个ASCII码合成1个压缩BCD

码18HASCII

-30H

=

缩BCD

码高位非压缩BCD

码高低4位互换ANL

/

ORLDJNZ

控制循

环R0,DPTR

源指针+2,目的31H,38H01H,08H10H取源数据→AA-30H

>AA

中高低4位互换

保存A

中数据到R2源指针+1取源数据

→AA-30H

→A开始设置源指针DPTR

设置目的指针R0

设置计数器R7修改源指针DPTR

修改目的指针R0过敏器R7-1=0

2A+

R2

→AA→

目的单元结束N000OHR0,#30HDPTR,#3000HR7,#4A,DPTRA,#0FHAR2,ADPTRA,DPTRA,#OFHORGMOVMOVMOVLOP:MOVXANLSWAPMOVINCMOVXANLADD

A,R2MOV

R0,AINC

R0INC

DPTRDJNZ

R7,LOPSJMP

$END3007H55H3006H02H3005H53H3004H01H3003H20H3002H01H3001H26H3000H00H13、

编程将内部RAM从地址30H开始连续4个单元的单字节二进制

数分别转换成2字节的压缩BCD码(即00H~FFH转换为0000H~

0255H,存放在外部RAM从地址3000H开始的连续8个单元中,OFFH33H99H32H78H31H1AH30H内容

地址内容地址BCD码是每4位二进制数表示一位十进制数.本例所要

求转换的最大BCD码为255,需要12位二进制数,超过了一个

字节<8位>,因此我们把高4位存放在30H的低4位,高4位清

零;低8位存放在31H中.转换的方法是将A中二进制数除以100、10,所得商即

为百、十位数,余数为个位数.0000001030H0101010131H设置源指针R0设置目的指针DPTR

设置计数器R7取源数据→AA除以100A>

目的单元目的指针+1B

中余数再除以10修改源指针R0修改目的指针DPTR过敏器R7-1=0

2A中商低4位互换A+B>AA

元开始结束NORG

0000H

INCROMOV

R0,#30H

INCDPTRMOV

DPTR,#3000H

DJNZ

R7,LOOPMOV

R7,#4

SJMP

$LOOP:MOV

A,RO

ENDMOV

B,#100DIVAB

;除法指令,A/B→商在A中,余数在B中MOVX

DPTR,A;把商<百位数>存在目的单元中INC

DPTRMOV

A.#10XCH

A,B

;余数交换到A中,B=10DIVAB

;A/B→

商<十位>在A

中,余数<个位>在B

中SWAP

;十位数移到高半字节ADD

A,B

;十位数和个位数组合在一起MOVX

DPTR,A14、

问题如下:在外部RAM有一串二进制数,现要对该数串进行处理

,如何进行处理由累加器A的内容决定,具体如下:<A>=00:将该数据区清零;<A>=01:找出最大值,存放在内部RAM30H单元;

数,若转有

码1"

0,否则清零.

<A>=04:将该串数据从小到大排序。请编写实现上述功能的主程序,具体功能用调用子程序实现.子

程序具体内容不用编写,只要用一条RET指令返回即可.解题思路:F;置BC字OAAH二进制::0302AA1、

程序功能----散转程序A+DPTR2、

程序结构--多重分支JMPJMPA0:

LCALLQLSJMP$Al:LCALLMAXSJMP

$A2:

LCALLBCDSJMP

$A3:

LCALLCZSJMP

$A4:

LCALLPXSJMP

4QL:RET0000HSTART0030HB,AA,BDPTR,#TABA+DPTRA0A1A2A3A4ORGLJMPORGMOVRLA

ADD

MOVJMPLJMPLJMPLJMPLJMPLJMPSTART:TAB:解题思路:1、程序功能-----数据查找2、

程序结构----循环结构环3、

数据存放位置----内部RAM15、

编程查找内部RAM

的32H~41H单元中是否有

OAAH这个

数据,若有这一数据,则将将50H单元置为

OFFH,否则清50H单元

0

.CJNE

比较指DJNZ

循R0寻址开始设置源指针R0

设置计数器R7取源数据→A是0AAH

?N源数据指针+1数器R7-1-0#00H→50H结束#0FF→50HNMOV50H,#OFFHSJMP

OVERNEXT:INC

R0DJNZR7,LOOPMOV

50H,#00HOVER:SJMP

$END答案:不能原因:这是一条位操作指令ORGMOVMOVLOOP:MOVCLR50H可以用这条指令代替吗?0000HR0,#32HR7,#16A,R0CJNEA,#OAAH,NEXT16、

已知单片机晶振为12MHz,

请设计一个延时1s的子程序.解题思路:1、

-

-

软件延时2、

程序结构---多重循环结构

DJNZ

循环3、

时钟周期、机器周期和指令周期时钟周期T时钟是计算机基本时间单位,同晶振频率有关.题目给定fosc=12MHz,那么T时钟=1/fosc=1/12MDELAY:MOV

R0,#100;延时1s的循环次数DEL2:MOVR1,#10;延时10ms

的循环次数DEL1:MOVR2,#250;

1ms

数DELO:NOPNOPDJNZ

R2,DELODJNZ

R1,DEL1DJNZRO,DEL2RET;1μs;

1μs;2

μs程序说明本例中,第二层循环和外循环都采用了简化计算方法,编程

关键是延时1ms

的内循环程序如何编制.首先确定循环程序段

的内容如下:内循环次数设为count,计算方法如下式:〔一次循环时间×count=1ms从而得到count=

1ms/<1μs+1μs+2

μs>=250NOPNOPDJNZ;1;1μs;2R2,DELOμsμs17、编程查找20H~4FH

单元中出现00H的次数,并将查找结果

50

H

单元

.解题思路:1、

程序功能-----数据查找统计令2、程序结构-----循环结构环3、

数据存放位置

-

-

-

-

内部RAM4、

使

数CJNE

比较指DJNZ

循R0

寻址R2查找数据一般用CJNE

指令,但本例中查找的数据开始设置源指针R⁰初始化计数器

设置计数器R7取源数据

→A是

0

0H

?V计数器+1源数据指针+1过数器R7-1-0计数值

50H结束JNZINCNEXT:INCDJNZMOVSJMPENDNEXTR2R0R7,LOOP50H,R2$0000HRO,#20HR2,#00HR7,#48ORGMOVMOVMOVLOOP:MOV

A,RONN18、

内部

RAM的30H

开始的区域中存放着10个单字节十进制

数,求其累加和,并将结果存入40H

和41H

单元.88H

99H

37H

21H80H79H

58H

26H

34H+11H533H39H38H37H36H35H34H33H32H31H30H地址88H99H37H21H80H79H58H26H34H11H内容ORGMOVMOVMOV

MOVCLRLOOP:MOVADDCDAMOVCLR

ADDCDAMOVDJNZSJMPEND开始设置源指针R0初始化结果单元

设置计数器R7取源数据→A加结果低字节加结果高字节源数据指针+1数器R7-1-0结束0000HRO,#30H40H

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论