分支与循环程序设计实验

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

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

1、实验名称 分支与循环程序设计实验 成 绩 1、任务要求1. 设有 8bits 符号数 X 存于外部 RAM 单元,按以下方式计算后的结果 Y 也存于外部RAM 单元,请按要求编写完整程序。 264/10XY 当 当 当2. 利用 51 系列单片机设计一个 24 小时制电子时钟,电子时钟的时、分、秒数值分别通过 P0、P1、P2 端口输出(以压缩 BCD 码的形式) 。P3.0 为低电平时开始计时,为高电平时停止计时。设计 1s 延时子程序(延时误差小于 10us,晶振频率 12MHz) 。提高部分(选做):1)实现 4 位十进制加、减 1 计数,千位、百位由 P1 口输出;十位、个位由 P2

2、口输出。利用 P3.7 状态选择加、减计数方式。2)利用 P3 口低四位状态控制开始和停止计数,控制方式自定。 2、设计思路任务一:机器内存入的数默认为无符号数,所以应该先判断正负性。对于 8 位有符号数,则范围是-128 到 127。如果是负数则直接归到取反区间;如果是正数,则使用两次比较转移指令,并根据 CY 的值进行区分,最后得出结果。任务二:判断控制位 P3.0 是否为 0,当 P3.0=1 时原地踏步重复判断,当 P3.0=0 时开始计时。计时开始,计时采用多重循环嵌套最内层是秒钟计时,然后是分钟计时,最后是时钟计时。先通过一个延时 1s 的子程序,每运行一次延时子程序秒钟加 1,并

3、通过 CJNE 指令判断是否等于 60,等于 60 则进入分钟计数并将秒钟清零,否则继续循环计时。当分钟数为 60 时则向时钟进位,并将分钟数清零。当时钟数为 24 时,则重新开始计时。任务三(提高部分):先通过检查 P3 口低四位的状态来控制是否计数,存在高电平则不计数。再检查 P3.7 端口状态来选择计数模式。加 1 计数时采用 INC A 和 DA A 指令实现十进制加 1 计数。减 1 计数采用与-1(BCD 码形式)补码相加即 99H 相加实现十进制减 1 计数。其中每计数一次延时 1s。3、资源分配任务一:3000H: 8bit 符号数; 3001H:平方低位、商、取反 ;3002

4、H:平方高位、余数任务二: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: MOV DPTR,#3000H ;指针赋值,8 位有符号数

5、地址MOVX A,DPTR ;3000H 取数JNB ACC.7,L1 ;不为负数转 L1COMP1: CPL A ;取反SJMP SAVE ;L1: CJNE A,#10,L2 ;不等于 10 转 L2SJMP COMP1 ;L2: JC COMP1 ;小于 10 转 COMP1CJNE A,#64,L3 ;大于 10 不等于 64 转 L3COMP2: MOV B,A ;MUL AB ;求平方SJMP SAVE ;L3: JNC COMP2 ;大于 64 转 COMP2MOV B,#2 ;DIV AB ;除以 2SAVE: INC DPTR ;MOVX DPTR,A ;3001H 存:平方

6、低位、商、取反INC DPTR ;MOV A,B ;MOVX DPTR,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,

7、P2ADD A,#1 DA AMOV P2,A CJNE A,#60H,JISHU ;判断是否达到 60sMOV P2,#0 ;秒钟清零MOV A,P1 ADD A,#1 DA A MOV P1,A CJNE A,#60H,JISHU ;判断是否达到 60minMOV 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

8、DJNZ R5,L1DJNZ R4,L3RETEND任务三(提高部分):File name: text3.asmDescription: 十进制加 1 或减 1 计数Source used: P1:显示千位和百位、P2:显示十位和个位、P3:控制计数R4、R5、R3:存放延时程序中的循环次数ORG 0000HLJMP MAINORG 0100HMAIN: MOV P1,#00H ;千位和百位初始值MOV P2,#00H ;十位和个位初始值MOV P3,#00HSTART: JB P3.0,START ;出现高电平不计数JB P3.1,STARTJB P3.2,STARTJB P3.3,STAR

9、TACALL DLY ;延时子程序JB P3.7,UP ;P3.7 高电平加 1 计数DOWN: MOV A,P2 ;减 1 计数模式CLR CADD A,#99H ;与-1(BCD 码)相加DA AMOV P2,ACJNE A,#99H,DONE ;处理借位L1: MOV A,P1CLR CADD A,#99HDA AMOV P1,ADONE: SJMP STARTUP: MOV A,P2CLR CINC ADA AMOV P2,AMOV A,P1ADDC A,#00H ;处理进位DA AMOV P1,ASJMP STARTDLY: MOV R4,#46 ;12M 晶振延时一秒程序LY3:

10、MOV R5,#152LY1: MOV R3,#70LY2: DJNZ R3,LY2DJNZ R5,LY1DJNZ R4,LY3RETEND6、程序测试方法与结果任务一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 取

11、反为 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

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

13、 2 用 CJNE 指令,程序如下:MOV A,40HCJNE A,41H,LP1LP1: JNC LP2MOV A,41HLP2: MOV 42H,ARET当分支比较多的时候,可以采用分支表法,常用的分支表法有三种:分支地址表,转移指令表,分支偏移量表。例:根据 R3 的值,控制转向 8 个分支程序。R3=0,转向 SUBR0R3=1,转向 SUBR1.R3=7,转向 SUBR7分支地址表法:MOV DPTR,#BRATAB ;取表首地址MOV A,R3ADD A,R3 ;AR3*2JNC NADDINC DPH ;R3*2 的进位加到 DPHNADD: MOV R4,A ;暂存 AMOVC

14、 A,A+DPTR ;取分支地址高 8 位 XCH A,R4INC AMOVC A,A+DPTR ;取分支地址低 8 位MOV DPL,A ;分支地址低 8 位送 DPLMOV DPH,R4 ;分支地址高 8 位送 DPHCLR AJMP A+DPTR ;转相应分支程序BRATAB: DW SUBR0 ;分支地址表DW SUBR1DW SUBR7转移指令表法:MOV DPTR,#JMPTAB ;取表首地址MOV A,R3ADD A,R3 ;AR32JNC NADDINC DPH ;有进位加到 DPHNADD: JMP A+DPTR ;转相应分支程序JMPTAB: AJMP SUBR0 ;转移指令表AJMP SUBR1AJMP 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 计数器的区别是什么?怎样用十进制加法指令实现减 1 计数?

展开阅读全文
相关资源
相关搜索

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

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