分支程序设计实验单片机第二次试验.docx

上传人:b****6 文档编号:6155779 上传时间:2023-01-04 格式:DOCX 页数:8 大小:67.87KB
下载 相关 举报
分支程序设计实验单片机第二次试验.docx_第1页
第1页 / 共8页
分支程序设计实验单片机第二次试验.docx_第2页
第2页 / 共8页
分支程序设计实验单片机第二次试验.docx_第3页
第3页 / 共8页
分支程序设计实验单片机第二次试验.docx_第4页
第4页 / 共8页
分支程序设计实验单片机第二次试验.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

分支程序设计实验单片机第二次试验.docx

《分支程序设计实验单片机第二次试验.docx》由会员分享,可在线阅读,更多相关《分支程序设计实验单片机第二次试验.docx(8页珍藏版)》请在冰豆网上搜索。

分支程序设计实验单片机第二次试验.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.将8bits符号数从外部RAM单元取出至A中,符号位为1的时候为负数,进行取反运算;当符号位为0的时候为正数,因此将A与20进行比较,当A≤20时跳至取反运算那一步;当A>20时将A与40进行比较,如果当A≥40时则对其进行平方运算那一步,当A<40时则进行除法运算那一步。

每次算完之后直接储存,最后再分配储存于外部RAM单元的指定位置。

2.清零R0~R2和P0~P2,开始先判断控制位P3.0是不是0,当P3.0=1时原地踏步重复判断,当P3.0=0时开始运行程序。

计时开始,进行秒钟R0计数,每次计数完成用BCD码子程序转换,然后判断计数后R0值是否到60,若R0的值不足60,就直接输出给P2,若R0的值为60,就把R0和P2进行清零后,开始分钟计数部分。

同理,每次分钟计数完之后用BCD码子程序转换,然后判断计数后R1的值是否为60,若不为60,就直接输出给P1,若R1的值为60,就把R1和P1清零后开始时钟计数部分。

时钟计数完后同样用BCD码子程序转换,然后判断计数后的R2的值是否为24,若不为24,就直接输出给P0,若R2为24,就把R2和P0清零后直接跳出计数部分,从判断P3.0部分再开始.每两次计数输出之间穿插一个1s的延时程序。

就可以达到时钟的功能。

三、资源分配

1.分支程序:

数据指针DPTR:

对片外RAM进行读写操作

2000H:

存放8bits符号数X

2010H:

存放结果Y(取反后的数,或者平方后的高8位,或者除法后的商)

2011H:

存放结果Y(平方后的低8位,或者除法后的余数)

2.时钟程序:

R0、R1、R2:

分别进行秒钟,分钟,时钟的计数

P2、P1、P0:

分别输出秒钟,分钟,时钟

P3.0:

是否计数的控制位

R3、R4、R5:

为1s延时程序指定循环次数

B:

BCD码转换子程序的操作数

四、流程图

1.分支程序流程图:

2.时钟程序的流程图:

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

1.分支程序代码如下:

ORG0000H

SJMPSTART

START:

MOVDPTR,#2000H

MOVA,#31

MOVX@DPTR,A;存数

MOVB,0;寄存器B清零

MOVXA,@DPTR;从R0中取出数x

JNBACC.7,COMP1;判断符号位,符号位为0时转到COMP1

LP3:

CPLA;对x取反

SJMPSTORE

COMP1:

CJNEA,#20,COMP2;A≠20时,转到COMP2

SJMPLP3;A=20时,转到LP3取反

COMP2:

JCLP3;C=1,A<20,转到LP3取反

CJNEA,#40,COMP3;C=0,A>20.当A≠40时,转到COMP3

LP1:

MOVB,A;A=40时,给B赋值为A

MULAB;计算x平方

SJMPSTORE

COMP3:

JNCLP1;C=0,A>40,转到LP1计算x平方

MOVB,#02H;C=1,A<40,赋值B=2

DIVAB;计算x除以2

STORE:

MOVDPTR,#2010H

MOVX@DPTR,A;存数:

INCDPTR;对于平方,高位在前地位在后

MOVA,B;对于除法,商在前余数在后

MOVX@DPTR,A

SJMP$

END

2.时钟程序代码如下:

ORG0000H

SJMPMAIN

MAIN:

MOVR0,#0;R0,R1,R2初始化

MOVR1,#0

MOVR2,#0

MOVP0,#0;P0,P1,P2置0

MOVP1,#0

MOVP2,#0

INPUT:

JBP3.0,INPUT

;延时程序

DELAY:

MOVR3,#64H;循环次数100

LOOP:

MOVR4,#64H;循环次数100

LOOP1:

MOVR5,#31H;循环次数49

LOOP2:

NOP

NOP

DJNZR5,LOOP2;晶振频率设为23.8836Hz

DJNZR4,LOOP1;[(4*49+3)*100+3]*100=1990300乘以0.502437us

DJNZR3,LOOP;差不多1s

START:

INCR0;秒钟计数

MOVA,R0

ACALLOUTPUT;计算bcd码

CJNER0,#60,X2;60进制判断进1

MOVR0,#0;进位之后清0

MOVP2,#0;输出清0

INCR1;分钟计数

MOVA,R1

ACALLOUTPUT;计算bcd码

CJNER1,#60,X1;60进制判断

MOVR1,#0;进位之后清0

MOVP1,#0;输出清0

INCR2;时钟计数

MOVA,R2

ACALLOUTPUT;计算bcd码

CJNER2,#24,X0;判断是不是溢出了

MOVR2,#0;溢出之后清0

MOVP0,#0;输出清0

SJMPINPUT;跳出循环

X2:

MOVP2,A;输出

SJMPINPUT

X1:

MOVP1,A

SJMPINPUT

X0:

MOVP0,A

SJMPINPUT

OUTPUT:

MOVB,#0AH;BCD码转换程序

DIVAB;相除得到高位,低位

SWAPA;得到高位

ORLA,B

RET

STEP:

SJMPSTEP

END

六、程序测试方法与结果

实验一:

第一次令A为10H,进行运算后得到的结果是EFH,即取反成功

第二次令A为20H,进行运算后得到的结果是10H,即除以2后的结果

第三次取A为50,进行运算后的结果为09C4H=2500,即平方后的结果

因此可以判断程序没有问题

实验二:

第一次不进行任何操作开始运行程序,程序没有反应

第二次将P3.0改为0后,程序开始运行

第三次将P3.0改为0后再运行程序,经过一段时间后停止,发现此时程序运行的时间为1分41秒,即101秒;而实际经过的时间为100.85897秒,两者误差很小,说明程序设计以及运行正常

思考题

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

举例说明。

主要方法有:

①分支地址表

如:

BRATAB:

DWSUBRO

DWSUBR1

DWSUBR2

②转移地址表

如:

JMPTAB:

AJMPSUBR0

AJMPSUBR1

AJMPSUBR2

③地址偏移量表

如:

DISTAB:

DBSUBRO-DISTAB

DBSUBR1-DISTAB

DBSUBR3-DISTAB

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

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

十六进制加一直接用INC加一,十进制加一时需先判断该位上是否是9,若是则清零。

用十进制加法进行减1计数时,应讲计数器当前值与1的十进制补码99H进行相加,然后用DAA指令进行二—十进制修正,从而实现十进制减1计数功能。

 

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

当前位置:首页 > PPT模板 > 其它模板

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

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