单片机实验二 (2)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验二 分支程序设计

软件121 张乐梅 122516

一、 实验目的

1. 进一步熟悉MCS-51指令系统,了解汇编语言程序设计的基本结构。

2. 掌握分支结构程序设计的方法。

3. 学会用条件转移指令、CJNE 、JMP 及其配合使用来编写二分支、三分支和多分支程序。

二、 实验内容

1. 二分支的条件转移程序

设变量X 存放于R0,函数值Y 存放在R1,其中X 、Y 均为二进制数。试按照下式的要求给Y 赋值:

程序框图如图3-5所示: :

三、实验步骤

1. 根据实验内容和参考程序流程图,编出相应的分支结构程序。

2. 输入程序,汇编成功;

Y= 1 X>0 0 X=0

-1 X<0

3.用F4(执行到光标处)、F7(跟踪执行)、F8(单步执行)或断点运行等方式调试程序;

4.观察程序的流程,记录运行结果。

四、思考题

1.CJNE指令对CY 有影响吗?用CJNE 和JC/JNC指令配合应注意什么?

在用JMP 指令前,若变址 255怎么办?

(1)CJNE指令对CY 有影响。CJNE (目的字节),(源字节),rel 功能:目的字节与源字节比较,相等则继续执行,不相等则转移,同时,

若目的字节>=源字节,(C)=0 若目的字节<源字节,(C)=1

(2)选取好正确的direct值以便确定Cy的值

(3)提前设好变址,使变址<255

2.用什么指令可以实现多分支之间的隔离?

控制、条件转移指令,包括JMP、CJNE、DJNZ、JC、JB等,可以转移到$或其他。五、实验报告要求

写出题目运行结果。

六、参考程序清单

1、二分支的条件转移程序

1)用二分支结构程序实现:

ORG 0000H

AJMP 0050H

ORG 0050H

MAIN:

MOV A,R0

JZ LOAD //累加器为0转移LOAD

JNB ACC.7,GO //最高位为0,即大于0

MOV A,#0FFH//小于0为-1

SJMP LOAD

GO:

MOV A,#01H//大于0为1

LOAD:

MOV R1,A

SJMP $

END

R0中为-2时,R1中为-1;R0中为0时,R1中为0;R0中为2时,R1中为1

2)用三分支结构程序实现:

ORG 0000H

AJMP 0050H

ORG 0050H

MAIN:

MOV A,R0

JNZ COMP

MOV R1,#00H

SJMP MP3

COMP:

CJNE R0,#80H,MP1 //不等转移,大于0时CY为1,否则为0

MOV R1,#0FFH

LJMP MP3

MP1:

JC MP2 //CY为1,即大于0时转到MP2

MOV R1,#0FFH

LJMP MP3

MP2:

MOV R1,#01H

MP3:

SJMP $

END

R0中为-2时,R1中为-1;R0中为0时,R1中为0;R0中为2时,R1中为1

循环程序设计

一、实验目的

1.进一步熟悉MCS-51指令系统,了解汇编语言程序设计的基本结构。掌握循环结构

程序设计的方法,弄清单重及多重循环控制过程。

2.掌握典型算法:冒泡排序法。

二、实验内容

设计循环程序:冒泡法排序。

具体要求:设单片机8031外部RAM从3600H单元开始存放10个无符号数,试编写程序能使它们按从大到小的顺序排列(最大数存放在3600H单元)。

三、实验步骤

1.输入预先编好的程序,汇编成功;

2.用自动单步方式执行程序,观察循环计数器的变化情况。

3.用断点运行方式调试排序程序,记录排序过程。

四、参考流程图

程序流程图如图3-7所示。

五、循环结构程序参考清单:

冒泡法排序法参考程序清单:

ORG 0000H

AJMP 0050H

MAIN:

MOV PSW,#00H

MOV P2,#36H //A0H处为36

MOV R2,#10-1 //r2 为0x09

LPP0:

MOV R0,#00H

MOV R1,#01H //r1:0x01

MOV 03H,R2 //01H:01;02H:09;03H:09

CLR 7FH;

LPP1:

MOVX A,@R0//运行至此计数器r3减一

MOV 30H,A

MOVX A,@R1

CJNE A,30H,LPP2

SJMP LL1

LPP2:

JC LL1 //Cy是1时跳

MOVX @R0,A

XCH A,30H//交换

MOVX @R1,A

SETB 7FH

LL1:

INC R0//r0加一

INC R1//r1加一

DJNZ R3,LPP1

JNB 7FH,LPP3

DJNZ R2,LPP0

LPP3:

SJMP $

END

排序过程:oa 09 00 08 后面全0

0a 09 08 00 后面全0

六、思考题

1、若用DJNZ或CJNE指令来控制循环,编写程序有什么不同?

CJNE指令是减1判别命令,需要在循环次数上加1来完成循环控制;

CJNE则不需要。

2、如何将排序程序修改为只用一个指针?

比如说有一个数组int s[100];,你要对这个数组进行递减排序,可以参考如下代码:int *p=s;

for(int i =0;i<99;i++)

for(int j=0;j<99-i;j++)

{

if(*p<*(p+1))

{

int t;

t=*p;

*p=*(p+1);

*(p+1)=t;

}

}

这样排序完成,同时只用了一个指针。

3、将无符号数排序程序修改为带符号数排序。

相关文档
最新文档