第4章-80C51单片机汇编语言程序设计(新)PPT优秀课件_第1页
第4章-80C51单片机汇编语言程序设计(新)PPT优秀课件_第2页
第4章-80C51单片机汇编语言程序设计(新)PPT优秀课件_第3页
第4章-80C51单片机汇编语言程序设计(新)PPT优秀课件_第4页
第4章-80C51单片机汇编语言程序设计(新)PPT优秀课件_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1,单片机原理与应用Principle 从0000H单元开始存放下面的指令 LJMP 0030H ORG 0030H;从0030H单元开始存放下面的指令 MAIN:MOV SP,#50H ORG 0040H;从0040H单元开始存放下面的数据 TAB:DB 23,89,定义字节命令DB (Define Byte),在程序存储器中定义字节数据。 Xn可以是一字节常数;用双引号或者单引号括起来的字符或字符串;各个数之间用逗号隔开。,DB,8,ORG 1000H A1:DB 01001010B,23o,23,78H, A2:DB 5,”12AB”,12D,-2,(1000H)=01001010B=4

2、AH, (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”;

3、存入41H,41H DW “A”;存入00H,41H DW “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的位地址赋给字符名A

4、Q,在其后 ;的编程中AQ可以作为位地址使用。, BIT ,11,赋值命令 EQU (Equate),给数或符号赋给字符 可以是常数、地址、标号或表达式。 赋值以后的字符既可以作地址使用,也可以作立即数使用。,【例】CS EQU 0FFFFH,A1 EQU R1 A2 EQU 10H DELAY EQU 0708H,A1可作为寄存器R1来使用,A2可作为8位直接地址或立即数使用,DELAY可作为16位地址或者立即数使用。,字符名 EQU 数或汇编符号,12,数据地址赋值伪指令DATA,将表达式的值赋给字符。 表达式可以是一个数据或地址,也可以是一个包含所定义字符名在内的表达式,但不能是一个汇编

5、符号(如R0R7)。 与EQU的区别: EQU必须先定义后使用。 DATA无此限制,所以DATA伪指令可以放在源程序的开头或末尾,MOV R0,ADDRESS MOV R1,#ADDRESS ADDRESS DATA 31H,将31H单元内容送R0,(R1)=31H。,字符名 DATA 表达式,13,汇编终止命令END (End of assembly),用于终止源程序的汇编工作,在一个源程序中只能有一条END命令,并且位于程序的最后。 如果END命令出现在程序中间,则其后面的源程序将不予处理。,14,一般汇编调试工具要求的汇编格式,一般用汇编语言编写的程序,要求指出该程序存放于内存地址的位置

6、,并且将用到的数据和需要预留存放数据的空间用伪指令定义好 然后编写程序代码 最后用原地踏步或返回起始位置循环作为结束。,ORG SJMP $ END,【例】程序格式如下:,15,16,汇编语言程序的基本结构形式,17,分支结构,使用条件转移指令对程序的执行结果进行判断 JZ、JNZ、CJNE、DJNZ JC、JNC、JB、JNB、JBC,18,【例】二分支。在外部RAM中有ST1、ST2和ST3共3个连续单元,其中ST1和ST2单元中存放着两个无符号二进制数,要求找出其中的大数并存入ST3单元中。,19,【例】三分支-多次二选一。设变量x存入30H单元,求得函数y存入31H单元。按下式要求给y

7、赋值:,要根据x的大小来决定y值,在判断x5和y10时,采用CJNE和JC以及CJNE和JNC指令进行判断。,20,ORG 1000H MOV A,30H;取x CJNE A,#5,NEXT1;与5比较 NEXT1:JC NEXT3;x5,则转NEXT3 CJNE A,#10,NEXT2;与10比较 NEXT2:JNC NEXT4; x10,则转NEXT4MOV R0,#0;5x 10,y=0 SJMP NEXT5 NEXT3:MOV R0,A DEC R0;x5,y=x-1 SJMP NEXT5 NEXT4:MOV R0,A INC R0;x10,y=x+1 NEXT5:MOV 31H,R0

8、;存结果 SJMP $ END,多分支转移,使用变址寻址转移指令(散转指令) JMP A+DPTR ;PC(A)+(DPTR) 数据表、转移指令表、堆栈操作,21,22,通过数据表实现程序多分支,MOV A, #k;分支序号k送A MOV DPTR,#BRTAB;表首址 MOVC A,A+DPTR;查表后,(A)=BRk-BRTAB JMP A+DPTR;散转指令,(PC)=BRk BRTAB: DB BR0-BRTAB;数据表,BRTAB+0 DBBR1-BRTAB; 分支入口地址与表首址之差,BRTAB+1 DBBRn-BRTAB;BRTAB+n BR0:;各个分支程序 BR1: BRn:

9、,23,通过转移指令表实现程序多分支,MOV A,#k;分支序号k送A RL A;分支序号乘以2 MOV DPTR,#BRTAB;表首址 JMP A+DPTR;(PC)=BATAB+2k BRTAB: AJMP BR0;转分支程序0,BRTAB AJMP BR1;转分支程序1,BRTAB+2 AJMP BRn;转分支程序n,BRTAB+2n BR0:;各个分支程序 BR1: BRn:,24,使用长转移指令LJMP时,,MOV A,#k RL A ADD A,R3 MOV DPTR,#BRTAB JMP A+DPTR BRTAB:LJMP BR0;BRTAB LJMP BR1;BRTA+3 LJ

10、MP BRn;BRTAB+3n,25,通过堆栈操作实现程序多分支,MOV DPTR,#BRTAB;分支程序入口地址表首址 MOV A,#k;分支序号放入A中 RL A;分支序号值乘以2 MOV R1,A;暂存A值入R1 INC A;A指向低位地址 MOVC A,A+DPTR;取低位地址BRn 7-0 PUSH ACC;低位地址入栈 MOV A,R1;恢复A值 MOVC A,A+DPTR;取高位地址BRn 15-8 PUSH ACC;高位地址入栈 RET;分支入口地址装入PC BRTAB: DW BR0;分支程序入口地址表,BRTAB、BRTAB+1 DW BR1;BRTAB+2、BRTA+3

11、DW BRn;BRTAB+2n、BRTAB+2n+1,RET PC158(SP), SP(SP)-1 PC70(SP), SP(SP)-1,26,循环结构,初始化部分 对于循环次数计数器、地址指针赋初值,对于使用到的寄存器或者存储单元赋初值,为循环作准备。 循环体部分 为下一次循环创造条件:修改循环次数计数器、地址指针,避免死循环。 循环的判断与控制:判断循环次数计数器,或者检查判断循环条件。 可以直接由循环体内转到循环体外或外层循环;不能从循环体外直接跳转到循环体内,只能从外层向内层一层层进入。 循环结束处理: 结果保存等。,27,【例】单循环。编程实现把外部RAM中从8000H开始的100

12、个字节数据传送到8100H开始的单元中。,MOV R7,#100 MOV DPL,#00H LOOP: MOV DPH,#80H MOVX A,DPTR MOV DPH,#81H MOVX DPTR,A INC DPL DJNZ R7,LOOP,MOV R0,#00 LOOP: MOV P2,#80H MOVX A,R0 MOV P2,#81H MOVX R0,A INC R0 CJNE R0,#100,LOOP,或,28,【例】由循环内部跳出循环。把长度为10H的字符串从内部RAM缓冲区inbuf向位于外部RAM的输出缓冲区outbuf传送,一直进行遇到回车符CR或整个字符串传送完毕。,ST

13、ART:MOV R7,#10H MOV R0,#inbuf MOV DPTR, #outbuf LOOP:MOV A,R0 CJNE A,#0D0H,CONTINUE SJMP FINISH CONTINUE:MOVX DPTR,A INC R0 INC DPTR DJNZ R7,LOOP FINISH:SJMP $ END,29,子程序,在主程序中调用子程序 LCALL/ACALL 标号;调用子程序时,断点入栈保存 由子程序返回主程序 RET;子程序返回时,断点出栈从而回到主程序。 子程序中,视情况进行现场保护和现场恢复 1、使用堆栈:PUSH/POP 2、暂存到其它存储单元中,最终恢复即可

14、,30,调用延时子程序DELAY。,主程序: 子程序: 该子程序根本不需要主程序提供入口参数,从进入子程序开始,到子程序返回,这个过程花费CPU一定的时长。 循环体只能执行有限次,避免“死循环” 。,DELAY:PUSH 06H PUSH 07H MOV R7,#100 DLY0:MOV R6,#98 NOP DLY1:DJNZ R6,DLY1 DJNZ R7,DLY0 POP 07H POP 06H RET,LCALL DELAY,31,80C51单片机汇编语言程序设计举例,定时程序 查表程序 求平方 极值查找程序 查找关键字 扩展 阶乘计算 压缩和解压程序 算术运算:加、减、乘、除 数据排

15、序 数制与编码转换程序 LED的简单控制 KEY+LED的简单控制,单循环定时程序,DELAY:MOV R5,#TIME;1 LOOP:NOP;1 NOP;1 DJNZ R5,LOOP;2 RET;2,1+(1+1+2)*R5+2*机器周期 12M 机器周期=1us 定时时长为:,32,如何调整定时时长?,较长时间的定时程序,DELAY:MOV R5,#TIME1;1 LOOP2:MOV R4,#TIME2;1 LOOP1:NOP;1 NOP;1 DJNZ R4,LOOP1;2 DJNZ R5,LOOP2;2 RET;2,1+1+(1+1+2)*R4+2*R5+2*机器周期,33,通过一个基本

16、延时程序产生不同的定时,MOV R0,#05H;5ms LOOP1:LCALL DELAY;1ms DJNZ R0,LOOP1 MOV R0,#OAH;10ms LOOP2:LCAL DELAY DJNZ R0,LOOP2 MOV R0,#14H;20ms LOOP3:LCALL DELAY DJNZ R0,LOOP3 ,34,查表指令,按顺序读出存储器中的数据称为查表。先确定好PC或DPTR的内容,然后有规律地改变A的内容,就可以进行程序存储器中表格数据的读出。 MOVC A,A+DPTR 可在64KB范围内查表,长查表指令。 MOVC A,A+PC 查距本指令256个字节以内的数据,短查表

17、指令。 PC=当前查表指令地址+1 变址调整值,即该指令执行后的地址到表格首址之间的距离 注意:如果数据表存放在外部ROM中,执行查表指令时,会在控制引脚PSEN上产生一个程序存储器读信号。,35,查表程序,功能:复杂计算、非线性计算、非数值计算的处理。 查表:把事先计算或测得的数据按顺序编制成表格存放在程序存储器ROM中(伪指令DB或DW);查表程序根据被测数据,查出表格中对应的结果。 优点:编程简单、执行速度快、适合于实时控制。,36,【例】分别用两条查表指令编写一段子程序,功能为:根据累加器A中的数(09之间)查找平方表,求出相应的平方数,放在A中。,SQUARE: MOV DPTR,#

18、TAB MOVC A,A+DPTR RET TAB:DB 0,1,4,9,16,25,36,49,64,81,SQUARE: ADD A,#1 MOVC A,A+PC RET;1 TAB:DB 0,1,4,9,16,25,36,49,64,81,或,37,【例】子程序。编程实现运算式c=a2+b2。假定a、b、c分别存放在内部RAM的30H、31H、32H单元中,ORG 0000H SJMP MAIN ORG 0030H MAIN:MOV A,30H LCALL SQUARE MOV 30H,A MOV A,31H LCALL SQUARE ADD A,30H MOV 32H,A SJMP $

19、,38,【例】阶乘计算求Y=n!(n=0,1,2,9)的值。,按照求阶乘的运算,需继续n-1次乘法,运算程序复杂。 采用查表法。事先计算n的阶乘值并作成表格,通过查表程序获得结果。 9!=362880=58980H, 表格中每个结果占用3个存储单元。 Y地址=表首址+n3 程序中:n值存放在A中,Y值存入R2R1R0中。,39,ORG 2000H TEM EQU 30H FACTORIAL:MOV B,#3 MUL AB;n在A中,n3 MOV B,A;暂存B中 MOV DPTR,#TAB;指向表首址TABL MOV A,A+DPTR;查表取低字节 MOV R0,A;存入R0 INC DPTR;修正地址指针 MOV A,B;恢复n3 MOV A,A+DPTR;查表取中间字节 MOV R1,A;存入R1 INC DPTR;修正地址指针 MOV A,B;恢复n3 MOVC A,A+DPTR;查表取高字节 MOV R2,A;存入R2 RET TAB: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的阶

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论