资源预览内容
第1页 / 共21页
第2页 / 共21页
第3页 / 共21页
第4页 / 共21页
第5页 / 共21页
第6页 / 共21页
第7页 / 共21页
第8页 / 共21页
第9页 / 共21页
第10页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
实验名称 分支与循环程序设计实验 成 绩 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 口输出。利用 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: MOV DPTR,#3000H ;指针赋值,8 位有符号数地址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 存:平方低位、商、取反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,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,L2DJNZ 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,STARTACALL 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: 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 取反为 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 指令,程序如下:CLR CMOV A,40HSUBB A,41HJNC LPMOV 42H,41HRETLP: MOV 42H,40HRET方法 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 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 计数?
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号