




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
单片机第三章第一页,共四十八页,2022年,8月28日教学目标掌握汇编语言程序基本结构。掌握程序设计的步骤和方法。学会具体程序的应用。第二页,共四十八页,2022年,8月28日程序设计的过程大致可以分为以下几个步骤:(1)编制说明要解决问题的程序框图。(2)确定数据结构、算法、工作单元、变量设定。(3)根据所用计算机的指令系统,按照已编制的程序框图,用汇编语言编制出源程序。(4)将编制出的程序在计算机上调试,直至实现预定的功能。第三页,共四十八页,2022年,8月28日4.1三种基本程序结构:(1)顺序程序顺序程序是指按顺序依次执行的程序,也称为简单程序或直线程序。顺序程序结构虽然比较简单,但也能完成一定的功能任务,是构成复杂程序的基础。
第四页,共四十八页,2022年,8月28日【例4-1/3-27】已知16位二进制负数存放在R1、R0中,试求其补码,并将结果存放在R3、R2中。分析:负数的求补:“求反加1”,符号位不变。利用CPL指令实现求反;加1时,则应低8位先加1,高8位再加上低位的进位。注意:不能用INC指令。第五页,共四十八页,2022年,8月28日步骤:(1)低八位送累加器(CPL操作八位数字只能在累加器中进行);(2)低八位取反,加1;(3)存低八位处理结果;(4)高八位送累加器;(5)高八位取反,加标志位并将符号位置1;(6)保存高八位处理结果。第六页,共四十八页,2022年,8月28日程序如下:CONT: MOV A,R0 ;读低8位
CPLA ;取反
ADD A,#1 ;加1
MOV R2,A;存低8位
MOV A,R1;读高8位
CPL A ;取反
ADDCA,#80H ;加进位及符号位
MOV R3,A ;存高8位
RET ;返回第七页,共四十八页,2022年,8月28日【例3-28/4-2】将两个半字节数合并成一个1字节数。设内部RAM的40H、41H单元中分别存放着8位二进制数11011001B、10110110B。要求取出两个单元中的低半字节,合并成一个字节后,存放在42H单元中。第八页,共四十八页,2022年,8月28日要求:设内部RAM的40H、41H单元中分别存放着8位二进制数。要求取出两个单元中的低半字节,合并成一个字节后,存放在42H单元中。步骤:(1)取40H里面的数字放入累加器;(2)高四位清零;(3)高低位互换;(4)保存;(5)取41H里面的数字放入累加器;(6)高四位清零;(7)拼字;(8)保存。第九页,共四十八页,2022年,8月28日程序如下:
ORG 0000HSTART: MOV R1,#40H MOV A,@R1 ANL A,#0FH ;取第一个半字节
SWAP A INC R1
XCH A,@R1 ;取第二字节
ANL A,#0FH ;取第二个半字节
ORL A,@R1 ;拼字
INC R1 MOV @R1,A ;存放结果
SJMP $ END第十页,共四十八页,2022年,8月28日【例3-29/4-3】拆字程序。
40H里面一个8位二进制数拆成两个半字节数字,分别送入41H42H中。步骤(1)40H数字送累加器;(2)备份;(3)高四位清零;(4)保存低四位;(5)取数字;(6)低四位清零;(7)高地位互换;(8)保存高四位。第十一页,共四十八页,2022年,8月28日
ORG 0000HSTART: MOV R1,#40H MOV A,@R1 MOV B,A ;暂存B中
ANL A,#0FH ;取第一个半字节
INC R1 MOV @R1,A ;存放第一个半字节
MOV A,B SWAP A ANL A,#0FH ;取第二个半字节
INC R1 MOV @R1,A ;存放第二个半字节
SJMP $ END第十二页,共四十八页,2022年,8月28日4.1.2分支程序分支程序比顺序程序的结构复杂得多,其主要特点是程序的流向有两个或两个以上的出口,根据指定的条件进行选择确定。编程的关键是如何确定供判断或选择的条件以及选择合理的分支指令。第十三页,共四十八页,2022年,8月28日【例3-30/4-4】求单字节有符号二进制数的补码。分析:正数的补码是其本身,负数的补码是其反码加1。因此,程序首先判断被转换数的符号,负数进行转换,正数即为补码。步骤:(1)判断正负,正则跳到正数对应的子程序,负数则往下执行;(2)假设是负数,取反;(3)加1;(4)符号位置1,负数处理程序结束;(5)正数处理子程序。第十四页,共四十八页,2022年,8月28日设二进制数放在累加器A中,其补码放回到A中。程序如下:
ORG 0000HCMPT: JNB ACC.7,NCH;(A)>0,不需转换
CPL A ADD A,#1 SETB ACC.7;保存符号NCH: SJMP $ END第十五页,共四十八页,2022年,8月28日【例3-31/4-5】两个无符号数比较大小。设两个连续外部RAM单元ST1和ST2中存放不带符号的二进制数,找出其中的大数存入ST3单元中。第十六页,共四十八页,2022年,8月28日设两个连续外部RAM单元ST1和ST2中存放不带符号的二进制数,找出其中的大数存入ST3单元中。分析:减法运算的操作数必须在内部数据存储器中,所以ST1和ST2中的数据首先要存入内部数据存储器,再通过减法运算判断大小步骤(1)取第一个数并保存;(2)取第二个数到累加器A;(3)第二个数减第一个数(4)如果发生借位(CY=1),则第一个存入ST3,否则第二个数…第十七页,共四十八页,2022年,8月28日程序如下:
ORG 8000H ST1 EQU8040HSTART1: CLR C ;进位位清零
MOV DPTR,#ST1 ;设数据指针
MOVX A,@DPTR ;取第一个数
MOV R2,A ;暂存R2 INC DPTR MOVX A,@DTPR ;取第二个数
SUBB A,R2 ;两数比较
JNC BIG1 XCH A,R2 ;第一个数大BIG0: INC DPTR MOVX @DPTR,A;存大数
SJMP $BIG1:MOVXA,@DPTR;第二个数大
SJMP BIG0 END第十八页,共四十八页,2022年,8月28日4.1.3循环程序只有简单程序和分支程序是不够的。因为简单程序和分支程序的特点是,每一条指令至多执行一次。在处理实际事务时,有时会遇到多次重复处理的问题,用循环程序的方法来解决就比较合适。循环程序中的某些指令可以反复执行多次。采用循环程序,可使程序缩短,从而节省存储单元。重复次数越多,循环程序的优越性就越明显。第十九页,共四十八页,2022年,8月28日1.单循环程序第二十页,共四十八页,2022年,8月28日【例4-6/3-31】多个单字节数据求和。已知有10个单字节数据,依次存放在以内部RAM的50H单元开始的连续单元中。要求把计算结果存入R2、R3中(高位存R2,低位存R3)。思路:R2、R3、CY首先清零,依次将10个数据跟R3中数据相加(结果存在R3),每次加法完成后,如果CY=1,则R2加1.第二十一页,共四十八页,2022年,8月28日解:程序如下:
ORG 8000HSAD: MOV R0,#50H ;设数据指针
MOV R5,#0AH ;计数值0AH→R5SAD1: MOV R2,#0 ;和的高8位清零
MOV R3,#0 ;和的低8位清零LOOP: MOV A,R3 ;取加数
ADD A,@R0 MOV R3,A ;存和的低8位
JNC LOP1 INC R2 ;有进位,和的高8位+1LOP1: INC R0 ;指向下一个数据地址
DJNZ R5,LOOP SJMP $ END第二十二页,共四十八页,2022年,8月28日【例4-7/3-33】内部RAM单元清零。要求:将60H为起点的9个单元清“0”。解:程序如下:
ORG 0000HCLEAR: CLR A ;A清0 MOV R0,#60H ;确定清0单元起始地址
MOV R6,#09 ;确定要清除的单元个数LOOP: MOV @R0,A ;清单元
INC R0 ;指向下一个单元
DJNZ R6,LOOP ;控制循环
SJMP $ END第二十三页,共四十八页,2022年,8月28日【例4-8】外部RAM单元清零。要求:设有40个外部RAM单元要清“0”,即为循环次数存放在R2寄存器中,其首地址存放在DPTR中,设为3000H。解:方法一:程序如下:
ORG 0000H MOV DPTR,#3000H CLEAR: CLR A MOV R2,#28H ;置计数值LOOP: MOVX @DPTR,A INC DPTR ;修改地址指针
DJNZ R2,LOOP ;控制循环
END第二十四页,共四十八页,2022年,8月28日2.多重循环程序如果在一个循环体中又包含了其他的循环程序,即循环中还套着循环,这种程序称为多重循环程序。【例4-9】10秒延时程序。延时程序与MCS-51执行指令的时间有关,如果使用6MHz晶振,一个机器周期为2μs,计算出执行一条指令以至一个循环所需要的时间,给出相应的循环次数,便能达到延时的目的。程序如下:DEL: MOV R5,#100DEL0: MOV R6,#100DEL1: MOV R7,#248DEL2: DJNZ R7,DEL2; DJNZ R6,DEL1 ; DJNZ R5,DEL0 ; RET第二十五页,共四十八页,2022年,8月28日4.2子程序和参数传递方法在实际程序中,常常会多次进行一些相同的计算和操作,如数制转换、函数式计算等。如果每次都从头开始编制一段程序,不仅麻烦,而且浪费存储空间。因此对一些常用的程序段,以子程序的形式,事先存放在存储器的某一区域。当主程序运行过程中需要用子程序时,只要执行调用子程序的指令,使程序转至子程序即可。子程序处理完毕,返回主程序,继续进行以后的操作。调用子程序有以下优点:(1) 避免对相同程序段的重复编制。(2) 简化程序的逻辑结构,同时也便于子程序调试。(3) 节省存储器空间。第二十六页,共四十八页,2022年,8月28日4.2.1工作寄存器或累加器传递参数此方法是把入口参数或出口参数放在工作寄存器或累加器中的方法。使用这种方法可使程序最简单,运算速度也最高。它的缺点是:工作寄存器数量有限,不能传递太多的数据;主程序必须先把数据送到工作寄存器;参数个数固定,不能由主程序任意设定。第二十七页,共四十八页,2022年,8月28日【例4-10】请编出能把20H单元内两个BCD数变换成相应ASCII码放在21H(高位BCD数的ASCII码)和22H(低位BCD数的ASCII码)单元的程序。解:根据ASCII字符表,0~9的BCD数和它们的ASCII码之间仅相差30H。因此,仅需把20H单元中两个BCD数拆开,分别和30H相加即可第二十八页,共四十八页,2022年,8月28日程序如下:
ORG 0000HASC1: MOV R0,#22H MOV @R0,#00H MOV A,20H XCHD A,@R0 ORL 22H,#30H SWAP A ORL A,#30H MOV 21H,A SJMP $ END第二十九页,共四十八页,2022年,8月28日4.2.2用指针寄存器来传递参数由于数据一般存放在存储器中,而不是工作寄存器中,故可用指针来指示数据的位置,这样可以大大节省传递数据的工作量,并可实现可变长度运算。一般如参数在内部RAM中,可用R0或R1作指针。进行可变长度运算时,可用一个寄存器来指出数据长度,也可在数据中指出其长度(如使用结束标记符)。第三十页,共四十八页,2022年,8月28日4.2.3用堆栈来传递参数堆栈可以用于传递参数。调用时,主程序可用PUSH指令把参数压入堆栈中。之后子程序可按栈指针访问堆栈中的参数,同时可把结果参数送回堆栈中。返回主程序后,可用POP指令得到这些结果参数。这种方法的优点是:简单;能传递大量参数;不必为特定的参数分配存储单元。使用这种方法时,由于参数在堆栈中,故大大简化了中断响应时的现场保护。实际使用时,不同的调用程序可使用不同的技术来决定或处理这些参数。下面以几个简单的例子说明用堆栈来传递参数的方法。第三十一页,共四十八页,2022年,8月28日【例4-11】一位十六进制数转换为ASCII码子程序。解:程序如下:HASC:MOV R0,SP DEC R0 DEC R0 ;R0为参数指针
XCH A,@R0 ;保护ACC,取出参数
ANL A,#0FH ADD A,#2 ;加偏移量
MOVC A,@A+PC XCH A,@R0 ;将查表结果放回堆栈中
RET DB '0123456789' ;十六进制数的ASCII字符表
DB 'ABCDEF' END第三十二页,共四十八页,2022年,8月28日【例4-12】把内部RAM中50H、51H的双字节十六进制数转换为4位ASCII码,存放于(R1)指向的4个内部RAM单元。解:编写程序时可以将例4-10当作子程序调用,子程序名为HASC。HA24:MOV A,50H SWAP A PUSH ACC ACALL HASC POP ACC MOV @R1,A INC R1 PUSH 50H ACALL HASC POP ACC第三十三页,共四十八页,2022年,8月28日 MOV @R1,A INC R1 MOV A,51H SWAP A PUSH ACC ACALL HASC POP ACC MOV @R1,A INC R1 PUSH 51H ACALL HASC POP ACC MOV @R1,A END第三十四页,共四十八页,2022年,8月28日【例4-13】一个字节的两位十六进制数转换为两个ASCII码子程序。解:参考程序如下:
ORG0000HHTA2: MOV R0,SP DEC R0 DEC R0 PUSH ACC ;保护累加器内容
MOV A,@R0 ;取出参数
ANL A,#0FH ADD A,#14 ;加偏移量
MOVC A,@A+PC XCH A,@R0;低位HEX的ASCII码放入堆栈中第三十五页,共四十八页,2022年,8月28日 SWAP A ANL A,#0FH ADD A,#7 ;加偏移量
MOVC A,@A+PC INC R0 XCH A,@R0 ;高位HEX的ASCII码放入堆栈中
INC R0 XCH A,@R0 ;高位返回地址放入堆栈,并恢复累加器内容
RET DB '0123456789' DB 'ABCDEF' END第三十六页,共四十八页,2022年,8月28日4.3查表程序设计查表程序是一种常用程序,它广泛应用于LED显示器控制、打印机打印及数据补偿、计算、转换等功能程序中,具有程序简单、执行速度快等优点。第三十七页,共四十八页,2022年,8月28日1.用MOVCA,@A+PC查表指令编程【例4-16/3-41】用查表方法编写彩灯控制程序,编程使彩灯先顺次点亮,再逆次点亮,然后连闪3下,反复循环。第三十八页,共四十八页,2022年,8月28日第三十九页,共四十八页,2022年,8月28日START: MOV R0,#00HLOOP: CLR A MOV A,R0 ADD A,#0CH MOVC A,@A+PC CJNE A,#03H,LOOP1;3字节 SJMP START;
2字节LOOP1:MOV P2,A;
2字节 ACALL DEL;
2字节 INC R0;
1字节SJMP LOOP;2字节TAB:DB0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH DB0BFH,0DFH,0EFH,0F7H,0FBH,0FDH,0FEH DB00H,0FFH,00H,0FFH,00H,0FFH,03HDEL: MOV R7,#03HDEL1: MOV R6,#0FFHDEL2: MOV R5,#0FFHDEL3: DJNZ R5,DEL3 DJNZ R6,DEL2 DJNZ R7,DEL1 RET END第四十页,共四十八页,2022年,8月28日2.用MOVCA,@A+DPTR查表指令编程【例4-17/3-42】START: MOV DPTR,#TABLOOP: CLR A MOVC A,@A+DPTR CJNE A,#03H,LOOP1 JMP STARTLOOP1: MOV P2,A ACALL DEL INC DPTR JMP LOOPTAB:DB0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH DB0BFH,0DFH,0EFH,0F7H,0FBH,0FDH,0FEH DB00H,0FFH,00H,0FFH,00H,0FFH,03H
DEL: MOV R7,#03HDEL1: MOV R6,#0FFHDEL2: MOV R5,#0FFHDEL3: DJNZ R5,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公路货运行业数字化转型效率提升的物流行业物流绿色物流发展报告
- 2025年医疗健康数据隐私保护合规性风险防范与控制报告
- 公司产品标准管理办法
- 企业数据开发管理办法
- 代谢药品注册管理办法
- 企业外部审计管理办法
- 企业办公区域管理办法
- 乡镇违反建设管理办法
- 乡镇法庭人员管理办法
- 乡镇集体资产管理办法
- 2025发展对象考试题库带有答案
- 肝癌介入术护理课件
- 企业安全生产内部举报奖励制度
- 胸痛的诊断与处理
- 户外反洗钱宣传活动方案
- 声带小结护理查房
- 2025届山西中考语文真题试卷【含答案】
- 闵行区2024-2025学年下学期七年级数学期末考试试卷及答案(上海新教材沪教版)
- 2024年湖南人文科技学院招聘笔试真题
- 实验室人员授权管理制度
- 2025至2030中国柴油内燃机行业发展趋势分析与未来投资战略咨询研究报告
评论
0/150
提交评论