单片机第二次试验报告——分支程序设计汇总_第1页
单片机第二次试验报告——分支程序设计汇总_第2页
单片机第二次试验报告——分支程序设计汇总_第3页
单片机第二次试验报告——分支程序设计汇总_第4页
单片机第二次试验报告——分支程序设计汇总_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

1、精选优质文档-倾情为你奉上 微机实验报告实验名称 分支程序设计实验 专业班级 姓名 学号 序号 联系方式 一、任务要求 熟练掌握KeilC环境下汇编语言程序的调试方法,加深对汇编语言指令、机器码、寻址方式等基本内容的理解,掌握分支程序和简单程序的设计与调试方法,了解并行IO口的使用。 1. 设有8bits符号数X存于外部RAM单元,按以下方式计算后的结果Y也存于外部RAM单元,请按要求编写程序。 2. 利用51系列单片机设计一个24小时制电子时钟,电子时钟的时、分、秒数值分别通过P0、P1、P2端口输出(以压缩BCD码的形式)。P3.0为低电平时开始计时,为高电平时停止计时。 提高部分(选做)

2、:a. 实现4位十进制加、减1计数,千位、百位由P1口输出;十位、个位由P2口输出。利用P3.7状态选择加、减计数方式。b. 利用P3口低四位状态控制开始和停止计数,控制方式自定。二、设计思路 1.分段函数设计 对于第一个任务,相当于设计一个分段函数程序,根据变量X的值所处的区间进行相应的计算。由学过的知识知道,可利用比较转移指令CJNE来判断X是否等于临界值20,40,若不等,再根据执行CJNE指令后的进位位CY的值来判断X与临界值的的大小关系,易知CY=0则X大于临界值,CY=1则X小于临界值;如此,再进行相应的计算。另外,除法计算中可能产生余数,商和余数应该分开存储,若乘方运算结果大于2

3、55,高八位与低八位应分开存储。 2. 24小时制时钟程序 本程序须可以构建两部分循环。首先构建一个三重循环实现“一秒延时”,循环体利用NOP指令(单字节指令,1µs)经多次循环达到延时一秒的效果。再利用已经构建好的“一秒延时”部分,设计计时系统的三重循环,秒(0-59)、分(0-59)、时(0-23)。需要注意的是,在小时、分、秒达到59时,下一次应该为零。程序运行时修改P3.0的值可以实现暂停和继续的功能。 3.加一减一程序 先初始化P1和P2,然后当P3低四位均为0作为开始计数的标志,每次计数中插一个延时程序。P3.7为0时进行加1计数:先把低2位从P2中取出至A,对A进行AD

4、D加一计数并进行十进制修正,然后存进P2;再把高2位从P1取出至A,对A进行ADDC的加进位操作并十进行进制修正,然后存进P1。P3.7为1时进行减一计数:只需改用ADD指令加上1的补码即可,高2位在第二位为99时进行同样的操作,最后分别用P1和P2输出高2位和低2位。即可实现所需功能。三、资源分配 1.分段函数 根据题目的条件,首先,设该8位无符号数为30H,把片外地址4000H分配给它,把片外地址4001H和4002H分配给经分段函数计算得到的结果Y。按位取反计算结果存于4001H单元,而除法计算结果的商与余数和乘方计算中结果的高、低八位分开存储于4001H-4002H单元。用寄存器A,B

5、来存放在乘除运算中所得的中间结果。 2.二十四小时制时钟 工作寄存器R0、R1、R2分别用于秒、分、时循环次数的设定,R3、R4分别用于分与时的循环计数,R5-R7用于“一秒延时”中三重循环的循环次数设定。秒、分、时数值分别由P2、P1、P0端口输出。 3.加、减1计数程序:      将十进制数的千位数和百位数存于P1,将十进制数的十位数和个位数存放于P2,P3.0至P3.3为是否进行计数的4个控制位,P3.7为选择加一或减一的计数方式的控制位 ;R3,R4,R5为计数中的延时程序指定循环次数。   &

6、#160;      4、 流程图 1.分段函数 (DPTR)A 存X于片外RAM 设置数据指针 X赋值 AX 开始 A20 N Y Y=/XCY1? N(4001H)A CY0 YY=X/2CY1?A40? N Y Y=X² Y N (4001H)A (4002H)B 结束2. 时钟程序 开始 PO0 P10 P20 P30 P3.0=0 ?N Y 延时1s 秒钟计数,R0加1AR0,并转换成BCD码 P2A R0=60H ?Y N R00 P20 分钟计数,R1加1AR1, 并转换为BCD码NR1=60H ? P1A R

7、10 P10 Y 时钟计数,R2加1AR2,并转换为BCDR20 P00 P0A R2=24 ? N Y 5 源代码1.分段函数 ORG 0000H LJMP MAIN ORG 0100HMAIN: MOV A, #30H ;将8位无符号数赋给A MOV DPTR, #4000H ;定义数据指针 MOVX DPTR, A ;将X存于片外RAM CLR C ;将进位位清零KIND1:CJNE A, #14H, KIND2 ;将A与14H比较,若不等于14H,跳转至KIND2OUT1: CPL A ;对A中内容取反 MOV DPTR, #4001H ;定义数据指针 MOVX DPTR, A ;将计

8、算结果存于片外地址4001H SJMP DONEKIND2:JNC KIND3 ;判断进位位CY是否为0,若为0,跳转至KIND3 SJMP OUT1 ;否则跳转至OUT1KIND3:CLR C ;将进位位清零 CJNE A,#28H, KIND4 ;将A中内容与28H比较,若不等于28H,跳转至KIND4OUT2: MOV B,A ;将A中内容赋给B MUL AB ;计算X的平方,将结果高八位存于B,低八位存于A MOV DPTR, #4001H ;定义数据指针 MOVX DPTR,A ;将结果低八位存于片外地址4001H INC DPTR ;数据指针加一 MOV A,B ;将B中内容赋给A

9、 MOVX DPTR,A ;将结果高八位存于片外地址4002H SJMP DONEKIND4:JNC OUT2 ;判断进位位是否为0,若为0,跳转至OUT2 SJMP OUT3 ;否则跳转至OUT3OUT3: MOV B,#02H DIV AB ;计算X/2,将商存于A,余数存于B MOV DPTR,#4001H ;定义数据指针 MOVX DPTR,A ;将商存于片外地址4001H INC DPTR ;数据指针加1 MOV A,B MOVX DPTR,A ;将余数存于片外地址4002H SJMP DONEDONE: SJMP $ END2. 时钟程序 ORG 0000H LJMP MAIN O

10、RG 0100HMAIN:MOV R0,#00HMOV P0,#00H ;时钟位清零MOV P1,#00H ;分钟位清零MOV P2,#00H ;秒钟位清零START:JB P3.0,START ;P3.0为低电平开始计数,高电平停止计数 MOV R2,P2 ;P2的值存入R2 CJNE R2,#60H,DEL ;秒钟达到60继续,不足60跳转 MOV P2,#00H ;秒钟清零MOV A,P1ADD A,#01H ;分钟位加1 DA A ;分钟位改为BCD码 MOV P1,A MOV R1,P1 ;P1的值存入寄存器R1 CJNE R1,#60H,DEL;分钟达到60继续,不足60跳转 MO

11、V P1,#00H;分钟清零 MOV A,R0 ADD A,#01H;时钟位加1 DA A;时钟位改为BCD码 MOV R0,A MOV P0,A CJNE R0,#24H,DEL;时钟达到24继续,不足24跳转 MOV P0,#00H ;时钟位清零 MOV R0,#00HDEL: MOV R7,#24 ;延时程序LOOP1: MOV R6,#61LOOP2: MOV R5,#170LOOP3: NOP NOP DJNZ R5,LOOP3 DJNZ R6,LOOP2 DJNZ R7,LOOP1 MOV A,P2 ADD A,#01H;秒钟位加1 DA A MOV P2,A SJMP START

12、END3. 加一减一程序 ORG 0000H LJMP MAIN ORG 0100H MAIN:MOV P1,#00H ;P1端口置零MOV P2,#00H;P2端口置零MOV P3,#7FH ;P3端口置#7FHSTART:JB P3.0,STARTJB P3.1,STARTJB P3.2,STARTJB P3.3,START;判断是否开始计时LJMP DELAY;跳转到延时子程序DELAY:MOV R7,#24DEL1: MOV R6,#61DEL2: MOV R5,#170DEL3: NOP NOP DJNZ R5,DEL3 DJNZ R6,DEL2 DJNZ R7,DEL1;延时1秒J

13、B P3.7 ,DOWN;P3.7为0时,加1计数;P3.7为1时,减1计数LJMP UP DOWN:MOV A,P2CLR CSUBB A,#01HMOV R1,AANL A,#0FHMOV R7,AMOV A,R1ANL A,#0F0HMOV R1,AMOVA,P1SUBB A,#00HMOV R0,AANLA,#0FHMOV R6,AMOV A,R0ANL A,#0F0HMOV R0,ACJNE R7,#0FH,LOOP1MOV R7,#09HLOOP1:CJNE R1,#0F0H,LOOP2MOV R1,#90HLOOP2:CJNE R6,#0FH,LOOP3MOV R6,#09HLO

14、OP3:CJNE R0,#0F0H,LOOP4MOV R0,#90HLOOP4:MOV A,R1ADD A,R7DA AMOV P2,AMOV A,R0ADD A,R6DA AMOV P1,ALJMP DELAY ;减1计数子程序UP:MOV A,P2ADD A,#01HDA AMOV P2,AMOV A,P1ADDC A,#00HDA AMOV P1,ALJMP DELAY ;加1计数子程序END6、 程序测试方法与结果、软件性能分析1.分段函数对于分段函数的问题,可以将X设为某一值,运行程序,观察各个寄存器及有关地址中内容,进行验证。截图如下: (1)X=30H (2)X=0AH (3)X

15、=18H经验证,所有结果正确,且运行程序过程中并未出现任何问题,故源程序正确 2.24小时时钟程序 附加:思考题 1实现多分支结构程序的主要方法有哪些?举例说明。 2在编程上,十进制加1计数器与十六进制加1计数器的区别是什么?怎样用十进制加法指令实现减1计数?答:1.一是利用条件转移指令实现,如DJNZ,JNC等等 例如:例如,判断两个单字节无符号数的大小(分别存于片内 RAM 的 40H 和 41H 单元)并把大数存入 42H 单元。可以用判断 CY 的转移指令 JNC 来实现,程序如下:JUDGE:MOV A,40H CLR C SUBB A,41H JNC LP MOV 42H,41H

16、RETLP: MOV 42H,40H RET 二是利用分支表来实现,如分支地址表、转移指令表、地址偏移量表。例如:根据 R3 的值控制转向 8 个分支程序。采用分支地址表实现:MOV DPTR,#BRATAB ;取表首地址MOV A,R3ADD A,R3 ;AR3×2JNC NADDINC DPH ;R3×2 进位加到 DPHNADD:MOV A,R4 ;暂存 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 SUBRDW

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论