微机实验报告实验二.docx
- 文档编号:4248922
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:16
- 大小:204.96KB
微机实验报告实验二.docx
《微机实验报告实验二.docx》由会员分享,可在线阅读,更多相关《微机实验报告实验二.docx(16页珍藏版)》请在冰豆网上搜索。
微机实验报告实验二
实验名称实验二分支与循环程序设计实验
指导教师
专业班级姓名学号
联系电话
一、任务要求
1.设有8bits符号数X存于外部RAM单元,按以下方式计算后的结果Y也存于外部RAM单元,请按要求编写程序。
2.利用51系列单片机设计一个24小时制电子时钟,电子时钟的时、分、秒数值分别通过P0、P1、P2端口输出(以压缩BCD码的形式)。
P3.0为低电平时开始计时,为高电平时停止计时。
设计1s延时子程序(延时误差小于10us,晶振频率12MHz)。
提高部分(选做):
a.实现4位十进制加、减1计数,千位、百位由P1口输出;十位、个位由P2口输出。
利用P3.7状态选择加、减计数方式。
b.利用P3口低四位状态控制开始和停止计数,控制方式自定。
二、设计思路
1.任务一:
先判断输入自变量的正负性。
如果是负数则直接归到取反区间;如果是正数,则与20,40进行大小比较,即和20,40分别做减法,然后根据比较结果归到各个区间。
2.任务二:
先设置好进位计数器数值,再将R3、R4和P0、P1、P2、P3清零。
开始先判断控制位P3.0是否为0,当P3.0=1时原地踏步重复判断,当P3.0=0时开始计时。
计时开始,进行秒钟B计数,计数后R0减一,每次计数完成用BCD码子程序转换,然后由P2输出秒钟,判断计数后R0值是否为0,若R0的值不为0,就跳转回秒钟继续计数,若R0的值为0,就把R0和P2进行清零后,开始分钟计数部分。
同理,每次分钟计数完之后用BCD码子程序转换,然后由P1输出分钟,判断计数后R1值是否为0,若R1的值不为0,就跳转回秒钟继续计数,若R1的值为0,就把R1和P1清零后开始时钟计数部分。
时钟计数完后同样用BCD码子程序转换,然后判断计数后的R2的值是否为0,若不为0,就跳转回秒钟计数,若R2为0,就吧R2和P0清零后直接跳出计数部分,从判断P3.0部分再开始.每两次计数输出之间穿插一个1s的延时程序。
就可以达到时钟的功能。
3.加、减1计数程序:
将十进制数的千位数和百位数存于P1,将十进制数的十位数和个位数存放于P2,P3.0至P3.3全为低电平则开始计数,否则停止计数。
P3.7为选择加一或减一的计数方式的控制位,P3.7为0时加1计数,P3.7为1时减1计数;R3,R4,R5为计数中的延时程序指定循环次数。
三、资源分配
1.任务一:
2000H:
输入的自变量
2001H:
若X≤20,则为取反结果
若20<X<40,则为X除以二的整数部分
若X≥40,则为平方后的低八位
2002H:
若20<X<40,则为X除以二的余数部分
若X≥40,则为平方后的高八位
DPTR:
数据指针
2.任务二:
R0、R1、R2:
秒、分、时进位计数器
B:
秒钟计数
R3:
分钟计数
R4:
时钟计数
P0:
时钟输出
P1:
分钟输出
P2:
秒钟输出
P3:
电子钟开关控制
3.加、减1计数程序:
P1:
十进制数的千位数和百位数
P2:
十进制数的十位数和个位数
P3.0-P3.3:
是否进行计数的4个控制位
P3.7:
选择加一或减一的计数方式的控制位
R3,R4,R5:
计数中的延时程序指定循环次数。
四、流程图
1.任务一:
2.任务二:
3.加、减1计数程序:
五、源代码
1.任务一:
Filename:
1.asm
Description:
多分支程序设计
Date:
2014/10/8
Designedby:
LXQ
Sourceused:
2000H:
输入的自变量
2001H:
若X≤20,则为取反结果
若20<X<40,则为X除以二的整数部分
若X≥40,则为平方后的低八位
2002H:
若20<X<40,则为X除以二的余数部分
若X≥40,则为平方后的高八位
DPTR:
数据指针
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
SJMPLOOP1;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;除以二
SJMPSTORE;跳转存储指令
LOOP3:
MOVB,A
MULAB;平方
SJMPSTORE;跳转存储指令
STORE:
INCDPTR;设置数据指针
MOVX@DPTR,A
INCDPTR
MOVA,B
MOVX@DPTR,A;高位和低位依次存入片外RAM
SJMP$;原地踏步
END
2.任务二:
ORG0000H
LJMPMAIN
ORG0100H
MAIN:
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
ADDA,#01H
DAA
MOVR3,A;分钟计时
MOVP1,A;输出分钟
MOVR0,#60;计数器归位
DJNZR1,START;R1-1,不等于零则跳到START继续循环
MOVB,#0H
MOVR3,#0H
MOVP1,#0H
MOVA,R4
ADDA,#01H
DAA
MOVR4,A;时钟计时
MOVP0,A;输出时钟
MOVR1,#60;计数器归位
DJNZR2,START;R2-1,不等于零则跳到START继续循环
SJMPMAIN
STOP:
SJMP$;原地踏步DLY:
MOVR5,#46;延时1s,误差1us
;延时1s,误差1us
DLY:
DELAY:
MOV72H,#100
LOOP3:
MOV71H,#100
LOOP1:
MOV70H,#47
LOOP0:
DJNZ70H,LOOP0
NOP
DJNZ71H,LOOP1
MOV70H,#46
LOOP2:
DJNZ70H,LOOP2
NOP
DJNZ72H,LOOP3
MOV70H,#48
LOOP4:
DJNZ70H,LOOP4
RET
END
3.加、减1计数程序:
ORG0000H
LJMPMAIN
ORG0100H
MAIN:
MOVP1,#00H;P1端口置零
MOVP2,#00H;P2端口置零
MOVP3,#7FH;P3端口置#7FH
START:
JBP3.0,START
JBP3.1,START
JBP3.2,START
JBP3.3,START;判断是否开始计时
LJMPDELAY;跳转到延时子程序
DELAY:
MOVR7,#24
DEL1:
MOVR6,#61
DEL2:
MOVR5,#170
DEL3:
NOP
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
MOVR1,A
MOVA,P1
SUBBA,#00H
MOVR0,A
ANLA,#0FH
MOVR6,A
MOVA,R0
ANLA,#0F0H
MOVR0,A
CJNER7,#0FH,LOOP1
MOVR7,#09H
LOOP1:
CJNER1,#0F0H,LOOP2
MOVR1,#90H
LOOP2:
CJNER6,#0FH,LOOP3
MOVR6,#09H
LOOP3:
CJNER0,#0F0H,LOOP4
MOVR0,#90H
LOOP4:
MOVA,R1
ADDA,R7
DAA
MOVP2,A
MOVA,R0
ADDA,R6
DAA
MOVP1,A
LJMPSTART;减1计数子程序
UP:
MOVA,P2
ADDA,#01H
DAA
MOVP2,A
MOVA,P1
ADDCA,#00H
DAA
MOVP1,A
LJMPSTART;加1计数子程序
END
六、程序测试方法与结果
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。
编译结果如下:
综上可得程序功能正确,运行成功。
2.任务二:
P3.0设为低电平,设置断点,开始计数,秒种到60时,分钟进位,秒钟清零:
重新设置断点,开始计数,分种到60时,时钟进位,分钟清零:
重新设置断点,开始计数,时种到24时,全部清零,重新判断P3.0。
P3.0置一则计时停止:
测试完成,程序运行顺利,功能正确。
3.加、减1计数程序:
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:
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指令对其进行二—十进制修正才能实现。
用十进制加法进行减1计数时,应讲计数器当前值与1的十进制补码99H进行想加,然后用DAA指令进行二—十进制修正,从而实现十进制减1计数功能。
本人承诺:
本报告内容真实,无伪造数据,无抄袭他人成果。
本人完全了解学校相关规定,如若违反,愿意承担其后果。
签字:
年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 实验 报告