微机实验报告实验二文档格式.docx
《微机实验报告实验二文档格式.docx》由会员分享,可在线阅读,更多相关《微机实验报告实验二文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
输入的自变量
2001H:
若X≤20,则为取反结果
若20<X<40,则为X除以二的整数部分
若X≥40,则为平方后的低八位
2002H:
若20<X<40,则为X除以二的余数部分
若X≥40,则为平方后的高八位
DPTR:
数据指针
R0、R1、R2:
秒、分、时进位计数器
B:
秒钟计数
R3:
分钟计数
R4:
时钟计数
P0:
时钟输出
P1:
分钟输出
P2:
秒钟输出
P3:
电子钟开关控制
3.加、减1计数程序:
十进制数的千位数和百位数
十进制数的十位数和个位数
P3.0-P3.3:
是否进行计数的4个控制位
P3.7:
选择加一或减一的计数方式的控制位
R3,R4,R5:
计数中的延时程序指定循环次数。
四、流程图
五、源代码
Filename:
1.asm
Description:
多分支程序设计
Date:
2014/10/8
Designedby:
LXQ
Sourceused:
ORG0000H
LJMPMAIN
ORG0100H
MAIN:
MOVA,#25;
输入自变量
MOVB,#00H;
B清零
MOVDPTR,#2000H;
设置数据指针
MOVX@DPTR,A;
存入片外RAM
JNBACC.7,COMP1;
判断符号位
SJMPLOOP1;
负数则取反
COMP1:
CJNEA,#20,COMP2;
A≠20H时跳转到COMP2
A=20H时取反
COMP2:
JCLOOP1;
CY=1时取反
CJNEA,#40,COMP3;
A≠40H时跳转到COMP3
SJMPLOOP3;
A=40H时平方
COMP3:
JCLOOP2;
CY=1时除以二
SJMPLOOP3;
CY=0时平方
LOOP1:
CPLA;
取反操作
SJMPSTORE;
跳转存储指令
LOOP2:
MOVB,#02H
DIVAB;
除以二
LOOP3:
MOVB,A
MULAB;
平方
跳转存储指令
STORE:
INCDPTR;
MOVX@DPTR,A
INCDPTR
MOVA,B
MOVX@DPTR,A;
高位和低位依次存入片外RAM
SJMP$;
原地踏步
END
2.任务二:
MOVR0,#60
MOVR1,#60
MOVR2,#24;
时针、分针、秒针计数器赋初值
MOVR3,#0H
MOVR4,#0H;
时钟、分钟赋初值
MOVP0,#0H
MOVP1,#0H
MOVP2,#0H
MOVP3,#0H
START:
JBP3.0,STOP;
若P3.0为高电平则停止计时
ACALLDLY
MOVA,B
ADDA,#01H
DAA
MOVB,A;
秒钟计时
MOVP2,A;
输出秒钟
DJNZR0,START;
R0-1,不等于零则跳到START继续循环
MOVB,#0H
MOVP2,#0H
MOVA,R3
MOVR3,A;
分钟计时
MOVP1,A;
输出分钟
MOVR0,#60;
计数器归位
DJNZR1,START;
R1-1,不等于零则跳到START继续循环
MOVR3,#0H
MOVA,R4
MOVR4,A;
时钟计时
MOVP0,A;
输出时钟
MOVR1,#60;
DJNZR2,START;
R2-1,不等于零则跳到START继续循环
SJMPMAIN
STOP:
SJMP$;
原地踏步DLY:
MOVR5,#46;
延时1s,误差1us
;
DLY:
DELAY:
MOV72H,#100
MOV71H,#100
MOV70H,#47
LOOP0:
DJNZ70H,LOOP0
NOP
DJNZ71H,LOOP1
MOV70H,#46
DJNZ70H,LOOP2
DJNZ72H,LOOP3
MOV70H,#48
LOOP4:
DJNZ70H,LOOP4
RET
END
ORG0000H
LJMPMAIN
ORG0100H
MOVP1,#00H;
P1端口置零
MOVP2,#00H;
P2端口置零
MOVP3,#7FH;
P3端口置#7FH
JBP3.0,START
JBP3.1,START
JBP3.2,START
JBP3.3,START;
判断是否开始计时
LJMPDELAY;
跳转到延时子程序
MOVR7,#24
DEL1:
MOVR6,#61
DEL2:
MOVR5,#170
DEL3:
NOP
DJNZR5,DEL3
DJNZR6,DEL2
DJNZR7,DEL1;
延时1秒
JBP3.7,DOWN;
P3.7为0时,加1计数;
P3.7为1时,减1计数
LJMPUP
DOWN:
CLRC
MOVA,P2
SUBBA,#01H
MOVR1,A
ANLA,#0FH
MOVR7,A
MOVA,R1
ANLA,#0F0H
MOVA,P1
SUBBA,#00H
MOVR0,A
MOVR6,A
MOVA,R0
CJNER7,#0FH,LOOP1
MOVR7,#09H
CJNER1,#0F0H,LOOP2
MOVR1,#90H
CJNER6,#0FH,LOOP3
MOVR6,#09H
CJNER0,#0F0H,LOOP4
MOVR0,#90H
MOVA,R1
ADDA,R7
DAA
MOVP2,A
ADDA,R6
MOVP1,A
LJMPSTART;
减1计数子程序
UP:
MOVA,P2
ADDA,#01H
ADDCA,#00H
MOVP1,A
LJMPSTART;
加1计数子程序
六、程序测试方法与结果
1.任务一:
取X=10,则结果应为F5H,即(2000H)=0AH,(2001H)=F5H,(2002H)=00H。
编译结果如下:
取X=25,则结果应为0CH,即(2000H)=19H,(2001H)=0CH,(2002H)=01H。
取X=60,则结果应为3600,即(2000H)=3CH,(2001H)=10H,(2002H)=0EH。
综上可得程序功能正确,运行成功。
P3.0设为低电平,设置断点,开始计数,秒种到60时,分钟进位,秒钟清零:
重新设置断点,开始计数,分种到60时,时钟进位,分钟清零:
重新设置断点,开始计数,时种到24时,全部清零,重新判断P3.0。
P3.0置一则计时停止:
测试完成,程序运行顺利,功能正确。
P3.0至P3.3全为低电平时开始计数,P3.7为0时加1计数(0加1为1):
P3.7为0时减1计数(0减一则为9999):
功能运行正常。
七、心得与体会
通过这次的微机实验,我加深了对于分支程序设计的理解,并通过自己设计程序框图和代码,提高了我的编程和调试代码的能力。
在编程过程中,由于分支众多,我常常遇到思路不清晰的情况,这就要求我们在动手写代码之前一定要先想好代码的整体架构,设计好流程图,再跟着流程图的思路一步步编写代码,才能保持思路清晰,减少错漏。
总之,要学会编写复杂的程序,看书是远远不够的,还需要我们多动手,多实际操作,去解决一些实际遇到的问题,这样才能提高我们的编程水平。
思考题
1.实现多分支结构程序的主要方法有哪些?
举例说明。
答:
实现多项分支的主要方法是采用分支表法,常用的分支表法的组成有三种形式:
分支地址表:
它是由各个分支程序的首地址组成的一个线性表,每个首地址占连续的两个字节。
如:
MOVDPTR,#BRATAB;
取表首地址
MOVA,R3
ADDA,R3;
A←R3*2
JNCNADD
INCDPH;
R3*2的进位加到DPH
NADD:
暂存A
MOVCA,@A+DPTR;
取分支地址高8位
XCHA,R4
INCA
取分支地址低8位
MOVDPL,A;
分支地址低8位送DPL
MOVDPH,R4;
分支地址高8位送DPH
CLRA
JMP@A+DPTR;
转相应分支程序
BRATAB:
DWSUBR0;
分支地址表
DWSUBR1
┇
DWSUBR7
转移指令表:
它是由转移指令组成的一个分支表,其各转移指令的目标地址即为各分支程序的首地址。
若采用短转移指令,则每条指令占两个字节;
若采用长转移指令,则每条指令占三个字节。
MOVDPTR,#JMPTAB;
A←R3×
2
有进位加到DPH
JMPTAB:
AJMPSUBR0;
转移指令表
AJMPSUBR1
AJMPSUBR7
地址偏移量表:
各分支程序首地址与地址偏移量表的标号之差(为一个字节)称为地址偏移量,有这些地址偏移量组成地址偏移量表。
MOVDPTR,#DIATAB;
MOVA,R3;
表的序号数送A
查表
DISTAB:
DBSUBR0-DISTAB;
地址偏移量表
DBSUBR1-DISTAB
DBSUBR7-DISTAB
SUBR0:
SUBR1:
2.在编程上,十进制加1计数器与十六进制加1计数器的区别是什么?
怎样用十进制加法指令实现减1计数?
答:
十六进制加1计数器可以直接对计数器进行加1的操作,相当于单字节或者多字节的加法运算,其中被加数为当前计数器值,加数始终为1;
但是十进制加1计数器不能直接对计数器直接进行加1操作,而必须在对加1操作后紧跟一条DAA指令对其进行二—十进制修正才能实现。
用十进制加法进行减1计数时,应讲计数器当前值与1的十进制补码99H进行想加,然后用DAA指令进行二—十进制修正,从而实现十进制减1计数功能。
本人承诺:
本报告内容真实,无伪造数据,无抄袭他人成果。
本人完全了解学校相关规定,如若违反,愿意承担其后果。
签字:
年月日