分支与循环程序设计实验

上传人:jiups****uk12 文档编号:37671195 上传时间:2018-04-20 格式:DOCX 页数:21 大小:272.78KB
返回 下载 相关 举报
分支与循环程序设计实验_第1页
第1页 / 共21页
分支与循环程序设计实验_第2页
第2页 / 共21页
分支与循环程序设计实验_第3页
第3页 / 共21页
分支与循环程序设计实验_第4页
第4页 / 共21页
分支与循环程序设计实验_第5页
第5页 / 共21页
点击查看更多>>
资源描述

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

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时则向时钟进位,并将分钟数

3、清零。当时钟数为24时,则重新开始计时。任务三(提高部分):先通过检查P3口低四位的状态来控制是否计数,存在高电平则不计数。再检查P3.7端口状态来选择计数模式。加1计数时采用INC A和DA A 指令实现十进制加1计数。减1计数采用与-1(BCD码形式)补码相加即99H相加实现十进制减1计数。其中每计数一次延时1s。三、 资源分配任务一:3000H: 8bit符号数; 3001H:平方低位、商、取反 ;3002H:平方高位、余数任务二:P0:显示小时;P1:显示分钟;P2:显示秒钟;P3.0:时钟开关; R4、R5、R3:存放循环次数任务三(提高部分):P1:显示千位和百位;P2:显示十位和

4、个位;P3:控制计数; R4、R5、R3:存放延时程序中的循环次数四、 流程图 任务一:任务二:任务三(提高部分):五、源代码 (含文件头说明、语句行注释)任务一:File name: text1.asmDescription: 分支程序Source used: 3000H: 8bit符号数 3001H:平方低位、商、取反3002H:平方高位、余数MAIN:MOVDPTR,#3000H;指针赋值,8位有符号数地址MOVXA,DPTR;3000H取数JNBACC.7,L1;不为负数转L1COMP1:CPLA;取反SJMPSAVE;L1:CJNEA,#10,L2;不等于10转L2SJMPCOMP1

5、;L2:JCCOMP1;小于10转COMP1CJNEA,#64,L3 ;大于10不等于64转L3COMP2:MOVB,A;MULAB;求平方SJMPSAVE;L3:JNCCOMP2;大于64转COMP2MOVB,#2 ;DIVAB ;除以2SAVE:INCDPTR;MOVXDPTR,A;3001H存:平方低位、商、取反INCDPTR;MOVA,B;MOVXDPTR,A;3002H存:平方高位、余数END任务二:File name: text2.asmDescription: 电子时钟Source used: P0:显示小时、P1:显示分钟、P2:显示秒钟R4、R5、R3:存放循环次数ORG 0

6、000HLJMP MAINORG 0200HMAIN: MOV P0,#23H;时钟初始值 MOV P1,#58H ;分钟初始值 MOV P2,#30H ;秒钟初始值JISHU: JB P3.0,JISHU ;P3.0引脚低电平开始计时 ACALL DLY ;进入延时1s子程序 MOV A,P2 ADD A,#1 DA A MOV P2,A CJNE A,#60H,JISHU;判断是否达到60s MOV P2,#0 ;秒钟清零 MOV A,P1 ADD A,#1 DA A MOV P1,A CJNE A,#60H,JISHU;判断是否达到60min MOV P1,#0;分钟清零 MOV A,P

7、0 ADD A,#1 DA A MOV P0,A CJNE A,#24H,JISHU;判断是否达到24h MOV P0,#0 ;时钟清零 SJMP JISHU DLY:MOV R4,#46 ;延时一秒程序L3:MOV R5,#152L1:MOV R3,#70L2:DJNZ R3,L2 DJNZ R5,L1 DJNZ R4,L3 RETEND任务三(提高部分):File name: text3.asmDescription: 十进制加1或减1计数Source used: P1:显示千位和百位、P2:显示十位和个位、P3:控制计数R4、R5、R3:存放延时程序中的循环次数ORG0000HLJMPM

8、AINORG0100HMAIN:MOVP1,#00H;千位和百位初始值MOVP2,#00H;十位和个位初始值MOVP3,#00HSTART:JBP3.0,START;出现高电平不计数JBP3.1,STARTJBP3.2,STARTJBP3.3,STARTACALLDLY;延时子程序JBP3.7,UP;P3.7高电平加1计数DOWN:MOVA,P2;减1计数模式CLRCADDA,#99H;与-1(BCD码)相加DAAMOVP2,ACJNEA,#99H,DONE;处理借位L1:MOVA,P1CLRCADDA,#99HDAAMOVP1,ADONE:SJMPSTARTUP:MOVA,P2CLRCINC

9、ADAAMOVP2,AMOVA,P1ADDCA,#00H;处理进位DAAMOVP1,ASJMPSTARTDLY:MOV R4,#46 ;12M晶振延时一秒程序LY3:MOV R5,#152LY1:MOV R3,#70LY2:DJNZ R3,LY2 DJNZ R5,LY1 DJNZ R4,LY3 RETEND六、 程序测试方法与结果任务一8位符号数分4种情况调试:1.负数 2.小于等于10 3.大于10小于64 4.大于等于64通过在Memory1中输入x:3000h查看片外数据存储区,在3000H单元输入8位符号数,运行后查看结果。3000H存放-6,-6的补码为FA,-6小于10,所以需要取

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,可见时钟溢出后清零,时钟走了

11、100s,程序运行时间为100.47941500s,基本符合。任务三(提高部分):测试加1计数,初始值为9999,1s后加1结果为0000,正常。测试减1计数,初始值为0000,1s后减去1结果为9999,正常。思考题1实现多分支结构程序的主要方法有哪些?举例说明。当分支比较少的时候,可以直接采用条件转移指令。例:设片内RAM40H和41H单元各有一个无符号8位二进制数,试编程比较它们的大小,把大数存入42H单元。方法1 用SUBB指令,程序如下:CLRCMOVA,40HSUBBA,41HJNCLPMOV42H,41HRETLP:MOV42H,40HRET方法2 用CJNE指令,程序如下:MO

12、VA,40HCJNEA,41H,LP1LP1:JNCLP2MOVA,41HLP2:MOV42H,ARET当分支比较多的时候,可以采用分支表法,常用的分支表法有三种:分支地址表,转移指令表,分支偏移量表。例:根据R3的值,控制转向8个分支程序。R3=0,转向SUBR0R3=1,转向SUBR1.R3=7,转向SUBR7分支地址表法: MOV DPTR,#BRATAB ;取表首地址 MOV A,R3 ADD A,R3 ;AR3*2 JNC NADD INC DPH ;R3*2的进位加到DPH NADD: MOV R4,A ;暂存A MOVC A,A+DPTR ;取分支地址高8位 XCH A,R4 I

13、NC A MOVC A,A+DPTR ;取分支地址低8位 MOV DPL,A ;分支地址低8位送DPL MOV DPH,R4 ;分支地址高8位送DPH CLR A JMP A+DPTR ;转相应分支程序BRATAB: DW SUBR0 ;分支地址表 DW SUBR1 DW SUBR7转移指令表法: MOV DPTR,#JMPTAB ;取表首地址 MOV A,R3 ADD A,R3 ;AR32 JNC NADD INC DPH ;有进位加到DPH NADD: JMP A+DPTR ;转相应分支程序JMPTAB: AJMP SUBR0 ;转移指令表 AJMP SUBR1 AJMP SUBR7 地址

14、偏移量表法: MOV DPTR,#DIATAB ;取表首地址 MOV A,R3 ;表的序号数送A MOVC A,A+DPTR ;查表 JMP A+DPTR ;转相应分支程序DISTAB: DB SUBR0-DISTAB ;地址偏移量表 DB SUBR1-DISTAB DB SUBR7-DISTABSUBR0: SUBR1: 2 在编程上,十进制加1计数器与十六进制加1计数器的区别是什么?怎样用十进制加法指令实现减1计数?答:(1)十六进制加1计数器可以直接对计数器进行加1的操作,相当于单字节或者多字节的加法运算;但是十进制加1计数器不能直接对计数器直接进行加1操作,而必须在对加1操作后紧跟一条DA A指令对其进行二十进制修正才能实现。(2) 用十进制加法进行减1计数时,应与“-1(BCD码)”的补码即99H进行相加,然后用DA A指令进行二十进制修正,从而实现十进制减1计数功能。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号