分支实验.docx

上传人:b****4 文档编号:3699172 上传时间:2022-11-24 格式:DOCX 页数:15 大小:20.01KB
下载 相关 举报
分支实验.docx_第1页
第1页 / 共15页
分支实验.docx_第2页
第2页 / 共15页
分支实验.docx_第3页
第3页 / 共15页
分支实验.docx_第4页
第4页 / 共15页
分支实验.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

分支实验.docx

《分支实验.docx》由会员分享,可在线阅读,更多相关《分支实验.docx(15页珍藏版)》请在冰豆网上搜索。

分支实验.docx

分支实验

《微机实验》报告

实验名称分支程序设计实验

专业班级姓名学号序号

联系方式

一、任务要求

1.设有8bits符号数X存于外部RAM单元,按以下方式计算后的结果Y也存于外部RAM单元,请按要求编写程序。

2.利用51系列单片机设计一个24小时制电子时钟,电子时钟的时、分、秒数值分别通过P0、P1、P2端口输出(以压缩BCD码的形式)。

P3.0为低电平时开始计时,为高电平时停止计时。

a.实现4位十进制加、减1计数,千位、百位由P1口输出;十位、个位由P2口输出。

利用P3.7状态选择加、减计数方式。

b.利用P3口低四位状态控制开始和停止计数,控制方式自定。

二、设计思路

1.分段函数程序:

将R1设置为标志位。

从外部RAM取出X,先判断X与40的大小,再判断X与20的大小。

当X大于等于40时,标志位设置为11H;X小于等于20时,标志位设置为01H;20

再对标志位进行判断,当标志位等于10H时,跳转至分支语句执行X/2的操作;当标志位大于10H时,跳转至分支语句执行求X非的操作;当标志位小于10H时,跳转至分支语句执行求X平方的操作。

最后将X计算结果赋给片外RAM。

2.时钟程序:

编写延时子程序,延时为1S。

每调用一次延时程序,秒加一,调整为BCD码后由P2口输出。

累加到60秒时,秒清0,分加一,调整为BCD码后由P1口输出。

累加到60分时,分清0,小时加一,调整为BCD码后由P0口输出。

到达24小时以后,程序重新初始化。

3.实现4位十进制加、减1计数程序:

利用P3.7状态判断加一还是减一。

若P3.7为1,则加一,否则减一。

在加法程序中,每次完成加一后对当前位进行BCD码调整,并判断是否进位。

若进位则高位加一,低位置零,同时对高位进行BCD码调整。

当最高位溢出时,重置四位数。

在减法程序中,每次完成减一后先判断是否借位,借位则高位减一,低位置99。

再对低位进行BCD码调整。

若减到0,则对四位数重置。

最后将四位数由P1,P2输出。

4.P3口低四位控制计数:

当P3口低四位中D3,D2位为0,而D1,D0不全为0时,做加一运算,当P3口低四位中D1,D0位为0,而D3,D2不全为0时,做减一运算,其他情况不加也不减。

在加法程序中,每次完成加一后对当前位进行BCD码调整,并判断是否进位。

若进位则高位加一,低位置零,同时对高位进行BCD码调整。

当最高位溢出时,重置四位数。

在减法程序中,每次完成减一后先判断是否借位,借位则高位减一,低位置99。

再对低位进行BCD码调整。

若减到0,则对四位数重置。

最后将四位数由P1,P2输出。

三、资源分配

1.分段函数程序:

1000H:

x

1001H:

Y高位,余数,取非结果

1002H:

Y低位,商

R1:

标志位

2.时钟程序:

R0:

R1:

R2:

R3至R7:

计时循环

3.实现4位十进制加、减1计数程序:

R1:

千位,百位

R2:

十位,个位

30H:

暂存R2

R4:

暂存A

P3.7=0,减,P3.7=1,加

4.P3口低四位控制计数:

R1:

千位,百位

R2:

十位,个位

30H:

暂存R2

R4:

暂存A

R5:

标志位

四、流程图

1.分段函数程序:

开始

取出X值

Y

FLAG=11HH

X=40?

N

Y

X>40?

FLAG=11H

N

Y

FLAG=01H

X=20?

Y

FLAG=01H

N

X<20?

N

FLAG=10H

FLAG=10H?

X/2

Y

N

N

Y

X取非

X取平方

CY=0?

结果存入1001H,1002H

结束

2.时钟程序:

开始

N

P3.0=0?

Y

调用延时子程序

R2加一(秒)

P2口输出

N

R2=3CH?

R1加一(分),R2=0

Y

N

P1口输出

R1=3CH?

P0口输出

Y

R0加一(时),R1=0

N

Y

R0=0

R0=18H?

3.实现4位十进制加、减1计数程序:

开始

P3.7=1?

Y

N

N

R2减一

R2加一

是否出现借位?

对R2做BCD码调整

Y

R2是否有进位?

N

R2=99H,R1减一

Y

调整R2

Y

R1=0?

R1加一

对R1做BCD码调整

Y

N

R1是否溢出?

N

P1,P2输出四位数

结束

 

开始

4.P3口低四位控制计数:

屏蔽P3口高四位

Y

P3口低四位是否等于3

FLAG=01H

N

N

FLAG=01H

CY=0?

Y

Y

FLAG=11H

P3口低四位是否等于12

N

Y

P3口低四位是否等于8

FLAG=11H

N

Y

P3口低四位是否等于4

FLAG=11H

N

FLAG=10H

FLAG=10H?

N

CY=1?

Y

N

R2加一

R2减一

R1加一

R2是否有进位?

对R2做BCD码调整

R1是否溢出?

对R1做BCD码调整

R1=0?

调整R2

R2=99H,R1减一

是否出现借位?

N

Y

Y

Y

Y

N

N

N

P1,P2口输出四位数

结束

 

五、源代码(含文件头说明、资源使用说明、语句行注释)

1.分段函数程序:

;1000H:

x

;1001H:

Y高位,余数,取非结果

;1002H:

Y低位,商

;R1:

标志位

FLAGEQUR1

ORG0000H

LJMPMAIN

ORG0200H

MAIN:

MOVDPTR,#1000H;X存于1000H

MOVA,#25H

MOVX@DPTR,A;给X赋值

MOVXA,@DPTR;获取X

CJNEA,#40H,NOFORT;判断X是否为40

MOVFLAG,#11H;若X=40,标志位置11H

SJMPCALCULAT;跳转至计算步骤

NOFORT:

JCJUDGETW;X不为40,判断是否大于40

MOVFLAG,#11H;若X>40,标志位置11H

SJMPCALCULAT;跳转至计算步骤

JUDGETW:

CJNEA,#20H,LESSTW;若X小于40,判断是否等于20

MOVFLAG,#01H;若X=20,标志位置01H

SJMPCALCULAT;跳转至计算步骤

LESSTW:

JNCMID;若X不为20,判断是否小于20

MOVFLAG,#01H;若小于20,标志位置01H

SJMPCALCULAT;跳转至计算步骤

MID:

MOVFLAG,#10H;若20

CALCULAT:

CJNEFLAG,#10H,CASE1;标志位与10H比较

MOVB,#2

DIVAB;若为10H,X/2

SJMPSTORE1;跳转至存储步骤

CASE1:

JNCCASE2;判断标志位是否小于10H

CPLA;若小于10H,A取非

SJMPSTORE2;跳转至存储步骤

CASE2:

MOVB,A;若标志位大于10H,X取平方

MULAB

STORE1:

MOVR2,A;对乘除法存储

MOVA,B

INCDPTR

MOVX@DPTR,A;计算结果Y高位,余数存于1001H

MOVA,R2

STORE2:

INCDPTR

MOVX@DPTR,A;取非,低位,商存于1002H

SJMP$;踏步

END

2.时钟程序:

;R0:

;R1:

;R2:

;R3-R7:

计时循环

ORG0000H

LJMPMAIN

ORG0200H

MAIN:

MOVR0,#0;初始化R0

MOVR1,#0;初始化R1

MOVR2,#0;初始化R2

MOVP0,#0;初始化P0

MOVP1,#0;初始化P1

MOVP2,#0;初始化P2

STAY:

JBP3.0,STAY;判断P3.0电平

SEC:

LCALLDELAY;调用计时函数

INCR2;秒加1

MOVP2,R2;P2口输出秒

CJNER2,#3CH,STAY;判断是否到60秒

MOVR2,#0;秒清0

INCR1;分加1

MOVP1,R1;P1口输出分

CJNER1,#3CH,STAY;判断是否到60分

MOVR2,#0;分清0

INCR0;小时加1

MOVP0,R0;P0口输出小时

CJNER0,#18H,STAY;判断是否到24小时

MOVR0,#0;小时清0

AJMPSTAY

DELAY:

MOVR7,#28H;延时5us

LOOP5:

MOVR6,#05H

NOP

NOP

LOOP4:

MOVR5,#05H

NOP

LOOP3:

MOVR4,#05H

NOP

LOOP2:

MOVR3,#41H

NOP

LOOP1:

NOP

DJNZR3,LOOP1

DJNZR4,LOOP2

DJNZR5,LOOP3

DJNZR6,LOOP4

DJNZR7,LOOP5

RET

END

3.实现4位十进制加、减1计数程序:

;R1:

千位,百位

;R2:

十位,个位

;30H:

暂存R2

;R4:

暂存A

;P3.7=0,减,P3.7=1,加

ORG0000H

LJMPMAIN

ORG0200H

MAIN:

MOVA,#99H;四位数赋值

MOVR1,A

MOVA,#79H

MOVR2,A

JUDGE:

JBP3.7,ADDUP;若p3.7=1,加1;否则减1

DEDUCE:

DECR2;R2减1

CJNER2,#0FFH,ADJUST;判断R2是否借位

MOVR2,#99H;借位则置99

DECR1;R1减1

ADJUST:

MOV30H,R2;R2存于30H

MOVA,#0H;调整R2低位

ADDA,R2

DAA

MOVR4,A

CLRC

SUBBA,30H;判断是否调整

JZNADJ

MOVA,R4

SUBBA,#10H;若调整,则对R2高位减1,低位补4

ADDA,#04H

MOVR4,A

NADJ:

MOVA,R4

MOVR2,A

CJNER1,#0,CONTNUE;R1为0重置

SJMPMAIN

ADDUP:

INCR2;R2加1

MOVA,#0;调整R2

ADDA,R2

DAA

MOVR2,A

CJNER2,#00H,CONTNUE;判断是否进位

INCR1;进位则R1加1

MOVA,#0;调整R1

ADDA,R1

DAA

MOVR1,A

CJNER1,#00H,CONTNUE;若R1溢出

SJMPMAIN;重置

CONTNUE:

MOVP1,R1

MOVP2,R2

SJMPJUDGE

END

4.P3口低四位控制计数:

;R1:

千位,百位

;R2:

十位,个位

;30H:

暂存R2

;R4:

暂存A

;R5:

标志位

;若p3.0低二位不全为0且3,4位为0,则加1;低二位为0且3,4位不全为0,则减1;否则不改变

FLAGEQUR5

ORG0000H

LJMPMAIN

ORG0200H

MAIN:

MOVA,#99H;四位数赋值

MOVR1,A

MOVA,#09H

MOVR2,A

JUDGE1:

MOVA,P3

ANLA,#0FH;屏蔽P3高四位

CJNEA,#03H,COMP1;判断P3口值与3的关系

MOVFLAG,#01H;若等于3,则标志位置#01H

SJMPJUDGE2;跳转至标志位判断

COMP1:

JNCCOMP2;若小于3,标志位置#01H

MOVFLAG,#01H

SJMPJUDGE2;跳转至标志位判断

COMP2:

CJNEA,#0CH,COMP3;判断P3口值是否等于12

MOVFLAG,#11H;若相等,则标志位置11H

SJMPJUDGE2;跳转至标志位判断

COMP3:

CJNEA,#08H,COMP4;判断P3口值是否等于8

MOVFLAG,#11H;若相等,则标志位置11H

SJMPJUDGE2;跳转至标志位判断

COMP4:

CJNEA,#04H,REST;判断P3口值是否等于4

MOVFLAG,#11H;若相等,则标志位置11H

SJMPJUDGE2;跳转至标志位判断

REST:

MOVFLAG,#10H;其他情况则标志位置10H

JUDGE2:

CJNEFLAG,#10H,COMP5;判断标志位与10H关系,相等则不加也不减

SJMPCONTNUE

COMP5:

JCADDUP;若为01H,则进入加法,否则进入减法

DEDUCE:

DECR2;R2减1

CJNER2,#0FFH,ADJUST;判断R2是否借位

MOVR2,#99H;借位则置99

DECR1;R1减1

ADJUST:

MOV30H,R2;R2存于30H

MOVA,#0H;调整R2低位

ADDA,R2

DAA

MOVR4,A

CLRC

SUBBA,30H;判断是否调整

JZNADJ

MOVA,R4

SUBBA,#10H;若调整,则对R2高位减1,低位补4

ADDA,#04H

MOVR4,A

NADJ:

MOVA,R4

MOVR2,A

CJNER1,#0,CONTNUE;R1为0重置

SJMPMAIN

ADDUP:

INCR2;R2加1

MOVA,#0;调整R2

ADDA,R2

DAA

MOVR2,A

CJNER2,#00H,CONTNUE;判断是否进位

INCR1;进位则R1加1

MOVA,#0;调整R1

ADDA,R1

DAA

MOVR1,A

CJNER1,#00H,CONTNUE;若R1溢出

SJMPMAIN;重置

CONTNUE:

MOVP1,R1

MOVP2,R2

SJMPJUDGE1

END

六、程序测试方法与结果、软件性能分析

利用KeilC的单步调试与断点调试观察程序运行结果。

程序能够完成预期功能。

七、心得与体会

1)思考题:

1.实现多分支结构程序的主要方法有哪些?

举例说明。

答:

分支较少时,可以利用条件转移指令判断与临界值关系实现多分支结构。

如本实验内容1。

分支较多时,采用分支表实现多向分支。

例如:

根据R3的值控制8个分支程序。

可利用如下程序:

MOVDPTR,#JMPTAB

MOVA,R3

ADDA,R3

JNCNADD

INCDPH

NADD:

JMP@A+DPTR

JMPTAB:

AJMPSUBR0

AJMPSUBR1

AJMPSUBR7

2.在编程上,十进制加1计数器与十六进制加1计数器的区别是什么?

怎样用十进制加法指令实现减1计数?

答:

十进制加一计数器在运算后需要调用BCD码调整程序对结果进行调整,而十六进制加一计数器则不用。

利用十进制加法指令实现减一计数:

设减数存放于R2中

MOVA,R2

ADDA,#0FFH

DAA

MOVR2,A

2)实验体会:

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1