1、-_单片机实验报告实验名称 分支程序设计 指导教师 刘 冬 生 专业班级 学 号 联系方式 -_一 任务要求熟练掌握 KeilC 环境下汇编语言程序的调试方法,加深对汇编语言指令、机器码、寻址方式等基本内容的理解,掌握分支程序和简单程序的设计与调试方法,了解并行 IO 口的使用。1. 设有 8bits 符号数 X 存于外部 RAM 单元,按以下方式计算后的结果 Y 也存于外部RAM 元,请按要求编写程序。 240/YX当 当当2.利用 51 系列单片机设计一个 24 小时制电子时钟,电子时钟的时、分、秒数值分别通过 P0、P1、P2 端口输出(以压缩 BCD 码的形式) 。P3.0 为低电平时
2、开始计时,为高电平时停止计时。提高部分(选做):a. 实现 4 位十进制加、减 1 计数,千位、百位由 P1 口输出;十位、个位由 P2 口输出。利用 P3.7 状态选择加、减计数方式。b. 利用 P3 口低四位状态控制开始和停止计数,控制方式自定。二 设计思路1.分段函数设计对于第一个任务,根据变量 X 的值的不同进行相应的计算。所以我们首先要判断 X 的值属于那个范围。我们可利用比较转移指令 CJNE 来判断 X 是否等于临界值 20,40,若不等,再根据执行 CJNE 指令后的进位位 CY 的值来判断 X 与临界值的的大小关系,如:CY=0 则 X大于临界值,CY=1 则 X 小于临界值
3、;然后根据 X 的值所在的区间进行相应的计算。应该注意的是,除法计算中可能产生余数,商和余数应该分开存储,若乘方运算结果大于 255,高八位与低八位应分开存储224 进制时钟本程序须可以构建两部分循环。首先构建一个三重循环实现“一秒延时” ,循环体利用 NOP 指令(单字节指令,1s)经多次循环达到延时一秒的效果。再利用已经构建好的“一秒延时”部分,设计计时系统的三重循环,秒(0-59) 、分(0-59) 、时(0-23) 。秒和分计 60 次,小时计 24 次,但,是从 0 开始计,所以在分、秒达到 59,小时达到 23 时,下一次应该为零。程序运行时修改 P3.0 的值可以实现暂停和继续的
4、功能-_三 资源分配1. 分段函数 根据题目的条件,首先,设该 8 位无符号数为 30H,把片外地址 4000H 分配给它,把片外地址 4001H 和 4002H 分配给经分段函数计算得到的结果 Y。按位取反计算结果存于4001H 单元,而除法计算结果的商与余数和乘方计算中结果的高、低八位分开存储于4001H-4002H 单元。用寄存器 A,B 来存放在乘除运算中所得的中间结果。 2. 二十四进制时钟 工作寄存器 R0、R1、R2 分别用于秒、分、时循环次数的设定,R3、R4 分别用于分与时的循环计数,R5-R7 用于“一秒延时”中三重循环的循环次数设定。秒、分、时数值分别由 P2、P1、P0
5、 端口输出。 四 流程图N Y开始给定 X,并把 X的值赋到 A 中设置一个数据指针将 X 的值存在外部存储器中CY 1?A20?-_NYN Y Y NNYA40?CY 1?Y=X/2Y=2将 A 的值存到4001H将 B 的值存到4002H结束对 X 取反并赋给 Y将 A 的值存到 4001HCY 清零开始将 P0, P1,P2,P3 清零P3.0=0?延时 1S秒计数,R0 加 1 并存入A 中,转换成 BCD 码-_NYY NN Y五 源代码1. 分段函数ORG 0000HLJMP MAINORG 0100HMAIN: MOV A, #29H ;将 8 位无符号数赋给 AMOV DPTR
6、, #4000H ;定义数据指针MOVX DPTR, A ;将 X 存于片外 RAMCLR C ;将进位位清零KIND1:CJNE A, #14H, KIND2 ;将 A 与 14H 比较,若不等于 14H,跳转至 KIND2OUT1: CPL A ;对 A 中内容取反R0=60H?R0,P2 置零分计数,R1 加 1,并存入 A 中,转换成 BCD码R1=60H?将 R1,P1 置零小时计数,R2 加 1 并存入 A,转换成 BCD 码R2=R4?将 A 赋给 P1将 R2,P0 置零将 A 赋给P0将 A 赋给 P2-_MOV DPTR, #4001H ;定义数据指针MOVX DPTR,
7、A ;将计算结果存于片外地址 4001HSJMP DONEKIND2:JNC KIND3 ;判断进位位 CY 是否为 0,若为 0,跳转至 KIND3SJMP OUT1 ;否则跳转至 OUT1KIND3:CLR C ;将进位位清零CJNE A,#28H, KIND4 ;将 A 中内容与 28H 比较,若不等于 28H,跳转至 KIND4OUT2: MOV B,A ;将 A 中内容赋给 BMUL AB ;计算 X 的平方,将结果高八位存于 B,低八位存于 AMOV DPTR, #4001H ;定义数据指针MOVX DPTR,A ;将结果低八位存于片外地址 4001HINC DPTR ;数据指针加
8、一MOV A,B ;将 B 中内容赋给 AMOVX DPTR,A ;将结果高八位存于片外地址 4002HSJMP DONEKIND4:JNC OUT2 ;判断进位位是否为 0,若为 0,跳转至 OUT2SJMP OUT3 ;否则跳转至 OUT3OUT3: MOV B,#02HDIV AB ;计算 X/2,将商存于 A,余数存于 BMOV DPTR,#4001H ;定义数据指针MOVX DPTR,A ;将商存于片外地址 4001HINC DPTR ;数据指针加 1MOV A,BMOVX DPTR,A ;将余数存于片外地址 4002HSJMP DONEDONE: SJMP $ END2. 24 小
9、时时钟ORG 0000HLJMP MAIN-_ORG 0100HMAIN: MOV R0,#00HMOV P0,#00H ;时钟位清零MOV P1,#00H ;分钟位清零MOV P2,#00H ;秒钟位清零START: JB P3.0,START ;P3.0 为低电平开始计数,高电平停止计数MOV R2,P2 ;P2 的值存入 R2CJNE R2,#60H,DEL ;秒钟达到 60 继续,不足 60 跳转MOV P2,#00H ;秒钟清零MOV A,P1ADD A,#01H ;分钟位加 1DA A ;分钟位改为 BCD 码MOV P1,A MOV R1,P1 ;P1 的值存入寄存器 R1CJN
10、E R1,#60H,DEL ;分钟达到 60 继续,不足 60 跳转MOV P1,#00H ;分钟清零MOV A,R0ADD A,#01H ;时钟位加 1DA A ;时钟位改为 BCD 码MOV R0,AMOV P0,ACJNE R0,#24H,DEL ;时钟达到 24 继续,不足 24 跳转MOV P0,#00H ;时钟位清零MOV R0,#00HDEL: MOV R7,#24 ;延时程序LOOP1: MOV R6,#61LOOP2: MOV R5,#170LOOP3: NOPNOPDJNZ R5,LOOP3DJNZ R6,LOOP2DJNZ R7,LOOP1MOV A,P2ADD A,#0
11、1H ;秒钟位加 1DA AMOV P2,A SJMP STARTEND 六. 程序测试方法与结果、软件性能分析1.分段函数改变 X 的值,分别在不同的 X 值时运行程序,结果如下截图(1)X=29H-_(2)X=21H-_(3)X=0CH结果与预测相符合,程序正确。2.24 小时时钟程序-_暂停时思考题:1实现多分支结构程序的主要方法有哪些?举例说明。答:1.是利用条件转移指令实现,如 DJNZ,JNC 等等例如:例如,判断两个单字节无符号数的大小(分别存于片内 RAM 的 40H 和 41H 单元)并把大数存入 42H 单元。可以用判断 CY 的转移指令 JNC 来实现,程序如下:JUDGE:MOV A,40HCLR CSUBB A,41HJNC LPMOV 42H,41HRETLP: MOV 42H,40HRET2.利用分支表来实现,如分支地址表、转移指令表、地址偏移量表。例如:根据 R3 的值控制转向 8 个分支程序。采用分支地址表实现: