《80C51单片机汇编语言程序设计(新).ppt》由会员分享,可在线阅读,更多相关《80C51单片机汇编语言程序设计(新).ppt(44页珍藏版)》请在三一办公上搜索。
1、单片机原理与应用Principle&Application of MCU,第4章 80C51单片机汇编语言程序设计,1,教学内容及要求,教学内容汇编语言程序的基本结构形式、子程序结构形式80C51单片机汇编语言伪指令80C51单片机汇编语言程序设计举例教学要求掌握顺序结构程序、分支程序、循环程序和子程序等结构程序的设计等熟悉单片机汇编程序常用的伪指令了解汇编语言程序的格式,2,汇编语言源程序的编辑和汇编,3,机器编辑交叉汇编串行传送,4,*.ASM,编辑、汇编,编辑:编写程序的过程称为编辑。机器编辑指借助于微型机进行单片机的程序设计,通常都是使用编辑软件进行源程序的编辑。编辑完成后,生成一个由
2、汇编指令和伪指令构成的扩展名为”.ASM”的ASCII码文件。汇编:汇编语言源程序不能在单片机中直接执行,必须将其“翻译”为用二进制代码(机器语言)表示的目标程序才能执行。这个“翻译”过程称为汇编。机器汇编指由计算机通过汇编程序完成从汇编语言源程序到机器语言目标程序的“翻译”工作。交叉汇编指使用一种计算机(PC)的汇编程序为另一种计算机(单片机)的源程序进行汇编即运行汇编程序进行汇编的是一种计算机,而汇编得到的目标程序是另一种计算机用的。,5,80C51单片机汇编语言伪指令,汇编时,源程序须向汇编程序发出一些指示信息,协助完成汇编工作,这一工作是由伪指令来完成的。汇编起始地址命令ORG(Ori
3、gin)定义字节命令DB(Define Byte)定义数据字命令DW(Define Word)预留存储区命令DS(Define Storage)位定义命令BIT赋值命令EQU(Equate)数据地址赋值伪指令DATA汇编终止命令END(End of assembly)注意!伪指令仅供汇编程序将源程序翻译成目标程序,本身并不形成机器码。,6,汇编起始地址命令ORG(Origin),规定程序或数据的起始存放地址。出现在每段源程序或数据块的开始项是16位绝对地址,或者标号,或者表达式。在一个汇编语言源程序中允许使用多条定位伪指令,但其值应从小到大,并与前面的存放地址不重叠。如果程序的开始不放ORG,
4、则汇编程序将从0000H单元开始放目标程序代码。,ORG,7,ORG 0000H;从0000H单元开始存放下面的指令LJMP 0030HORG 0030H;从0030H单元开始存放下面的指令MAIN:MOV SP,#50HORG 0040H;从0040H单元开始存放下面的数据TAB:DB 23,89,定义字节命令DB(Define Byte),在程序存储器中定义字节数据。Xn可以是一字节常数;用双引号或者单引号括起来的字符或字符串;各个数之间用逗号隔开。,DB,8,ORG 1000HA1:DB 01001010B,23o,23,78H,A2:DB 5,”12AB”,12D,-2,(1000H)
5、=01001010B=4AH,(1001H)=23o=13H,(1002H)=23=17H,(1003H)=78H,(1004H)=35H(5的ASCII码),(1005H)=31H(1的ASCII码),(1006H)=32H(2的ASCII码),(1007H)=41H(A的ASCII码),(1008H)=42H(B的ASCII码),(1009H)=12D=0CH(100AH)=-2=0FEH,【例】,定义数据字命令DW(DefineWord),在程序存储器中定义16位的数据字。存放时,数据字的高8位在低地址,低8位在后高地址。通常,DB用来定义数据,DW用来定义地址。,DW,DW“AA”;存
6、入41H,41HDW“A”;存入00H,41HDW“ABC”;不合法,因为超过了两个字节DW 100H,1ACH,-804;按顺序存入01H、00H、01H、0ACH、0FCH、0DCH,9,【例】,预留存储区命令DS(Define Storage),在程序存储器中保留指定数目的单元作为预留存储区,供程序运行使用。,【例】ADDRTAB:DS 20;从标号ADDRTAB代表的地址开始,预留20个;连续的地址单元。,DS,DB、DW、DS只能对于程序存储器使用,10,位定义命令BIT,把位地址赋给字符名称。,【例】:AQ BIT P1.0;把P1.0的位地址赋给字符名AQ,在其后;的编程中AQ可
7、以作为位地址使用。,BIT,11,赋值命令 EQU(Equate),给数或符号赋给字符可以是常数、地址、标号或表达式。赋值以后的字符既可以作地址使用,也可以作立即数使用。,【例】CS EQU 0FFFFH,A1 EQU R1A2 EQU 10H DELAY EQU 0708H,A1可作为寄存器R1来使用,A2可作为8位直接地址或立即数使用,DELAY可作为16位地址或者立即数使用。,字符名 EQU 数或汇编符号,12,数据地址赋值伪指令DATA,将表达式的值赋给字符。表达式可以是一个数据或地址,也可以是一个包含所定义字符名在内的表达式,但不能是一个汇编符号(如R0R7)。与EQU的区别:EQU
8、必须先定义后使用。DATA无此限制,所以DATA伪指令可以放在源程序的开头或末尾,MOV R0,ADDRESSMOV R1,#ADDRESSADDRESS DATA 31H,将31H单元内容送R0,(R1)=31H。,字符名 DATA 表达式,13,汇编终止命令END(End of assembly),用于终止源程序的汇编工作,在一个源程序中只能有一条END命令,并且位于程序的最后。如果END命令出现在程序中间,则其后面的源程序将不予处理。,14,一般汇编调试工具要求的汇编格式,一般用汇编语言编写的程序,要求指出该程序存放于内存地址的位置,并且将用到的数据和需要预留存放数据的空间用伪指令定义好
9、然后编写程序代码最后用原地踏步或返回起始位置循环作为结束。,ORGSJMP$END,【例】程序格式如下:,15,汇编语言程序的基本结构形式,16,分支结构,使用条件转移指令对程序的执行结果进行判断JZ、JNZ、CJNE、DJNZJC、JNC、JB、JNB、JBC,17,【例】二分支。在外部RAM中有ST1、ST2和ST3共3个连续单元,其中ST1和ST2单元中存放着两个无符号二进制数,要求找出其中的大数并存入ST3单元中。,18,【例】三分支-多次二选一。设变量x存入30H单元,求得函数y存入31H单元。按下式要求给y赋值:,要根据x的大小来决定y值,在判断x5和y10时,采用CJNE和JC以
10、及CJNE和JNC指令进行判断。,19,ORG 1000HMOV A,30H;取xCJNE A,#5,NEXT1;与5比较NEXT1:JC NEXT3;x5,则转NEXT3CJNE A,#10,NEXT2;与10比较NEXT2:JNC NEXT4;x10,则转NEXT4MOV R0,#0;5x 10,y=0SJMP NEXT5NEXT3:MOV R0,ADEC R0;x5,y=x-1SJMP NEXT5NEXT4:MOV R0,AINC R0;x10,y=x+1NEXT5:MOV 31H,R0;存结果SJMP$END,20,多分支转移,使用变址寻址转移指令(散转指令)JMP A+DPTR;PC
11、(A)+(DPTR)数据表、转移指令表、堆栈操作,21,通过数据表实现程序多分支,22,MOV A,#k;分支序号k送AMOV DPTR,#BRTAB;表首址MOVC A,A+DPTR;查表后,(A)=BRk-BRTABJMP A+DPTR;散转指令,(PC)=BRkBRTAB:DB BR0-BRTAB;数据表,BRTAB+0DBBR1-BRTAB;分支入口地址与表首址之差,BRTAB+1DBBRn-BRTAB;BRTAB+nBR0:;各个分支程序BR1:BRn:,通过转移指令表实现程序多分支,23,MOV A,#k;分支序号k送ARL A;分支序号乘以2MOV DPTR,#BRTAB;表首址
12、JMP A+DPTR;(PC)=BATAB+2kBRTAB:AJMP BR0;转分支程序0,BRTABAJMP BR1;转分支程序1,BRTAB+2AJMP BRn;转分支程序n,BRTAB+2nBR0:;各个分支程序BR1:BRn:,使用长转移指令LJMP时,,MOV A,#kRL AADD A,R3MOV DPTR,#BRTABJMP A+DPTRBRTAB:LJMP BR0;BRTABLJMP BR1;BRTA+3 LJMP BRn;BRTAB+3n,24,通过堆栈操作实现程序多分支,25,MOV DPTR,#BRTAB;分支程序入口地址表首址MOV A,#k;分支序号放入A中RL A;
13、分支序号值乘以2MOV R1,A;暂存A值入R1INC A;A指向低位地址MOVC A,A+DPTR;取低位地址BRn 7-0PUSH ACC;低位地址入栈MOV A,R1;恢复A值MOVC A,A+DPTR;取高位地址BRn 15-8PUSH ACC;高位地址入栈RET;分支入口地址装入PCBRTAB:DW BR0;分支程序入口地址表,BRTAB、BRTAB+1DW BR1;BRTAB+2、BRTA+3DW BRn;BRTAB+2n、BRTAB+2n+1,RETPC158(SP),SP(SP)-1PC70(SP),SP(SP)-1,循环结构,初始化部分对于循环次数计数器、地址指针赋初值,对于
14、使用到的寄存器或者存储单元赋初值,为循环作准备。循环体部分为下一次循环创造条件:修改循环次数计数器、地址指针,避免死循环。循环的判断与控制:判断循环次数计数器,或者检查判断循环条件。可以直接由循环体内转到循环体外或外层循环;不能从循环体外直接跳转到循环体内,只能从外层向内层一层层进入。循环结束处理:结果保存等。,26,【例】单循环。编程实现把外部RAM中从8000H开始的100个字节数据传送到8100H开始的单元中。,MOV R7,#100MOV DPL,#00HLOOP:MOV DPH,#80HMOVX A,DPTRMOV DPH,#81HMOVX DPTR,AINC DPLDJNZ R7,
15、LOOP,MOV R0,#00LOOP:MOV P2,#80HMOVX A,R0MOV P2,#81HMOVX R0,AINC R0CJNE R0,#100,LOOP,或,27,【例】由循环内部跳出循环。把长度为10H的字符串从内部RAM缓冲区inbuf向位于外部RAM的输出缓冲区outbuf传送,一直进行遇到回车符CR或整个字符串传送完毕。,START:MOV R7,#10H MOV R0,#inbufMOV DPTR,#outbufLOOP:MOV A,R0CJNE A,#0D0H,CONTINUESJMP FINISHCONTINUE:MOVX DPTR,AINC R0INC DPTRD
16、JNZ R7,LOOPFINISH:SJMP$END,28,子程序,在主程序中调用子程序LCALL/ACALL 标号;调用子程序时,断点入栈保存由子程序返回主程序RET;子程序返回时,断点出栈从而回到主程序。子程序中,视情况进行现场保护和现场恢复1、使用堆栈:PUSH/POP2、暂存到其它存储单元中,最终恢复即可,29,调用延时子程序DELAY。,主程序:子程序:该子程序根本不需要主程序提供入口参数,从进入子程序开始,到子程序返回,这个过程花费CPU一定的时长。循环体只能执行有限次,避免“死循环”。,DELAY:PUSH 06HPUSH 07HMOV R7,#100DLY0:MOV R6,#9
17、8NOPDLY1:DJNZ R6,DLY1DJNZ R7,DLY0POP 07HPOP 06HRET,LCALL DELAY,30,80C51单片机汇编语言程序设计举例,定时程序查表程序求平方极值查找程序查找关键字扩展阶乘计算压缩和解压程序算术运算:加、减、乘、除数据排序数制与编码转换程序LED的简单控制KEY+LED的简单控制,31,单循环定时程序,DELAY:MOV R5,#TIME;1LOOP:NOP;1NOP;1DJNZ R5,LOOP;2RET;2,1+(1+1+2)*R5+2*机器周期12M 机器周期=1us定时时长为:,32,如何调整定时时长?,较长时间的定时程序,DELAY:M
18、OV R5,#TIME1;1LOOP2:MOV R4,#TIME2;1LOOP1:NOP;1NOP;1DJNZ R4,LOOP1;2DJNZ R5,LOOP2;2RET;2,1+1+(1+1+2)*R4+2*R5+2*机器周期,33,通过一个基本延时程序产生不同的定时,MOV R0,#05H;5msLOOP1:LCALL DELAY;1msDJNZ R0,LOOP1MOV R0,#OAH;10msLOOP2:LCAL DELAYDJNZ R0,LOOP2MOV R0,#14H;20msLOOP3:LCALL DELAYDJNZ R0,LOOP3,34,查表指令,按顺序读出存储器中的数据称为查表
19、。先确定好PC或DPTR的内容,然后有规律地改变A的内容,就可以进行程序存储器中表格数据的读出。MOVC A,A+DPTR 可在64KB范围内查表,长查表指令。MOVC A,A+PC 查距本指令256个字节以内的数据,短查表指令。PC=当前查表指令地址+1变址调整值,即该指令执行后的地址到表格首址之间的距离注意:如果数据表存放在外部ROM中,执行查表指令时,会在控制引脚PSEN上产生一个程序存储器读信号。,35,查表程序,功能:复杂计算、非线性计算、非数值计算的处理。查表:把事先计算或测得的数据按顺序编制成表格存放在程序存储器ROM中(伪指令DB或DW);查表程序根据被测数据,查出表格中对应的
20、结果。优点:编程简单、执行速度快、适合于实时控制。,36,【例】分别用两条查表指令编写一段子程序,功能为:根据累加器A中的数(09之间)查找平方表,求出相应的平方数,放在A中。,SQUARE:MOV DPTR,#TABMOVC A,A+DPTRRETTAB:DB 0,1,4,9,16,25,36,49,64,81,SQUARE:ADD A,#1MOVC A,A+PCRET;1TAB:DB 0,1,4,9,16,25,36,49,64,81,或,37,【例】子程序。编程实现运算式c=a2+b2。假定a、b、c分别存放在内部RAM的30H、31H、32H单元中,ORG 0000HSJMP MAIN
21、ORG 0030H MAIN:MOV A,30HLCALL SQUAREMOV 30H,AMOV A,31HLCALL SQUAREADD A,30HMOV 32H,ASJMP$,38,【例】阶乘计算求Y=n!(n=0,1,2,9)的值。,按照求阶乘的运算,需继续n-1次乘法,运算程序复杂。采用查表法。事先计算n的阶乘值并作成表格,通过查表程序获得结果。9!=362880=58980H,表格中每个结果占用3个存储单元。Y地址=表首址+n3程序中:n值存放在A中,Y值存入R2R1R0中。,39,ORG 2000HTEM EQU 30HFACTORIAL:MOV B,#3MUL AB;n在A中,n
22、3MOV B,A;暂存B中MOV DPTR,#TAB;指向表首址TABLMOV A,A+DPTR;查表取低字节MOV R0,A;存入R0INC DPTR;修正地址指针MOV A,B;恢复n3MOV A,A+DPTR;查表取中间字节MOV R1,A;存入R1INC DPTR;修正地址指针MOV A,B;恢复n3MOVC A,A+DPTR;查表取高字节MOV R2,A;存入R2RETTAB:DB 0,0,0,0,0,1,0,0,2,0,0,6;0,1,2,3的阶乘DB 0,0,18H,0,0,78H,0,2,D0H;4,5,6的阶乘DB 0,13H,0B0H,0,9DH,80H;7,8的阶乘DB
23、5,89H,80H;9的阶乘,40,【KEY的简单控制】在某单片机系统中,按下一按键,键值(代表哪个键被按下)存放在内部RAM的40H单元内。设计一段程序实现功能:如果(40H)=00H,调用子程序SUB1;如果(40H)=01H,调用子程序SUB2;如果(40H)=02H,调用子程序SUB3;如果(40H)=03H,调用子程序SUB4;如果(40H)=04H,调用子程序SUB5。,MOV A,40HMOV DPTR,#TABRL AADD A,40HJMP A+DPTRTAB:LCALL SUB1LCALL SUB2LCALL SUB3LCALL SUB4LCALL SUB5,41,小结,3
24、种基本结构顺序结构、分支结构、循环结构掌握MCS-51单片机汇编语言程序的基本格式及伪指令了解程序的基本架构和程序设计的基本方法掌握数制转换、算术运算、关键字查找等典型程序的设计掌握子程序的设计方法及其参数传递方法,为日后灵活掌握单片机系统的设计与开发打好基础!,42,本讲结束!谢谢同学们!,博学 笃行 尚德 济世,43,小结,3种基本结构顺序结构、分支结构、循环结构掌握MCS-51单片机汇编语言程序的基本格式及伪指令了解程序的基本架构和程序设计的基本方法掌握数制转换、算术运算、关键字查找等典型程序的设计掌握子程序的设计方法及其参数传递方法,为日后灵活掌握单片机系统的设计与开发打好基础!,44,