分支与循环程序设计实验.docx
- 文档编号:23209788
- 上传时间:2023-05-15
- 格式:DOCX
- 页数:18
- 大小:269.11KB
分支与循环程序设计实验.docx
《分支与循环程序设计实验.docx》由会员分享,可在线阅读,更多相关《分支与循环程序设计实验.docx(18页珍藏版)》请在冰豆网上搜索。
分支与循环程序设计实验
实验名称分支与循环程序设计实验成绩
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计数功能。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 分支 循环 程序设计 实验