欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    【大学课件】80C51单片机汇编语言程序设计PPT.ppt

    • 资源ID:6229889       资源大小:924.01KB        全文页数:74页
    • 资源格式: PPT        下载积分:10金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要10金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    【大学课件】80C51单片机汇编语言程序设计PPT.ppt

    第4章 80C51单片机汇编语言程序设计,4.1 单片机程序设计语言概述4.2 汇编语言程序的基本结构形式4.3 80C51 单片机汇编语言程序设计举例4.4 单片机汇编语言源程序的编辑和汇编4.5 80C51 单片机汇编语言伪指令,4.1 单片机程序设计语言概述,4.1.1 机器语言和汇编语言1、机器语言 用二进制代码“0”和“1”表示指令和数据的程序设计语言,是计算机能直接识别并执行的指令。优点:执行速度快、占用内存少。缺点:识别难、记忆难。2、汇编语言 用助记符和专门的语言规则表示指令的功能和特征。优点:助记符与机器指令一一对应。比机器语言直观、易懂、易记。非常适合于实时控制的需要。缺点:难以记忆和使用,程序设计的技巧性较高,编程 难度较大。要求使用者必须精通单片机的硬件系 统和指令系统。缺乏通用性,程序不易移植。,4.1.2 单片机使用的高级语言,对于8051单片机,现有4种语言支持,即汇编、PL/M、C和BASIC。C语言最终得到广泛应用。可以大大提高单片机应用系统研制的开发效率。移植性好。高级语言的不足:生成的目标代码较长,导致应用程序运行速度较慢。,4.1.3 80C51 单片机汇编语言的语句格式,80C51汇编语言的语句格式如下::;1.标号是语句地址的标志符号,标号的几点规定:18个ASCII字符组成,第一个字符必须是字母。不能使用本汇编语言已经定义的符号作为标号。标号后面必须跟以冒号“:”。同一标号在一个程序中只能定义一次。标号可有可无。,错误的标号 正确的标号1BT:BT1BEGIN BEGIN:TA+TB:TATB:ADD:ADD1:,2.操作码用于规定语句执行的操作内容,用指令助记符表示。不能空缺。3.操作数操作数用于为指令操作提供数据。可以是空白,也可能有13个操作数,各操作数之间以逗号分隔。4.注释不属于语句的功能部分,只是对语句的解释说明,以“;”开头。5.分界符(分隔符)用于把语句中的各部分隔开,以便于区分。分界符包括空格、冒号、分号或逗号等符号。,4.2 汇编语言程序的基本结构形式,三种基本结构形式:顺序程序结构,分支程序结构,循环程序结构。4.2.1 顺序程序结构顺序结构程序是最简单的程序结构。程序既无分支、循环,也不调用子程序,程序执行时一条接一条地按顺序执行指令。,(1)分析任务(2)确定算法(3)画流程图(4)编写程序(5)上机调试,2、程序设计的一般步骤,当接到程序设计的任务后,首先对任务进行详尽的分析,搞清楚已知的数据和想要得到的结果,程序应该完成何种的功能。明确在程序设计时应该“做什么”。,根据实际问题的要求和指令系统的特点,确定解决问题的具体步骤。根据任务要求,对不同的计算方法进行比较,选择最适宜的算法。解决“怎样做”的问题。,将解决问题的具体步骤用一种约定的几何图形、指向线和必要的文字说明描述出来,用图形的方法描绘解决问题的思路。,用指令的形式将程序流程图实现出来。,查错、改错,对程序进行优化。,(1)分析任务(2)确定算法(3)画流程图(4)编写程序(5)上机调试,例:3字节无符号数相加:其中被加数在内部RAM的50H、51H和52H单元中;加数在内部RAM的53H、54H和55H单元中;要求把相加之和存放在50H、51H和52H单元中,进位存放在位寻址区的20H位中。,MOV R0,#52H;被加数的低字节地址MOV R1,#55H;加数的低字节地址MOV A,R0ADD A,R1;低字节相加MOV R0,A;存低字节相加结果DEC R0DEC R1MOV A,R0ADDC A,R1;中间字节带进位相加MOV R0,A;存中间字节相加结果DEC R0DEC R1MOV A,R0ADDC A,R1;高字节带进位相加MOV R0,A;存高字节相加结果CLR AADDC A,#00H;进位送00H位保存MOV R0,#20H;存放进位的单元地址MOV R0,A,分支结构也称为选择结构。为分支需要,程序设计时应给程序段的起始地址赋予一个地址标号,以供选择分支使用。分支结构又可分为单分支结构和多分支结构。1.单分支程序结构 单分支程序结构即二中选一,是通过条件判断实现的。一般都使用条件转移指令对程序的执行结果进行判断。可实现单分支转移的指令有:JZ、JNZ、CJNE和DJNZ。位状态转移指令:JC、JNC、JB、JNB和JBC等。,4.2.2 分支程序结构,(1)单分支结构举例 假定在外部RAM中有ST1、ST2和ST3共3个连续单元,其中ST1和ST2单元中存放着两个无符号二进制数,要求找出其中的大数并存入ST3单元中。,解:(1)分析任务:比较两个数的大小(2)算法:算术运算、控制转移(3)程序结构:单分支(4)数据类型:单字节、二进制、无符号数(5)数据结构:单元地址升序排列(6)RAM单元安排:外部RAM单元(7)采用寄存器间接寻址方式(R0、R1或DPTR)(8)程序设计流程框图;(9)程序清单;,START:CLR C;进位位清0 MOV DPTR,#ST1;设置数据指针 MOVX A,DPTR;取第1个数 MOV R2,A;第1个数存于R2 INC DPTR;数据指针加1 MOVX A,DPTR;取第2个数 SUBB A,R2;两数比较 JNC BIG1;若第2个数大,则转向BIG1 XCH A,R2;若第1个数大,则整字节交换BIG0:INC DPTR MOVX DPTR,A;存大数 RETBIG1:MOVX A,DPTR SJMP BIG0,上例中,如果采用CJNE A,direct,rel指令,应如何修改程序?,(2)多重单分支结构举例 多重单分支结构中,通过一系列条件判断,进行逐级分支。为此可使用比较转移指令CJNE实现。,CJNE A,55H,LOOP1;若TaT55,则转向LOOP1AJMP FH;若TaT55,则返回LOOP1:JNC JW;若(CY)0,表明TaT55,转降温处理程序CJNE A,54H,LOOP2;若TaT54,则转向LOOP2AJMP FH;若TaT54,则返回LOOP2:JC SW;若(CY)1,表明TaT54,转升温处理程序 FH:RET;若T55TaT54,则返回主程序,例:假定采集的温度值Ta放在累加器A中。此外,在内部RAM 54H单元存放温度下限值T54,在55H单元存放温度上限值T55。若TaT55,程序转向JW(降温处理程序);若TaT54,则程序转向SW(升温处理程序);若T55TaT54,则程序转向FH(返回主程序)。,解:(1)分析任务:解方程(2)算法:控制转移(3)程序结构:多分支(4)数据类型:单字节、二进制、有符号数(5)RAM单元安排:外部RAM单元(6)采用寄存器间接寻址方式(R0、R1或DPTR)(7)程序设计流程框图(8)程序清单;,例:已知:127X-128,求Y。设X,Y分别存放在外部RAM 1000H和2000H单元中。,返回,XAD EQU 1000H;BUF EQU 2000H;ORG 1000HSTART:MOV DPTR,#XAD;数据X的地址送数据指针DPTR MOVX A,DPTR;A取数据X JZ SAV;X0转SAV JB ACC.7,NEG;X0转NEG,否则,X0 MOV A,#01H;SJMP SAV;NEG:MOV A,#0FFH;(0FFH为-1补码)SAV:MOV DPTR,#BUF;数据Y的地址送数据指针DPTR MOVX DPTR,A;保存Y值 END,上例中,如果采用CJNE指令,应如何修改程序?,XAD EQU 1000H;BUF EQU 2000H;ORG 1000HSTART:MOV DPTR,#XAD;数据X的地址送数据指针DPTR MOVX A,DPTR;A取数据X CJNE A,#0,ANZ;X0转ANZ SJMP SAV;ANZ:JC NEG;X0 MOV A,#01H;SJMP SAV;NEG:MOV A,#0FFH;(0FFH为-1补码)SAV:MOV DPTR,#BUF;数据Y的地址送数据指针DPTR MOVX DPTR,A;保存Y值 END,2.多分支程序结构多分支程序结构流程中具有两个以上条件可供选择。可供使用的是变址寻址转移指令“JMP A+DPTR”,但使用该指令实现多分支转移时,需要有数据表格配合。多分支程序结构,(1)通过数据表实现程序多分支,MOV A,n;分支序号送A MOV DPTR,#BRTAB;地址表首址 MOVC A,A+DPTR;查表 JMP A+DPTR;转移BRTAB:DB BR0-BRTAB;地址表 DB BR1-BRTAB DB BRn-BRTABBR0:分支程序BR1:BRn:,(2)通过转移指令表实现程序多分支,MOV A,nRL A;分支序号值乘以2MOV DPTR,#BRTAB;转移指令表首址JMP A+DPTRBRTAB:AJMP BR0;转分支程序0AJMP BR1;转分支程序1 AJMP BR127;转分支程序127BR0:;分支程序BR1:BRn:,(3)其他实现程序多分支的方法,MOV DPTR,#BRTAB;分支入口地址表首址MOV A,R0RL A;分支转移值乘以2MOV R1,A;暂存A值INC AMOVC A,A+DPTR;取低位地址PUSH ACC;低位地址入栈MOV A,R1;恢复A值MOVC A,A+DPTR;取高位地址PUSH ACC;高位地址入栈RET;分支入口地址装入PCBRTAB:DW BR0;分支程序入口地址表 DW BR1 DW BR127,例:假设键盘上有4个按键,功能说明如下表:分析任务 确定算法 程序流程框图,假设转移指令表名称为BRTAB,分支程序序号已在A 中。MOV DPTR,#BRTAB CLR C RLC A JMP A+DPTR;ORG 3000H3000H BRTAB:AJMP ER;转删除分支程序3001H 3002H AJMP DS;转读数据分支程序3003H3004H AJMP XS;转写数据分支程序3005H3006H AJMP CR;转插入分支程序,ORG 3100H3100H ER:;删除分支程序 ORG 3200H3200H DS:;读数据分支程序 ORG 3300H3300H XS:;写数据分支程序 ORG 3400H3400H CR:;插入分支程序 END,(4)使用比较转移指令CJNE实现。,4.2.3 循环程序结构,循环结构是重复执行某个程序段。使用条件转移指令通过条件判断来实现和控制循环。,循环程序一般由四个主要部分组成:(1)初始化部分:为循环程序做准备,如规定循环次数、给各变量和地址指针预置初值。(2)处理部分:为反复执行的程序段,是循环程序的实体,也是循环程序的主体。(3)循环控制部分:其作用是修改循环变量和控制变量,并判断循环是否结束,直到符合结束条件时,跳出循环为止。(4)结束部分:这部分主要是对循环程序的结果进行分析、处理和存放。,MOV R2,#0FFH;设置长度计数器初值 MOV R0,#3FH;设置字符串指针初值LOOP:INC R2INC R0CJNE R0,#0DH,LOOPRET,举例:通过查找结束标志(回车符)以统计字符串长度的循环 程序。假定字符串存放在内部RAM从40H单元开始的连续存储单元中。为找到结束标志,应采用逐个字符依次与回车符(ASCII码0DH)比较的方法。同时在程序中还应设置一个字符串指针以顺序定位字符,设置一个字符长度计数器以累计字符个数。,单循环程序一般有以下两种典型结构:,双重循环程序的结构:,解:(1)分析任务:数据传送;(2)算法:比较、控制转移(3)程序结构:分支、循环(4)数据类型:多字节字符串(5)RAM单元安排:内部RAM单元、外部RAM单元(6)采用寄存器间接寻址方式(R0、R1或DPTR),例:把内部RAM中起始地址为DATA的数据串传送到外部 RAM以BUFFER为首地址的区域,直到发现“$”字符 的ASC码为止,同时规定数据串最大长度为32个字节。,(7)程序流程框图;,ORG 0030H DATACS:MOV R0,#DATA;DATA数据区首地址 MOV DPTR,#BUFFER;BUFFER数据区首地址 MOV R1,#20H;最大数据串长 LOOP:MOV A,R0;取数据 SUBB A,#24H;判是否为“$”字符 JZ LOOP1;是“$”字符,转结束 MOVX A,R0;MOVX DPTR,A;数据传送 INC R0;INC DPTR;DJNZ R1,LOOP;循环控制 LOOP1:RET;结束 END,【补充程序】存储器清零程序。假设在内部RAM区,开辟96个工作单元,工作单元首地址为20H,则工作单元清零程序子程序如下:,思考题:如采用CJNE指令,应如何修改程序?,解:ORG 1000H CLR0:MOV R0,#20H;循环初始化部分 MOV R7,#96;CLR A LOOP:MOV R0,A;循环体部分 INC R0;修改变量 DJNZ R7,LOOP;循环控制部分 RET END,DEC R7CJNE R7,#00H,LOOP;,例:两个三字节二进制无符号数相加,被加数放在内部RAM 50H52H单元(低字节存放在高地址单元,高字节存放在低地址单元,即低位在前,高位在后),加数放在53H55H单元,和放在50H52H单元,最高位如有进位,则放在23H单元中。,被加数 N1 高字节(8位)中字节(8位)低字节(8位)加数 N2 高字节(8位)中字节(8位)低字节(8位)+)进位位(CY)进位位(CY)进位位(CY)和 N3 进位 高字节(8位)中字节(8位)低字节(8位),返回,程序流程框图,ORG 0030H ADDUDO:MOV R0,#52H;循环初始化部分 MOV R1,#55H;MOV R7,#03H;循环次数 CLR C;LOOP:MOV A,R0;循环体部分 ADDC A,R1;MOV R0,A;DEC R0;修改指针变量 DEC R1;DJNZ R7,LOOP;循环控制部分 CLR A;循环结束处理部分 ADDC A,#00H;MOV R0,#23H;MOV R0,A;RET;END,程序清单,4.3 80C51单片机汇编语言程序设计举例,4.3.2 定时程序 在单片机的控制应用中,常有定时的需要,如定时中断、定时检测和定时扫描等。定时功能除可以使用纯硬件电路、可编程定时/计数器实现外,还可以使用软件程序(定时程序)完成。定时程序是典型的循环程序,它是通过执行一个具有固定延迟时间的循环体来实现定时的。,(1)单循环定时程序 MOV R5,#TIME;LOOP:NOP;NOP;DJNZ R5,LOOP;,假设单片机晶振频率fosc=6MHz,则一个机器周期为2s,NOP、DJNZ指令分别是单、双机器周期指令。定时程序的总延迟时间是循环程序段延时时间的整数倍,由于R5是8位寄存器,因此,这个定时程序的最长定时时间为:256(28)8=2048(s),(2)较长时间的定时程序(多重循环定时子程序)TIME:MOV R5,#TTME1;LOOP2:MOV R4,#TEME2;LOOP1:NOP;NOP;DJNZ R4,LOOP1;DJNZ R5,LOOP2;RET;这个定时子程序的最长定时时间为:256(28)4+2+1256(28)2+4=525828(s),(3)调整定时时间 在定时程序中可通过在循环程序段中增减指令的方法对定时时间进行微调。例:MOV R0,#TTME;LOOP:ADD A,R1;INC DPTR;DJNZ R0,LOOP;由于ADD、INC、DJNZ指令的机器周期分别为1、2、2,所以,该程序定时时间为=(1+2+2)2sTime(s)。,假定要求定时时间为24us。对于这个定时程序,只须增加一条NOP指令即可实现。MOV R0,#TIME;LOOP:ADD A,R1;INC DPTR;NOP;DJNZ R0,LOOP;只须TIME取2,即可得到精确的24s定时。,(4)以一个基本的延时程序满足不同的定时要求 如果一个系统有多个定时需要,我们就可以设计一个基本延时程序,使其延时时间为各定时时间的最大公约数,然后可以以此基本程序作为子程序,通过调用的方法实现所需不同定时。,MOV R0,#05H;5S定时LOOP:LCALL DELAY;DJNZ R0,LOOP1;MOV R0,#0AH;10S定时LOOP2:LCALL DELAY;DJNZ R0,LOOP2;MOV R0,#14H;20S定时LOOP3:LCALL DELAY;DJNZ R0,LOOP3;,例:在单片机应用系统中,假设需要的定时时间分别为5S、10S、20S,可设计一个1S延时子程序DELAY,则5S、10S、20S的定时时间可通过调用DELAY实现。,4.3.3 查表程序 所谓查表程序,就是指预先把数据以表格形式存放在程序存储器中,然后使用程序读出,这种能读出表格数据的程序就称之为查表程序。查表操作对单片机的控制应用十分重要,查表程序常用于实现非线性修正,非线性函数转换以及代码转换等场合。,MCS-51单片机指令系统中有两条专用查表指令:(1)MOVC A,A+DPTR;A(A)+(DPTR)(2)MOVC A,A+PC;A(A)+(PC)这两条查表指令的功能是完全相同的,其共同优点是:能在不改变PC和DPTR的状态下,只根据A的内容就可以取出表格中的数据。注意:A的内容均为8位无符号数。,适用于64KB ROM范围内查表,一个数据表格可以被多个程序块使用。编写查表程序时,首先把表的首地址送入DPTR中,再将要查表的数据序号(或下标值)送入A中,然后就可以使用该指令进行查表操作,并把结果送A中。,常用于“本地”范围查表(数据表格只能放在该指令后面256个地址单元之内,而且表格只能被本程序使用)。编写查表程序时,首先把查表数据的序号送入A中,再把从查表指令的下一条指令的首地址到表的首地址间的偏移量与A值相加,然后再使用该指令进行查表操作,并把结果送入A中。,ORG 1000H1000H SQR:MOV A,30H;Ax1002H PUSH DPH;现场保护1004H PUSH DPL;1006H MOV DPTR,#TAB1;DPTR表首地址TAB1 1009H MOVC A,A+DPTR;查表得y100AH MOV 40H,A;40Hy100CH POP DPL;现场恢复100EH POP DPH;1010H RET1011H TAB1:DB 00H,01H,04H,09H,10H,19H DB 24H,31H,40H,51H,例:设计一个子程序,其功能为根据x的内容(09之间)查平方表,求出相应的结果y(y=x2)。假设x的内容已存放在内部RAM 30H单元中,求出y的内容存放在内部RAM 40H单元中。,上例中,如果使用MOVC A,A+PC指令,则编程如下:ORG 1000H1000H SQR:MOV A,30H;Ax1002H PUSH DPH;现场保护1004H PUSH DPL;1006H ADD A,#07H;加偏移量1008H MOVC A,A+PC;查表得y1009H MOV 40H,A;40Hy100BH POP DPL;现场恢复100DH POP DPH;100FH RET1010H TAB1:DB 00H,01H,04H,09H,10H,19H DB 24H,31H,40H,51H,此题中,偏移量=1010H-1009H=07H,编辑:编写程序的过程。汇编语言源程序:用汇编语言编写的程序称为汇编语言源程序。汇编:汇编语言源程序不能在单片机中直接执行,必须将其“翻译”为用二进制代码(机器语言)表示的目标程序才能执行。这个“翻译”过程称为汇编。,4.4 单片机汇编语言源程序的编辑和汇编,4.4.1 手工编程与汇编,手工汇编:先把程序用助记符指令写出,然后通过查指令代码表,逐个把助记符指令“翻译”成机器码,最后再把机器码的程序输入单片机,进行调试和运行。通常把这种查表翻译指令的方法称为手工汇编。由于手工编程是按绝对地址进行定位的,所以手工汇编时要根据转移的目标地址计算转移指令的偏移量,不但麻烦而且容易出错。,4.4.2 机器编辑与交叉汇编,机器编辑:是指借助于微型机或开发系统进行单片机的程序设计,通常都是使用编辑软件进行源程序的编辑。编辑完成后,生成一个由汇编指令和伪指令构成的扩展名为“.ASM”的ASCII码文件。机器汇编:由计算机完成从汇编语言源程序到机器语言目标程序的“翻译”工作。交叉汇编:是指使用一种计算机的汇编程序为另一种计算机的源程序进行汇编,即运行汇编程序进行汇编的是一种计算机,而汇编得到的目标程序是另一种计算机的。,单片机只能采用机器交叉汇编的方法对汇编语言程序进行汇编,在微型机或开发系统上采用交叉汇编方法对源程序进行汇编。交叉汇编后,再使用串行通信,把汇编得到的目标程序传送到单片机,进行程序调试和运行。可见,“机器编辑交叉汇编串行传送”的过程构成了单片机软件设计的“三步曲”,全过程如图所示。单片机汇编语言程序生成过程,对汇编语言程序进行机器交叉汇编时,必须告诉计算机的汇编程序应该如何完成汇编工作,这一任务就是通过使用伪指令来实现的。,伪指令是程序设计人员发给汇编程序的指令,也称汇编命令或汇编程序控制指令。它具有控制汇编程序的输入输出、定义数据和符号、条件汇编、分配存储空间等功能。伪指令没有与之相对应的二进制机器代码,不同汇编语言的伪指令也有所不同。手工汇编不需要伪指令,但机器交叉汇编必须使用伪指令。在对汇编语言程序进行机器交叉汇编前,伪指令存在于汇编语言程序中,但汇编后得到的机器代码程序中不存在伪指令相对应的二进制机器代码,这一点请特别注意。,4.5 80C51单片机汇编语言伪指令,1.汇编起始地址命令ORG(ORiGin)本命令总出现在汇编语言源程序的开头位置,用于规定目标程序的起始地址,即此命令后面的程序或数据块的起始地址。命令格式:标号:ORG 地址 在汇编语言程序的开始,通常都用一条ORG伪指令来规定程序的起始地址,如果不用ORG规定,则汇编得到的目标程序将从0000H开始。,选择项,通常为16位绝对地址,但也可以使用标号或表达式表示,例:ORG 8000H START:MOV A,#00H;,即规定标号START代表地址8000H,目标程序的第一条指令从8000H开始。,2.汇编终止命令END(END of assembly)该命令用于终止源程序的汇编工作。END是汇编语言源程序的结束标志,因此,在整个汇编语言源程序中只能有一个END指令,且位于程序的最后。如果END命令出现在程序中间,则在END之后的指令,汇编程序将不予处理。命令格式为:END 是选择项,只有主程序模块才有;也是选择项,当源程序为主程序时才具有,其值为主程序第一条指令的符号地址,3.赋值命令EQU(EQUate)该命令用于给字符名称赋值。赋值后,其值在整个程序中有效。命令格式为:EQU 其中可以是常数、地址、标号或表达式。其值为8位或16位二进制数。赋值以后的字符名称既可以作地址使用,也可以作立即数使用。,例:HOUR EQU 30H ORG 1000H START:MOV HOUR,#40H;等同于 START:MOV 30H,#40H;,4.DB(Define Byte)定义数据字节命令 本命令用于从指定的地址单元开始,在程序存储器的连续单元中定义字节数据。常使用本命令存放数据表格。命令格式:标号:DB8位数表 例如:DB“how are you?”DB-2,-4,-6,10,11,17,例:存放7段数码管(共阳极)显示的十六进制基数(0F)的十六进制数的字形代码,可使用多条DB命令定义。DB 0C0H,0F9H,0A4H,0B0H;0,1,2,3 DB 99H,92H,82H,0F8H;4,5,6,7 DB 80H,90H,88H,83H;8,9,A,B DB 0C6H,0A1H,86H,84H;C,D,E,F,查表时,为确定数据区的起始地址,可采用两种方法:a)根据DB命令前一条指令的地址确定。把该地址加上它的字节数就是DB的定义的数据字节的起始地址。例:8100:MOV A,#49H;一字节指令 TAB:DB 0COH,0F9H,0A4H,0B0H;定义的7段数码管(共阳极)显示的十六进制基数(0F)的十六进制数的字形代码从8101H地址单元开始存放。,b)使用0RG命令专门规定。例:ORG 8100H TAB:DB 0COH,0F9H,0A4H,0B0H;定义的7段数码管(共阳极)显示的十六进制基数(0F)的十六进制数的字形代码从8101H地址单元开始存放。,5.定义数据字命令DW(Define Word)本命令用于从指定地址开始,在程序存储器单元中定义16位的数据字。命令格式:标号:DW16位数表 存放时,数据字的高8位在前(低地址),低8位在后(高地址)。,例如,DW“AA”;存入41H,41HDW“A”;存入00H,41HDW“ABC”;不合法,因超过两字节DW 100H,1ACH,-804;按顺序存入01H、00H、01H、0ACH、0FCH、0DCH,DB和DW定义的数表,数的个数不得超过80个。如数据的数目较多时,可使用多个定义命令。在MCS-51程序设计应用中,常以DB来定义数据,以DW来定义地址。,6.定义存储区命令DS(Define Stonage),该命令用于从指定地址开始,在程序存储器中保留指定数目的单元作为预留存储区,供程序运行使用。源程序汇编时,对预留单元不赋值。命令格式为:标号:DS16位数表例如:ADDRTABL:DS 20;从标号ADDRTABL代表的地址开始,预留20个连续的地址单元ORG 8100HDS08H;从8100H地址开始,保留8个连续的地址单元,7.位定义命令BIT该命令用于给字符名称赋以位地址。命令格式为:字符名称 BIT位地址其中:位地址可以是绝对地址,也可以是符号地址(即位符号名称)。例:AQ BIT P1.0功能是把P1.0的位地址赋给变量AQ,在其后的编程中AQ就可以作为位地址使用,补充内容:子程序结构,子程序结构是一种非常重要的程序结构。在一个程序中经常遇到反复多次使用某程序段的情况,如果重复书写这个程序段,会使程序变得冗长而杂乱。对此,可采用子程序结构,即把重复的程序段编写为一个子程序,通过主程序调用而使用它。这样不但减少了编程工作量,而且也缩短了程序的长度。调用和返回构成了子程序调用的完整过程。为了实现这一过程,必须有子程序调用指令和返回指令。调用指令在主程序中使用,而返回指令则应该是子程序的最后一条指令。执行完这条指令后,程序返回主程序断点处继续执行。,(1)子程序的编程原则 在实际的单片机应用系统软件设计中,为了程序结构更加清晰,易于设计,易于修改,增强程序可读性,基本上都要使用子程序结构。子程序作为一个具有独立功能的程序段,编程时需遵循以下原则:a)子程序的第一条指令必须有标号,明确子程序入口地址;b)以返回指令RET结束子程序;c)子程序说明部分;子程序名称:提供给主程序调用的名字,通常用符号或子程序第一条语句的标号来表示。子程序功能:简要说明子程序能完成的主要功能。子程序入口参数:主程序需要向子程序提供的参数。,子程序出口参数:子程序执行完之后向主程序返回的参数。子程序占用资源:子程序中使用了哪些存储单元、寄存器等 子程序堆栈深度:子程序占用堆栈区的最大字节数。子程序嵌套情况:子程序中继续调用子程序的情况。子程序的字节数:子程序中所有指令字节数的总和。子程序执行时间:子程序中所有指令的机器周期数总和。这些说明是写给程序员看的,供以后使用子程序时参考。d)较强的通用性和可浮动性,尽可能避免使用具体的内存单元和绝对转移地址等。,e)注意保护现场和恢复现场。子程序在编制过程中经常会用到一些通用单元,如工作寄存器、累加器、数据指针DPTR以及PSW等。而这些工作单元在调用它的主程序中也会用到,为此,需要将子程序用到的这些通用编程资源加以保护,称为保护现场。在子程序执行完后需恢复这些单元的内容,称为恢复现场。通常保护和恢复现场是在子程序中利用堆栈操作实现的,在子程序的开始部分把子程序中要用到的编程资源都保护起来,在执行返回指令之前恢复现场,这是一种比较规范的方法。另外,保护现场和恢复现场也可以在主程序中实现。在调用子程序前保护现场,子程序返回后恢复现场,这种方式比较灵活,可以根据当时的需要确定要保护的内容。,(2)参数传递的方法 主程序调用子程序时,主程序和子程序之间存在着参数互相传递的问题。参数传递一般有以下几种方法:1)寄存器传递参数 通过寄存器A传递入口参数和出口参数。,例:假设a、b均小于10,计算c=a2+b2,其中a事先存在内部RAM的31H单元,b事先存在32H单元,请把c存入33H单元。SQR:y=x2子程序 ORG 0000H;主程序 MAIN:MOV SP,#3FH;设置栈底 MOV A,31H;取数a存放到A中作为入口参数 LCALL SQR;MOV R1,A;出口参数:a的平方值存放在A中 MOV A,32H;取数b存放到A中作为入口参数 LCALL SQR;ADD A,R1;MOV 33H,A;SJMP$;,子程序名称:SQR 功能:通过查表求出平方值y=x2 入口参数:x存放在累加器A中 出口参数:求得的平方值y存放在A中 占用资源:累加器A,数据指针DPTR,SQR:PUSH DPH;保护现场,将主程序中DPTR的高8位入栈 PUSH DPL;保护现场,将主程序中DPTR的低8位入栈 MOV DPTR,#TABLE;DPTR表首地址 MOVC A,A+DPTR;查表 POP DPL;恢复现场,将主程序中DPTR 的低8位从堆栈中弹出 POP DPH;恢复现场,将主程序中DPTR 的高8位从堆栈中弹出 RETTABLE:DB 0,1,4,9,16,25,36,49,64,81 END,2)利用堆栈传递参数*ORG 0000H;主程序 MAIN:MOV SP,#3FH;设置栈底 PUSH 31H;将数a存放到堆栈中,作为入口参数 LCALL SQR;POP ACC;MOV R1,A;出口参数:a的平方值存放在A中 PUSH 32H;LCALL SQR;POP ACC;ADD A,R1;MOV 33H,A;SJMP$;,子程序名称:SQR 功能:通过查表求出平方值y=x2 入口参数:x存放在堆栈中 出口参数:求得的平方值y存放在堆栈中 占用资源:累加器A,数据指针DPTR,SQR:MOV R0,SP;R0作为参数指针 DEC R0;堆栈指针退回子程序调用前的地址 DEC R0;XCH A,R0;保护ACC,取出参数 MOV DPTR,#TABLE;DPTR表首地址 MOVC A,A+DPTR;查表 XCH A,R0;查表结果放回堆栈中 RETTABLE:DB 0,1,4,9,16,25,36,49,64,81,(3)子程序调用中应注意的问题 由于子程序调用过程中,CPU自动使用了堆栈,因此,容易出现以下几种错误:a)忘记给堆栈指针SP赋栈底初值,堆栈初始化位置与第1组工作寄存器重合,如果以不同的方式使用了同一个内存区域,会导致程序乱套。b)程序中的PUSH和POP没有配对使用,使RET指令执行时不能弹出正确的断点地址,造成返回错误。c)堆栈设置太小,堆栈操作增长太大,使栈区与其它内存单元重合。,思考题:统计正数、负数、零的个数。(一)2.5.(二)1.2.,

    注意事项

    本文(【大学课件】80C51单片机汇编语言程序设计PPT.ppt)为本站会员(sccc)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开