您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 述职报告 > 单片机及应用_第四章_80C51单片机汇编语言程序设计..
第4章80C51单片机汇编语言程序设计主要内容:4.1单片机程序设计语言概述4.2汇编语言程序的基本结构形式4.380C51单片机汇编语言程序设计举例4.4单片机汇编语言源程序的编辑和汇编4.580C51单片机汇编语言伪指令4.1单片机程序设计语言概述4.1.1机器语言和汇编语言1、机器语言:直接用二进制代码指令表达的计算机语言。计算机可以直接识别,不需要进行任何翻译。每台机器的指令,其格式和代码所代表的含义都是硬性规定的。机器语言是其它各种程序设计语言的基础,但难记、难用、已出错。4.1.1机器语言和汇编语言2、汇编语言:用助记符和专门的语言规则表示指令的功能和特征的面向机器的程序设计语言。汇编语言是对机器语言的改进,比机器语言高级。汇编语言的最大优点是助记符与机器指令一一对应。用汇编语言编写的程序占用存储空间小,运行速度快,程序效率高。此外,汇编语言能直接管理和控制硬件资源。缺点:比高级语言难记忆和使用,程序设计的技巧性较高,编程难度较大。要求使用者必须精通单片机的硬件系统和指令系统。缺乏通用性,程序不易移植。4.1.2单片机使用的高级语言对于8051单片机,现有4种语言支持,即汇编、PL/M、C和BASIC。C语言应用广泛1.移植性好;2.开发效率高。3.keilc51高级语言的不足:1.生成的目标代码较长;2.程序运行速度较慢。4.1.380C51单片机汇编语言的语句格式80C51汇编语言的语句格式如下:[标号:]操作码[操作数];[注释]1.标号是语句地址的标志符号,标号的几点规定:1~8个ASCII字符组成,第一个字符必须是字母。不能使用本汇编语言已经定义的符号作为标号。标号后面必须跟以冒号“:”。同一标号在一个程序中只能定义一次。标号可有可无。4.1.380C51单片机汇编语言的语句格式2.操作码用于规定语句执行的操作内容,用指令助记符表示。不能空缺。3.操作数操作数用于为指令操作提供数据。可能有0~3个操作数,各操作数之间以逗号分隔。4.注释不属于语句的功能部分,只是对语句的解释说明,以“;”开头。4.1.380C51单片机汇编语言的语句格式5.分界符(分隔符)用于把语句中的各部分隔开,以便于区分。分界符包括空格、冒号、分号或逗号等符号。4.2汇编语言程序的基本结构形式四种基本结构形式:顺序程序结构、分支程序结构、循环程序结构、子程序。4.2.1顺序程序结构顺序结构程序是最简单的程序结构。程序既无分支、循环,也不调用子程序,程序执行时一条接一条地按顺序执行指令。例13字节无符号数的加法运算。其中被加数在内部RAM的50H、51H和52H单元中;加数在内部RAM的53H、54H和55H单元中;要求把相加之和存放在50H、51H和52H单元中,进位存放在位寻址区的20H位中。4.2.1顺序程序结构我们一起来编写程序。MOVR0,#52H;被加数的低字节地址MOVR1,#55H;加数的低字节地址MOVA,@R0ADDA,@R1;低字节相加MOV@R0,A;存低字节相加结果DECR0DECR1MOVA,@R0ADDCA,@R1;中间字节带进位相加MOV@R0,A;存中间字节相加结果DECR0DECR1MOVA,@R0ADDCA,@R1;高字节带进位相加MOV@R0,A;存高字节相加结果MOV20H,C;存放进位的单元地址4.2.1顺序程序结构分支结构也称为选择结构。要分支,就要用条件或变址寻址转移指令,就要有地址标号。分支结构又可分为单分支结构和多分支结构。4.2.2分支程序结构1.单分支程序结构单分支程序结构即二中选一,通过条件判断实现,条件成立一支,条件不成立一支。例2假定在外部RAM中有ST1、ST2和ST3三个连续单元,其中ST1和ST2单元中存放着两个无符号二进制数,试找出其中的大数并存入ST3单元中。1.单分支程序结构4.2.2分支程序结构MOVDPTR,#ST1;设置数据指针MOVXA,@DPTR;取第1个数MOVR2,A;第1个数存于R2INCDPTR;数据指针加1MOVXA,@DPTR;取第2个数CLRC;进位位清0CJNEA,R2,NEXT;两数比较JNCBIGER;若第2个数不小,则转向BIGERXCHA,R2;若第1个数大,则整字节交换BIGER:INCDPTRMOVX@DPTR,A;存大数1.单分支程序结构例3假定采集的温度值Ta放在累加器A中。此外,在内部RAM54H单元存放温度下限值T54,在55H单元存放温度上限值T55。若Ta>T55,程序转向JW(降温处理程序);若Ta<T54,则程序转向SW(升温处理程序);若T55≥Ta≥T54,则程序转向FH(返回主程序)。4.2.2分支程序结构1.单分支程序结构TC:CJNEA,55H,LOOP1;若Ta≠T55,则转向LOOP1AJMPFH;若Ta=T55,则返回LOOP1:JNCJW;若(CY)=0,表明Ta>T55,转降温处理程序CJNEA,54H,LOOP2;若Ta≠T54,则转向LOOP2AJMPFH;若Ta=T54,则返回LOOP2:JCSW;若(CY)=1,表明Ta<T54,转升温处理程序FH:RET;若T55≥Ta≥T54,则返回主程序4.2.2分支程序结构该例为多重单分支结构,通过一系列条件判断,进行逐级分支。多重单分支结构多使用数值比较转移指令CJNE实现。2.多分支程序结构4.2.2分支程序结构2.多分支程序结构与多重单分支结构的不同:多重单分支结构在不同的区域做不同的事情;多分支结构在不同的点上做不同的事情。多分支结构多用变址寻址转移指令“JMP@A+DPTR”实现,且需要有数据表格配合;多重单分支结构多使用数据比较转移指令CJNE实现。4.2.2分支程序结构(1)通过地址偏移表实现程序多分支设分支序号存放在片内RAMADDRi单元中,示例程序如下:MOVA,ADDRi;分支序号i送AMOVDPTR,#BRTAB;地址表首址送DPTRMOVCA,@A+DPTR;取偏移量JMP@A+DPTR;转相应分支BRTAB:DBBR0-BRTAB;地址偏移表DBBR1-BRTABDBBRn-BRTABBR0:…;分支程序BR1:…BRn:…4.2.2分支程序结构2.多分支程序结构(2)通过转移指令表实现程序多分支MOVA,ADDRiRLA;分支序号值乘以2MOVDPTR,#BRTAB;转移指令表首址JMP@A+DPTRBRTAB:AJMPBR0;转分支程序0AJMPBR1;转分支程序1……AJMPBR127;转分支程序1274.2.2分支程序结构2.多分支程序结构(3)其他实现程序多分支的方法例4用RET指令实现多分支程序MOVDPTR,#BRTAB;分支入口地址表首址MOVA,ADDRiRLA;分支转移值乘以2MOVR1,A;暂存到R1INCAMOVCA,@A+DPTR;取低位地址PUSHACC;低位地址入栈MOVA,R1;恢复A值MOVCA,@A+DPTR;取高位地址PUSHACC;高位地址入栈RET;分支入口地址装入PCBRTAB:DWBR0;分支程序入口地址表DWBR1……DWBR1274.2.2分支程序结构2.多分支程序结构4.2.3循环程序结构循环就是重复执行某个程序段。汇编语言通常使用减1条件转移指令来实现和控制循环。4.2汇编语言程序的基本结构形式前章例18将内部RAM从DATA单元开始的10个无符号数相加,相加结果送SUM单元保存。MOVR0,#0AH;设置循环次数MOVR1,#DATA;R1作地址指针,指向数据块首地址CLRA;A清零LOOP:ADDA,@R1;加一个数INCR1;修改指针,指向下一个数DJNZR0,LOOP;R0减1,不为0循环MOVSUM,A;存10个数相加的和4.2.3循环程序结构循环程序由初始化和循环体两部分组成。初始化:指针、计数器和累加器等循环体是循环程序的主体,是反复执行的动作。例5通过查找结束标志(回车符)来统计字符串长度的循环程序。分析:假定字符串存放在内部RAM从40H单元开始的连续存储单元中。为找到结束标志,应采用逐个字符依次与回车符(ASCII码0DH)比较的方法。同时在程序中还应设置一个字符串指针以顺序定位字符,设置一个字符长度计数器以累计字符个数。MOVR2,#0FFH;设置长度计数器初值MOVR0,#3FH;设置字符串指针初值LOOP:INCR2INCR0CJNE@R0,#0DH,LOOP4.2.3循环程序结构例6多字节无符号数相加。4.2.3循环程序结构开始ADR1-R0ADR2-R1L-R20-CY((R0))+((R1))-A(A)-(R0)(R0)+1-R0(R1)+1-R1(R2)-1-R2(R2)=0?结束YN分析:设被加数与加数分别在以ADR1与ADR2为初址的片内数据存储器区域中,自低字节起,由低到高依次存放;它们的字节数为L,要求加得的和放回被加数的单元。流程框图如右。MOVR0,#ADR1MOVR1,#ADR2MOVR2,#LCLRCLOOP:MOVA,@R0;通过R0间址,取得被加数的一个字节ADDCA,@R1;通过R1间址,取得加数的一个字;节,与被加数的相应字节相加MOV@R0,A;加得的和通过R0间址放回原被加数单元INCR0;修改指针,指向下一个相加的数INCR1DJNZR2,LOOP;循环实现多字节数相加4.2.3循环程序结构4.2.4子程序结构4.2汇编语言程序的基本结构形式前章例3“用查表法把累加器中的十六进指数转换为ASCII码的程序”也是按子程序设计的。HBA:INCAMOVCA,@A+PCRET;十六进制数ASCII码表DB30H,31H,…,39H,41H,42H,…,46H4.2.4子程序结构子程序的组成:1.程序名:就是标号,位于第一条可执行指令前。主程序以该名调用它。2.程序体:规定要做的事情。3.返回语句RET。4.参数:在结构上看不出来,也可以没有。通过参数传送信息。参数可通过寄存器、存储单元或堆栈传送。4.380C51单片机汇编语言程序设计举例4.3.1算术运算程序1.加减法运算(1)多个不带符号的单字节数相加例7假设有多个单字节数,依次存放在外部RAM21H开始的连续单元中,要求把计算结果存放在R1和R2中(假定相加的和不超过2字节数)。其中R1为高位字节。MOVDPTR,#21H;设置数据指针MOVR3,#N;字节个数MOVR1,#00H;和的高位字节清0MOVR2,#00H;和的低位字节清0LOOP:MOVXA,@DPTR;取一个加数ADDA,R2;单字节数相加MOVR2,A;和的低8位送R2JNCLOOP1INCR1;有进位,则和的高8位加1LOOP1:INCR0;指向下一个单元DJNZR3,LOOP4.3.1算术运算程序1.加减法运算(2)两个不带符号的多字节数相减例8设有两个N字节数分别存放在内部RAM单元中,低字节在前,高字节在后,分别由R0指定被减数单元地址,由R1指定减数单元地址,其差存放在原被减数单元中。4.3.1算术运算程序1.加减法运算MSUB:CLRC;清进位位MOVR2,#N;设定字节数LOOP:MOVA,@R0;从低字节开始逐个取被减数字节SUBBA,@R1;两数相减MOV@R0,A;存字节相减的差INCR0INCR1DJNZR2,LOOP;减法是否完成RET2.乘法运算4.3.1算术运算程序例9假定要进行两个双字节无符号数的乘法运算,被乘数和乘数分别存放于寄存器R2、R3和R6、R7中(其中R2和R6分别为高位字节),相乘的结果(积)依次存放在R4、R5、R6、R7单元中。试编写程序实现该乘法运算。分析:因为乘数和被乘数各为2字节,因此,必须进行4次乘法运算,得到4次部分乘积。部分积的高字节用H标识,部分积低字节用L标识。此外,还要处理部分积相加产生的进位。其竖式运算如下页示意图。两个双字节无符号数乘法示意图DBMUL:MOVA,R3MOVB,R7MULAB;R3×R7(得第1次部分积)XCH
本文标题:单片机及应用_第四章_80C51单片机汇编语言程序设计..
链接地址:https://www.777doc.com/doc-3563071 .html