分支与循环程序设计实验.docx

上传人:b****5 文档编号:8790539 上传时间:2023-05-15 格式:DOCX 页数:18 大小:269.11KB
下载 相关 举报
分支与循环程序设计实验.docx_第1页
第1页 / 共18页
分支与循环程序设计实验.docx_第2页
第2页 / 共18页
分支与循环程序设计实验.docx_第3页
第3页 / 共18页
分支与循环程序设计实验.docx_第4页
第4页 / 共18页
分支与循环程序设计实验.docx_第5页
第5页 / 共18页
分支与循环程序设计实验.docx_第6页
第6页 / 共18页
分支与循环程序设计实验.docx_第7页
第7页 / 共18页
分支与循环程序设计实验.docx_第8页
第8页 / 共18页
分支与循环程序设计实验.docx_第9页
第9页 / 共18页
分支与循环程序设计实验.docx_第10页
第10页 / 共18页
分支与循环程序设计实验.docx_第11页
第11页 / 共18页
分支与循环程序设计实验.docx_第12页
第12页 / 共18页
分支与循环程序设计实验.docx_第13页
第13页 / 共18页
分支与循环程序设计实验.docx_第14页
第14页 / 共18页
分支与循环程序设计实验.docx_第15页
第15页 / 共18页
分支与循环程序设计实验.docx_第16页
第16页 / 共18页
分支与循环程序设计实验.docx_第17页
第17页 / 共18页
分支与循环程序设计实验.docx_第18页
第18页 / 共18页
亲,该文档总共18页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

分支与循环程序设计实验.docx

《分支与循环程序设计实验.docx》由会员分享,可在线阅读,更多相关《分支与循环程序设计实验.docx(18页珍藏版)》请在冰点文库上搜索。

分支与循环程序设计实验.docx

分支与循环程序设计实验

实验名称分支与循环程序设计实验成绩

1、任务要求

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

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

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

设计1s延时子程序(延时误差小于10us,晶振频率12MHz)。

提高部分(选做):

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

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

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

 

2、设计思路

任务一:

机器内存入的数默认为无符号数,所以应该先判断正负性。

对于8位有符号数,则范围是-128到127。

如果是负数则直接归到取反区间;如果是正数,则使用两次比较转移指令,并根据CY的值进行区分,最后得出结果。

 

任务二:

判断控制位P3.0是否为0,当P3.0=1时原地踏步重复判断,当P3.0=0时开始计时。

计时开始,计时采用多重循环嵌套最内层是秒钟计时,然后是分钟计时,最后是时钟计时。

先通过一个延时1s的子程序,每运行一次延时子程序秒钟加1,并通过CJNE指令判断是否等于60,等于60则进入分钟计数并将秒钟清零,否则继续循环计时。

当分钟数为60时则向时钟进位,并将分钟数清零。

当时钟数为24时,则重新开始计时。

 

任务三(提高部分):

先通过检查P3口低四位的状态来控制是否计数,存在高电平则不计数。

再检查P3.7端口状态来选择计数模式。

加1计数时采用INCA和DAA指令实现十进制加1计数。

减1计数采用与-1(BCD码形式)补码相加即99H相加实现十进制减1计数。

其中每计数一次延时1s。

 

3、资源分配

任务一:

3000H:

8bit符号数;3001H:

平方低位、商、取反;3002H:

平方高位、余数

任务二:

P0:

显示小时;P1:

显示分钟;P2:

显示秒钟;P3.0:

时钟开关;

R4、R5、R3:

存放循环次数

任务三(提高部分):

P1:

显示千位和百位;P2:

显示十位和个位;P3:

控制计数;

R4、R5、R3:

存放延时程序中的循环次数

 

4、流程图

 

任务一:

 

任务二:

 

任务三(提高部分):

 

 

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

任务一:

Filename:

text1.asm

Description:

分支程序

Sourceused:

3000H:

8bit符号数3001H:

平方低位、商、取反3002H:

平方高位、余数

MAIN:

MOVDPTR,#3000H;指针赋值,8位有符号数地址

MOVXA,@DPTR;3000H取数

JNBACC.7,L1;不为负数转L1

COMP1:

CPLA;取反

SJMPSAVE;

L1:

CJNEA,#10,L2;不等于10转L2

SJMPCOMP1;

L2:

JCCOMP1;小于10转COMP1

CJNEA,#64,L3;大于10不等于64转L3

COMP2:

MOVB,A;

MULAB;求平方

SJMPSAVE;

L3:

JNCCOMP2;大于64转COMP2

MOVB,#2;

DIVAB;除以2

SAVE:

INCDPTR;

MOVX@DPTR,A;3001H存:

平方低位、商、取反

INCDPTR;

MOVA,B;

MOVX@DPTR,A;3002H存:

平方高位、余数

END

 

任务二:

Filename:

text2.asm

Description:

电子时钟

Sourceused:

P0:

显示小时、P1:

显示分钟、P2:

显示秒钟

R4、R5、R3:

存放循环次数

ORG0000H

LJMPMAIN

ORG0200H

MAIN:

MOVP0,#23H;时钟初始值

MOVP1,#58H;分钟初始值

MOVP2,#30H;秒钟初始值

JISHU:

JBP3.0,JISHU;P3.0引脚低电平开始计时

ACALLDLY;进入延时1s子程序

MOVA,P2

ADDA,#1

DAA

MOVP2,A

CJNEA,#60H,JISHU;判断是否达到60s

MOVP2,#0;秒钟清零

MOVA,P1

ADDA,#1

DAA

MOVP1,A

CJNEA,#60H,JISHU;判断是否达到60min

MOVP1,#0;分钟清零

MOVA,P0

ADDA,#1

DAA

MOVP0,A

CJNEA,#24H,JISHU;判断是否达到24h

MOVP0,#0;时钟清零

SJMPJISHU

DLY:

MOVR4,#46;延时一秒程序

L3:

MOVR5,#152

L1:

MOVR3,#70

L2:

DJNZR3,L2

DJNZR5,L1

DJNZR4,L3

RET

END

任务三(提高部分):

Filename:

text3.asm

Description:

十进制加1或减1计数

Sourceused:

P1:

显示千位和百位、P2:

显示十位和个位、P3:

控制计数

R4、R5、R3:

存放延时程序中的循环次数

ORG0000H

LJMPMAIN

ORG0100H

MAIN:

MOVP1,#00H;千位和百位初始值

MOVP2,#00H;十位和个位初始值

MOVP3,#00H

START:

JBP3.0,START;出现高电平不计数

JBP3.1,START

JBP3.2,START

JBP3.3,START

ACALLDLY;延时子程序

JBP3.7,UP;P3.7高电平加1计数

DOWN:

MOVA,P2;减1计数模式

CLRC

ADDA,#99H;与-1(BCD码)相加

DAA

MOVP2,A

CJNEA,#99H,DONE;处理借位

L1:

MOVA,P1

CLRC

ADDA,#99H

DAA

MOVP1,A

DONE:

SJMPSTART

UP:

MOVA,P2

CLRC

INCA

DAA

MOVP2,A

MOVA,P1

ADDCA,#00H;处理进位

DAA

MOVP1,A

SJMPSTART

DLY:

MOVR4,#46;12M晶振延时一秒程序

LY3:

MOVR5,#152

LY1:

MOVR3,#70

LY2:

DJNZR3,LY2

DJNZR5,LY1

DJNZR4,LY3

RET

END

6、程序测试方法与结果

任务一

8位符号数分4种情况调试:

1.负数2.小于等于103.大于10小于644.大于等于64

通过在Memory1中输入x:

3000h查看片外数据存储区,在3000H单元输入8位符号数,运行后查看结果。

3000H存放-6,-6的补码为FA,-6小于10,所以需要取反,结果在3001H单元中,FAH取反为05H。

3000H存放10,取反后结果存放在3001H单元中,0AH取反为F5H。

3000H存放20,20大于10小于64,需要除以2,结果商为0A,余数为0。

商存放在3001H单元中,余数存放在3002H单元中。

3000H存放64,十六进制为40H,需要对64取平方,结果为1000H,高八位存放在3002H单元,低八位存放在3001H单元。

任务二

在延时子程序处设置断点运行,运行时间为0.99999500秒。

查看各P端口状态

程序初始状态为23时58分30秒,p3.0设置低电平允许计时。

运行一段时间后,时钟显示为0时0分10s,可见时钟溢出后清零,时钟走了100s,程序运行时间为100.47941500s,基本符合。

任务三(提高部分):

测试加1计数,初始值为9999,1s后加1结果为0000,正常。

测试减1计数,初始值为0000,1s后减去1结果为9999,正常。

 

思考题

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

举例说明。

⑴当分支比较少的时候,可以直接采用条件转移指令。

例:

设片内RAM40H和41H单元各有一个无符号8位二进制数,试编程比较它们的大小,把大数存入42H单元。

方法1用SUBB指令,程序如下:

CLRC

MOVA,40H

SUBBA,41H

JNCLP

MOV42H,41H

RET

LP:

MOV42H,40H

RET

方法2用CJNE指令,程序如下:

MOVA,40H

CJNEA,41H,LP1

LP1:

JNCLP2

MOVA,41H

LP2:

MOV42H,A

RET

⑵当分支比较多的时候,可以采用分支表法,常用的分支表法有三种:

分支地址表,转移指令表,分支偏移量表。

例:

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

R3=0,转向SUBR0

R3=1,转向SUBR1

..

R3=7,转向SUBR7

①分支地址表法:

MOVDPTR,#BRATAB;取表首地址

MOVA,R3

ADDA,R3;A←R3*2

JNCNADD

INCDPH;R3*2的进位加到DPH

NADD:

MOVR4,A;暂存A

MOVCA,@A+DPTR;取分支地址高8位

XCHA,R4

INCA

MOVCA,@A+DPTR;取分支地址低8位

MOVDPL,A;分支地址低8位送DPL

MOVDPH,R4;分支地址高8位送DPH

CLRA

JMP@A+DPTR;转相应分支程序

BRATAB:

DWSUBR0;分支地址表

DWSUBR1

DWSUBR7

②转移指令表法:

MOVDPTR,#JMPTAB;取表首地址

MOVA,R3

ADDA,R3;A←R3×2

JNCNADD

INCDPH;有进位加到DPH

NADD:

JMP@A+DPTR;转相应分支程序

JMPTAB:

AJMPSUBR0;转移指令表

AJMPSUBR1

AJMPSUBR7

③地址偏移量表法:

MOVDPTR,#DIATAB;取表首地址

MOVA,R3;表的序号数送A

MOVCA,@A+DPTR;查表

JMP@A+DPTR;转相应分支程序

DISTAB:

DBSUBR0-DISTAB;地址偏移量表

DBSUBR1-DISTAB

DBSUBR7-DISTAB

SUBR0:

SUBR1:

 

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

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

答:

(1)十六进制加1计数器可以直接对计数器进行加1的操作,相当于单字节或者多字节的加法运算;但是十进制加1计数器不能直接对计数器直接进行加1操作,而必须在对加1操作后紧跟一条DAA指令对其进行二—十进制修正才能实现。

(2)用十进制加法进行减1计数时,应与“-1(BCD码)”的补码即99H进行相加,然后用DAA指令进行二—十进制修正,从而实现十进制减1计数功能。

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

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2