分支与循环程序设计实验.doc_第1页
分支与循环程序设计实验.doc_第2页
分支与循环程序设计实验.doc_第3页
分支与循环程序设计实验.doc_第4页
分支与循环程序设计实验.doc_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验名称 分支与循环程序设计实验 成 绩 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计数时采用INC A和DA A 指令实现十进制加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、 流程图 任务一:任务二:任务三(提高部分):五、源代码 (含文件头说明、语句行注释)任务一: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;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 0000HLJMP 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,P0 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:存放延时程序中的循环次数ORG0000HLJMPMAINORG0100HMAIN: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,P2CLRCINCADAAMOVP2,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 RETEND6、 程序测试方法与结果任务一8位符号数分4种情况调试:1.负数 2.小于等于10 3.大于10小于64 4.大于等于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指令,程序如下:CLRCMOVA,40HSUBBA,41HJNCLPMOV42H,41HRETLP:MOV42H,40HRET方法2 用CJNE指令,程序如下:MOVA,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 INC 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 地址偏移量表法: 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. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论