资源预览内容
第1页 / 共60页
第2页 / 共60页
第3页 / 共60页
第4页 / 共60页
第5页 / 共60页
第6页 / 共60页
第7页 / 共60页
第8页 / 共60页
第9页 / 共60页
第10页 / 共60页
亲,该文档总共60页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
- 1 -单片机原理及应用单片机原理及应用 课程讲义课程讲义第三章:单片机汇编语言与第三章:单片机汇编语言与程序设计基础程序设计基础wcytjx126.com - 2 -主要内容主要内容v3.1程序设计语言程序设计语言v3.2汇编语言的语句结构汇编语言的语句结构v3.3伪指令伪指令v3.4汇编语方程序设计步骤汇编语方程序设计步骤v3.5顺序程序顺序程序v3.6分支程序分支程序v3.7循环程序循环程序v3.8数制转换程序数制转换程序v3.9位操作程序位操作程序v3.10子程序子程序 - 3 -3.1程序设计语言程序设计语言v按照语言的结构及其功能可以分为三种:按照语言的结构及其功能可以分为三种:v1机机器器语语言言:机机器器语语言言是是用用二二进进制制代代码码0和和1表示指令和数据的最原始的程序设计语言。表示指令和数据的最原始的程序设计语言。v2汇汇编编语语言言:在在汇汇编编语语言言中中,指指令令用用助助记记符符表表示示,地地址址、操操作作数数可可用用标标号号、符符号号地地址址及及字字符等形式来描述。符等形式来描述。v3高高级级语语言言:高高级级语语言言是是接接近近于于人人的的自自然然语语言,面向过程而独立于机器的通用语言。言,面向过程而独立于机器的通用语言。 - 4 -3.2汇编语言的语句结构汇编语言的语句结构v1汇编语言的指令类型汇编语言的指令类型vMCS-51单单片片机机汇汇编编语语言言,包包含含两两类类不不同同性性质质的指令。的指令。v(1)基基本本指指令令:即即指指令令系系统统中中的的指指令令。它它们们都都是是机机器器能能够够执执行行的的指指令令,每每一一条条指指令令都都有有对对应的机器码。应的机器码。v(2)伪伪指指令令:汇汇编编时时用用于于控控制制汇汇编编的的指指令令。它们都是机器不执行的指令,无机器码。它们都是机器不执行的指令,无机器码。v进进一一步步区区别别:指指令令的的控控制制对对象象是是单单片片机机,伪伪指指令的控制对象是汇编程序。令的控制对象是汇编程序。 - 5 -v2汇编语言的语句格式汇编语言的语句格式v汇汇编编语语言言源源程程序序是是由由汇汇编编语语句句(即即指指令令)组组成成的。汇编语言一般由四部分组成。的。汇编语言一般由四部分组成。v其典型的汇编语句格式如下:其典型的汇编语句格式如下:v标号:标号:操作码操作码操作数操作数;注释;注释vSTART:MOVA,30H;A(30H) - 6 -3.3伪指令伪指令v1ORG:汇编起始地址汇编起始地址v用用来来说说明明以以下下程程序序段段或或数数据据块块在在程程序序存存储储器器中中存放的起始地址。存放的起始地址。v格式:格式:标号:标号:ORG16位地址位地址v例如程序:例如程序:ORG 1000HvSTART:MOVA,#20HvMOVB,#30Hv v2EQU:赋值赋值格式:字符名称格式:字符名称EQU项项v给变量标号赋予一个确定的数值。给变量标号赋予一个确定的数值。v例:例:STARTEQU1000H - 7 -v3DB:定义数据字节定义数据字节v格式:格式:标号:标号:DB8位二进制数表位二进制数表v例例1:ORG1000HDB21H,25H,36H,-5注:负数是以一字节补码数的形式存放;注:负数是以一字节补码数的形式存放;存储位置是在程序存储器。存储位置是在程序存储器。v例例2:ORG2000HTAB:DB22H,78,01011100B,“5”,“AB”注:单位为字节,分隔用注:单位为字节,分隔用“,”,形式可为:形式可为:二进制、十进制、十六进制及二进制、十进制、十六进制及ASCII码。如码。如“5”ASCII码为码为35H。 - 8 -v例例3:ORG1000HTAB;DB23H,73,“6”,“B”TABl:DB110B以以上上伪伪指指令令经经汇汇编编以以后后,将将对对从从1000H开开始始的的若若干干内存单元赋值:内存单元赋值:(1000H)=23H(1001H)=49H(1002H)=36H(1003H)=42H(1004H)=06H其其中中36H和和42H分分别别是是字字符符6和和B的的ASCII码码,其其余余的的十十进进制制数数(73)和和二二进进制制数数(110B)也也都都换换算算为为十十六进制数了六进制数了 - 9 -4DW:定义数据字定义数据字格式:格式:标号:标号:DW16位二进制数表位二进制数表例如,例如,ORG1000HTAB:DW1234H,0ABH,10汇编后:汇编后:(1000H)=12H(1001H)=34H(1002H)=00H(1003H)=ABH(1004H)=00H(1005H)=0AHDB、DW伪指令都只对程序存储器起作用,不能伪指令都只对程序存储器起作用,不能用来对数据存储器的内容进行赋值或进行其它初始化用来对数据存储器的内容进行赋值或进行其它初始化的工作。的工作。 - 10 -v5DS:定义存储区定义存储区v从指定的地址单元开始,保留一定数量存储单从指定的地址单元开始,保留一定数量存储单元。元。v例:例:ORG0310HDS3即从即从0310H地址开始空地址开始空3个字节以便使用。个字节以便使用。v6BIT:位定义位定义v确定字符名为确定的位地址值。确定字符名为确定的位地址值。v例:例:BNAMBIT25H;BNAM为为25H位地址。位地址。 - 11 -v7END:汇编结束汇编结束格式:格式:标号:标号:END表达式表达式功能:结束汇编。功能:结束汇编。例如:例如:ORG2000HSTART:MOVA,#00HENDSTART表示标号表示标号START开始的程序段结束。开始的程序段结束。 - 12 -3.4汇编语方程序设计步骤汇编语方程序设计步骤v1分析问题分析问题v2确定算法确定算法v3设计程序流程图设计程序流程图v4分配内存单元分配内存单元v5编写汇编语言源程序编写汇编语言源程序v6程序优化程序优化v7调试程序调试程序 - 13 -3.5顺序程序顺序程序v顺序程序是一种最简单,最基本的程序。顺序程序是一种最简单,最基本的程序。v特点:程序按编写的顺序依次往下执行每一条特点:程序按编写的顺序依次往下执行每一条指令,直到最后一条。指令,直到最后一条。v【例【例3.5.1】将将30H单元内的两位单元内的两位BCD码拆开并码拆开并转换成转换成ASCII码,存入码,存入RAM两个单元中。程序两个单元中。程序流程如图流程如图3-5-1所示。参考程序如下:所示。参考程序如下:vORG 2000HvMOV A,30H;取值取值vANLA,#0FH;取低取低4位位 - 14 -vADDA,#30H;转换成转换成ASCII码码vMOV32H,A;保存结果保存结果vMOVA,30H;取值取值vSWAPA;高高4位与低位与低4位互换位互换vANLA,#0FH;取低取低4位(原来的高位(原来的高4位)位)vADDA,#30H;转换成转换成ASCII码码vMOV31H,A;保存结果保存结果vSJMP$vEND结束取数据低4位转换成ASCII码存ASCII码取数据高4位转换成ASCII码存ASCII码开始图3-5-1拆字程序流程图 - 16 -v【例例3.5.2】设设X、Y两两个个小小于于10的的整整数数分分别别存存于于片片内内30H、31H单单元元,试试求求两两数数的的平平方方和和并并将结果存于将结果存于32H单元。单元。v解解:两两数数均均小小于于10,故故两两数数的的平平方方和和小小于于200,可可利利用用乘乘法法指指令令求求平平方方。程程序序流流程程如如图图4-2所所示。参考程序如下:示。参考程序如下:vORG 2000HvMOV A,30H;取取30H单元数据单元数据vMOV B,A;将将X送入送入B寄存器寄存器 - 17 -vMULAB;求求X2,结果在累加器中结果在累加器中vMOVR1,A;将将结结果果暂暂存存于于R1寄寄存存器中器中vMOVA,31H;取取31H单元数据单元数据vMOVB,A;将将Y送入送入B寄存器寄存器vMULAB;求求Y2,结果在累加器中结果在累加器中vADDA,R1;求求X2+Y2vMOV32H,A;保存数据保存数据vSJMP$;暂停暂停vEND结束取数据X求X2暂存X2取数据Y求Y2求X2+Y2开始保存平方和图3-5-2例3.2程序流程图 - 19 -例例3.5.3(P57例例2)v编制一段程序,要求在端口线编制一段程序,要求在端口线P1.0和和P1.1上分别产生周上分别产生周期为期为200us和和400us的方波,设单片机外接晶体频率为的方波,设单片机外接晶体频率为12MHz。v分析:方法分析:方法定时中断定时中断设置设置T0为工作方式为工作方式3,即,即TL0定时为定时为200us,TH0定时为定时为400us,到时取反。到时取反。初值初值(64H)求补求补=9CH(按按8位求补)位求补)(C8H)求补求补=38Hv程序:程序:ORG0000HAJMPSTARTORG000BHAJMPIT0ORG001BHAJMPIT1 - 20 -例例3.5.3(续)(续)ORG0100HSTART:MOVSP,#40;MOVTMOD,#03HMOVTL0,#9CHMOVTH0,#38HMOVTCON,#50HMOVIE,#8AHSJMP$ORG0130HIT0:MOVTL0,#9CHCPLP1.0RETI - 21 -例例3.5.3(续)(续)IT1:MOVTH0,#38HCPLP1.1RETIEND - 22 -3.6分支程序分支程序v1分支程序的基本形式分支程序的基本形式v分支程序有三种基本形式,如图分支程序有三种基本形式,如图3-6-1所示。所示。v分支程序的设计要点如下:分支程序的设计要点如下:v(1)先建立可供条件转移指令测试的条件。)先建立可供条件转移指令测试的条件。v(2)选用合适的条件转移指令。)选用合适的条件转移指令。v(3)在转移的目的地址处设定标号。)在转移的目的地址处设定标号。条件满足?AYN(a)条件满足?ABNY(b)(c)A0A1AnK=0K=1K=nK=?图3-6-1分支程序结构流程图 - 24 -v2双向分支程序设计举例双向分支程序设计举例v【例【例3.6.1】设设X存在存在30H单元中,根据下式单元中,根据下式vX+2X0vY= 100 X=0求出求出Y值,将值,将Y值存入值存入31H单元。单元。v X XT55,程程序序转转向向JW(降降温温处处理理程程序序);若若TaT55,转降温处理程序CJNEA,54H,LOOP2;TaT54,转向LOOP2AJMPFH;Ta=54,返回LOOP2:JCSW;若(CY)=1,表明TaT54,转升温处理程序FH:RET;T55TaT54,返回主程序 - 29 -例例3.6.3 (3.6.3 (p59 p59 例例2 2)v单片机单步运行程序电路如图,程序如下,画单片机单步运行程序电路如图,程序如下,画出其程序流程图,并说明为什么每按下再松开出其程序流程图,并说明为什么每按下再松开一次键后,单片机执行一条指令。一次键后,单片机执行一条指令。v程序:程序:ORG0000HSJMPSTARTORG0003HJNBP3.2,$JBP3.2,$RETISTART:MOVIE,#81HMOVTCON,#00HLOOP:INCAMOVP1,ASJMPLOOPEND - 30 -例例3.6.3 (3.6.3 (续:)续:)v分析:分析:q不按键,不按键,P3.2为低电平,进入中断,并停在为低电平,进入中断,并停在JNBP3.2,$上;上;q按下键,按下键,P3.2为高电平,跳出循环,并停在为高电平,跳出循环,并停在JBP3.2,$上;上;q松开键,松开键,P3.2为低电平,跳出循环,并从中断返回;为低电平,跳出循环,并从中断返回;根据从中断返回且又立即进入中断的条件,中断必须是在根据从中断返回且又立即进入中断的条件,中断必须是在执行完中断点处的一条指令后才能完成,故可实现单步。执行完中断点处的一条指令后才能完成,故可实现单步。 - 31 -v3多向分支程序设计举例多向分支程序设计举例v【例【例3.6.3】根据根据R0的值转向的值转向7个分支程序。个分支程序。vR010,转向转向SUB0;vR020,转向转向SUB1;vvR0=60,转向转向SUB6;v解解:利利用用JMPA+DPTR指指令令直直接接给给PC赋赋值值,使程序实现转移。程序流程如图使程序实现转移。程序流程如图3-6-3所示。所示。 - 32 -v参考程序如下:参考程序如下:vORG2000HvMOVDPTR,#TAB;转移指令表首地址转移指令表首地址vMOVA,R0;取数取数vMOV B,#10vvDIVAB;A10,商在商在A中中vCLR CvRLCA;A2AvJMPA+DPTR;PCA+DPTRvTAB:AJMPSUB0 ;转移指令表转移指令表vAJMPSUB1vAJMP SUB2vvAJMPSUB5vAJMP SUB6K=?转SUB0转SUB1转SUB6K=0K=1K=6开始图3-6-3多向分支程序流程图 - 34 -3.7循环程序循环程序v1循环程序的结构(循环程序的结构(如图如图3-7-1所示)所示)v循环程序一般包括如下四个部分:循环程序一般包括如下四个部分:v(1)初始化)初始化(2)循环体)循环体v(3)循环控制)循环控制(4)结束)结束v循循环环程程序序按按结结构构形形式式,有有单单重重循循环环与与多多重重循循环。环。v在在多多重重循循环环中中,只只允允许许外外重重循循环环嵌嵌套套内内重重循循环。环。v不不允允许许循循环环相相互互交交叉叉,也也不不允允许许从从循循环环程程序序的外部跳入循环程序的内部(如图的外部跳入循环程序的内部(如图3-7-2所示)。所示)。(a)当型循环结构(b)直到型循环结构循环结束?循环体YN初始化修改循环参数结束部分开始结束循环结束?循环体Y初始化修改循环参数结束部分开始N结束图3-7-1循环结构程序流程图外循环中循环内循环外循环内循环外循环内循环内循环(a)嵌套正确(b)嵌套正确(c)交叉不正确图3-7-2多重循环示意图 - 37 -v2循环程序设计举例循环程序设计举例v【例例3.7.1】有有一一数数据据块块从从片片内内RAM的的30H单单元元开开始始存存入入,设设数数据据块块长长度度为为10个个单单元元。根根据据下下式:式:vX+2X0vY=100X=0求出求出Y值,并将值,并将Y值放回原处。值放回原处。v X X0Y=100X=0求出求出Y值,并将值,并将Y值放回原处。值放回原处。 X X0 - 56 -vSTART: MOV A,R1;取数取数vACALLDISPOSE;调用判断、处理子程序调用判断、处理子程序vSAVE:MOV R1,A;保存数据保存数据vINCR1;修改地址指针,指向下一个地址修改地址指针,指向下一个地址vDJNZ R0,START ;数据未处理完,继续处理数据未处理完,继续处理vSJMP ;暂停暂停vORG0200HvDISPOSE:JBACC.7,NEG;若若为为负负数数,转转NEG - 57 -vJZZER0 ;若为零,转若为零,转ZER0vADDA,#02H;若为正数,求若为正数,求X+2vAJMP BACK;转到转到SAVE,保存数据保存数据vZER0:MOV A,#64H;数据为零,数据为零,Y=100vAJMP BACK;转到转到SAVE,保存数据保存数据vNEG:DECAvCPLA;求求 X vBACK:RET - 58 -【例例3.10.2】将将内内部部数数据据存存储储器器某某一一单单元元中中的的一一个个字字节节的的十十六六进进制制数数转转换换成成两两位位ASCII码码,结结果果存存放放在在内内部部数数据据存存储器的两个连续单元中。储器的两个连续单元中。 假设一个字节的十六进制数在内部数据存储器假设一个字节的十六进制数在内部数据存储器40H单元,单元,结果存于结果存于41H、42H单元中,用堆栈进行参数传递。单元中,用堆栈进行参数传递。MAIN:MOVSP,#55HMOVR1,#41H;R1为存结果指针MOVA,40H;取要转换的数据SWAPA;先转换高位字节PUSHACC;压栈LCALLHEASC;调用低半字节转换成ASCII码程序 - 59 -POPACC;要转换的数据出栈要转换的数据出栈MOVR1,A;存高半字节转换结果;存高半字节转换结果INCR1PUSH40HLCALLHEASCPOPACCMOVR1,A;存低半字节转换结果;存低半字节转换结果ENDHEASC:MOVR0,SPDECR0DECR0XCHA,R0;取被转换数据;取被转换数据ANDA,#0FH;保留低半字节;保留低半字节ADDA,#2;修改;修改AMOVCA,A+PC;查表;查表XCHA,R0;结果送回堆栈;结果送回堆栈RETTAB:DB30H,31H,32H, - 60 -Thank You!交流提问
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号