《第4章AT89S51汇编语言程序设计.ppt》由会员分享,可在线阅读,更多相关《第4章AT89S51汇编语言程序设计.ppt(44页珍藏版)》请在课桌文档上搜索。
1、第4章 AT89S51汇编语言程序设计,2,4.1.2 汇编语言语句和格式两种基本语句:指令语句和伪指令语句。(1)指令语句汇编语言四分段格式:START:MOV A,#00H;0A MOV R1,#10;10R1 MOV R2,#00000011B;03HR2LOOP:ADD A,R2;(A)+(R2)A DJNZ R1,LOOP;R1减1不为零,则跳 LOOP处 NOPHERE:SJMP HERE,(2)伪指令语句又称为汇编程序控制命令。没有相应的机器代码产生。伪指令具有控制汇编程序的输入/输出、定义数据和符号、条件汇编、分配存储空间等功能。1ORG(ORiGin)汇编起始地址命令例如:O
2、RG2000HSTART:MOVA,#00H 在一源程序中,可多次用ORG指令,规定不同程序段的起始地址。地址必须由小到大排列,且不能交叉、重叠。,2.END(END of Assembly)汇编终止命令源程序结束标志,终止源程序的汇编工作。3EQU(EQUate)标号赋值命令用于给标号赋值。赋值后,标号值在整个程序有效。例如:TESTEQU 2000HTEST=2000H,汇编时,凡是遇到TEST时,均以2000H来代替。,4DB(Define Byte)定义数据字节命令在程序存储器单元中定义字节数据。例如:ORG2000HDB30H,40H,24,C,B汇编后(2000H)=30H(200
3、1H)=40H(2002H)=18H(十进制数24)(2003H)=43H(字符“C”的ASCII码)(2004H)=42H(字符“B”的ASCII码)十进制数自然转换成十六进制数,字母按ASCII码存储。,6,5DW(Define Word)定义数据字命令 在程序存储器单元中定义16位的数据字。例如:ORG2000HDW1246H,7BH,10汇编后(2000H)=12H;第1个字(2001H)=46H(2002H)=00H;第2个字(2003H)=7BH(2004H)=00H;第3个字(2005H)=0AHDB、DW和DS命令只能对程序存储器有效,不能对数据存储器使用。,6DS(Defin
4、e Storage)定义存储区命令 NOP从指定地址开始,保留指定数目的字节单元作为存储区。例如:TABEL:DS10 表示从TABEL代表的地址开始,保留10个连续的地址单元。例如:ORG2000HDS10 H表示从2000H地址开始,保留16个连续地址单元。,7BIT 位定义命令用于给字符名称赋以位地址,位地址可以是绝对位地址,也可是符号地址。例如:QABIT P1.6功能是把P1.6的位地址赋给变量QA。4.2 汇编语言源程序的汇编汇编可分为手工汇编和机器汇编两类。,4.3 AT89S51汇编语言程序设计举例4.3.1 子程序设计优点:程序结构简单,缩短程序设计时间,减少存储空间。1子程
5、序的设计原则和应注意的问题(1)子程序入口地址,前必须有标号。(2)主程序是通过调用指令来实现。有两条子程序调用指令。ACALL addr11。addr11指出了调用的目的地址,PC中16位地址中的高5位不变,即只能在同一个2KB区内。LCALL addr16长调用指令。(3)子程序结构中必须用到堆栈,用来进行断点和现场的保护。(4)子程序返回主程序时,最后一条指令必须是RET指令。(5)子程序可以嵌套,即主程序可以调用子程序,子程序又可以调用另外的子程序。,2子程序的基本结构MAIN:;MAIN为主程序入口标号LCALL SUB;调用子程序SUB子程序SUB:PUSH PSW;现场保护 PU
6、SH AccPOP Acc;现场恢复,注意要先进后出POP PSW RET;最后一条指令必须为RET,4.3.2 查表程序设计(1)MOVC A,A+DPTR(2)MOVC A,A+PC【例4-3】设计一子程序,功能是根据累加器A中的数x(09之间)查x的平方表y,根据x的值查出相应的平方y。本例中的x和y均为单字节数。地 址 子程序Y3Y2Y1Y0 ADD A,#01HY3Y2Y1Y0+2 MOVC A,A+PCY3Y2Y1Y0+3 RETY3Y2Y1Y0+4DB 00H,01H,04H,09H,10H DB 19H,24H,31H,40H,51H;数09的平方表,如果DPTR已被使用,则在
7、查表前必须保护DPTR,且结束后恢复DPTR,例4-3可改成如下形式:PUSH DPH;保存DPH PUSH DPL;保存DPLMOV DPTR,#TAB1MOVC A,A+DPTRPOP DPL;恢复DPLPOP DPH;恢复DPHRETTAB1:DB 00H,01H,04H,09H,10H;平方表DB 19H,24H,31H,40H,51H,【例4-4】有一巡回检测报警装置,需对16路(x)输入进行检测,每路有一个最大允许值(y),为双字节数。需根据测量的路数(x),查表找出对应该路的最大允许值(y),看输入值是否大于最大允许值,如果大于就报警。取路数为x(0 x15),y为最大允许值,放
8、在表格中。设进入查表程序前,假设路数x已放于R2中,查表后该路的最大允许值y放于R3R4中。查表程序如下:,TB3:MOV A,R2ADD A,R2;(R2)*2(A)MOV R3,A;保存指针 ADD A,#6;加偏移量MOVC A,A+PC;查第一字节XCH A,R3 ADD A,#3 MOVC A,A+PC;查第二字节 MOVR4,ARETTAB3:DW 1520,3721,42645,7580;最大值表 DW 3483,32657,883,9943DW 10000,40511,6758,8931DW 4468,5871,13284,27808,【例4-5】以AT89S51为核心的温度控
9、制器,温度传感器输出的电压与温度为非线性关系,传感器输出的电压已由A/D转换为10位二进制数。测得的不同温度下的电压值数据构成一个表,表中温度值为y(双字节无符号数),x(双字节无符号数)为电压值数据。设测得电压值x放入R2R3中,根据电压值x,查找对应的温度值y,仍放入R2R3中。程序如下:,LTB2:MOVDPTR,#TAB2MOVA,R3CLRC RLCA MOVR3,A XCHA,R2 RLCA XCHR2,A MOV R3,A ADDA,DPL;(R2R3)+(DPTR)(DPTR)MOVDPL,A MOVA,DPH ADDC A,R2 MOVDPH,A CLRA,MOVC A,A+
10、DPTR;查第一字节MOVR2,A;第一字节存入R2中CLRAINCDPTRMOVC A,A+DPTR;查第二字节MOVR3,A;第二字节存入R3中RETTAB2:DW,;温度值表,4.3.3 关键字查找程序设计数据检索有两种方法,即顺序检索和对分检索。1顺序检索要检索的表是无序的,检索时只能从第1项开始逐项查找,判断所取数据是否与关键字相等。【例4-6】从50个字节的无序表中查找一个关键字“xxH”。ORG 1000HMOV 30H,#xxH;关键字xxH送30H单元MOV R1,#50;查找次数送R1MOV A,#14;修正值送AMOV DPTR,#TAB4;表首地址送DPTR,LOOP:
11、PUSH AccMOVC A,A+PC;查表结果送A CJNE A,40H,LOOP1;(40H)不等于关键字则转LOOP1 MOV R2,DPH;查到关键字,把地址送R2,R3MOV R3,DPLDONE:RETLOOP1:POP Acc;修正值弹出INC A;A+1AINC DPTR;修改数据指针DPTRDJNZ R1,LOOP;R10,未查完,继续查找MOVR2,#00H;R1=0,R2和R3清0MOVR3,#00H;表中50个数已查完AJMPDONE;从子程序返回TAB4:DB,;50个无序数据表,2对分检索对分检索的前提是检索的数据表已经排好序,以便于按照对分原则取数。对分检索的方法
12、:取数据表中间位置的数与关键字进行比较,如相等,则查找结束。如果取数大于关键字,则下次对分检索的范围是从数据区起点到本次取数处。如果取数小于关键字,则下次对分检索的范围是从本次取数数据区起点到数据区终点。依此类推,逐渐缩小检索范围,减少次数,大大提高查找速度。,21,4.3.4 数据极值查找程序设计【例4-7】片内RAM中存放一批数据,查找出最大值并存放于首地址中。设R0中存放首地址,R2中存放字节数。程序如下:MOV R2,n;n为要比较的数据字节数MOV A,R0;存首地址指针MOV R1,ADEC R2MOV A,R1LOOP:MOV R3,ADEC R1CLR CSUBB A,R1;两
13、个数比较JNC LOOP1;C=0,A中数大,跳LOOP1MOV A,R1;C=1,则大数送ASJMP LOOP2LOOP1:MOV A,R3 LOOP2:DJNZ R2,LOOP;是否比较结束?MOV R0,A;存最大数RET,4.3.5 数据排序程序设计第一次冒泡的过程是:6、4、1、2、5、7、3;原始数据的排列4、6、1、2、5、7、3;逆序,互换4、1、6、2、5、7、3;逆序,互换4、1、2、6、5、7、3;逆序,互换4、1、2、5、6、7、3;逆序,互换4、1、2、5、6、7、3;正序,不互换4、1、2、5、6、3、7;逆序,互换,第一次冒泡结束如此进行,各次冒泡的结果如下:第1
14、次冒泡结果:4、1、2、5、6、3、7第2次冒泡结果:1、2、4、5、3、6、7,第3次冒泡结果:1、2、4、3、5、6、7第4次冒泡结果:1、2、3、4、5、6、7;已完成排序第5次冒泡结果:1、2、3、4、5、6、7第6次冒泡结果:1、2、3、4、5、6、7对于n个数,理论上应进行(n-1)次冒泡才能完成排序,实际上有时不到(n-1)次就已完成排序。例如,上面的7个数,应进行6次冒泡,但实际上第4次冒泡时就已经完成排序。如何判定排序是否已经完成?就是看各次冒泡中是否有互换发生,如果有,则排序还没完成;否则就表示已经排好序。在程序设计中,常用设置互换标志的方法,用标志的状态表示是否有互换进行
15、。【例4-8】一批单字节无符号数,以R0为首地址指针,R2中为字节数,将这批数进行升序排列。程序框图如图4-2所示。程序如下:,24,图4-2 单字节无符号数排序程序,MAIN:MOV SP,#60H MOV PSW,#00HLP03:CLR F0;互换标志位F0清0 MOV R0,#30H;数据首地址 R0 MOV R2,#0AH;字节数送入R2 DEC R2LP02:MOV A,R0 MOV R3,A INC R0 MOV A,R0;比较大小 CLR C SUBB A,R3 JNC LP01MOV A,R3;XCH A,R0;两个数互换DEC R0XCH A,R0SETB F0;互换标志位
16、F0置1 INC R0LP01:DJNZ R2,LP02JB F0,LP03 END,4.3.6 分支转移程序设计分为无条件转移和有条件转移。无条件分支转移程序很简单,不讨论。有条件分支转移程序按结构类型来分,又分为单分支选择结构和多分支选择结构。1单分支选择结构 仅有两个出口,两者选一。一般根据运算结果的状态标志,用条件判跳指令来选择并转移。【例4-9】求单字节有符号数的二进制补码正数补码是其本身,负数补码是其反码加1。应首先判被转换数的符号,负数进行转换,正数本身即为补码。,设二进制数放在A中,其补码放回到A中,参考程序如下:CMPT:JNB Acc.7,RETURN;(A)0,不需转换M
17、OV C,Acc.7;符号位保存CPL A;(A)求反,加1ADD A,#1MOV Acc.7,C;符号位存在A的最高位RETURN:RET,图4-3 求单字节有符号二进制数补码,此外,单分支选择结构还有图4-4、图4-5所示的几种形式。,图4-4 单分支选择结构2 图4-5 单分支选择结构3,2多分支选择结构当程序的判别部分有两个以上的出口时,为多分支选择结构。有两种形式,如图4-6和图4-7所示。,图4-6 多分支选择结构1 图4-7 多分支选择结构2,指令系统提供了非常有用的两种多分支选择指令:间接转移指令 JMP A+DPTR比较转移指令 CJNE A,direct,rel CJNE
18、A,#data,rel CJNE Rn,#data,rel CJNE Ri,#data,rel间接转移指令“JMP A+DPTR”由数据指针DPTR决定多分支转移程序的首地址,由A的内容选择对应分支。4条比较转移指令CJNE能对两个欲比较的单元内容进行比较,当不相等时,程序实现相对转移;若两者相等,则顺序往下执行。简单的分支转移程序的设计,常采用逐次比较法。缺点是程序太长,有n种可能的情况,就需有n个判断和转移。,【例4-10】求符号函数的值。符号函数定义如下:X存放在40H单元,Y存放在41H单元,如图4-6所示。SIGNFUC:MOV A,40HCJNE A,#00H,NZEARAJMP
19、NEGTNZEAR:JB Acc.7,POSIMOV A,#01HAJMPNEGTPOSI:MOVA,#81HNEGT:MOV41H,AEND,实际中,经常遇到图4-7的分支转移程序设计,典型例子就是当单片机系统中的键盘按下时,就会得到一个键值,根据不同的键值,跳向不同的键处理程序入口。此时,可用直接转移指令(LJMP或AJMP指令)组成一个转移表,然后把该单元的内容读入累加器A,转移表首地址放入DPTR中,再利用间接转移指令实现分支转移。【例4-11】根据寄存器R2的内容,转向各个处理程序PRGX(X=0n)。(R2)=0,转PRG0(R2)=1,转PRG1(R2)=n,转PRGn程序如下:
20、,JMP6:MOVDPTR,#TAB5;转移表首地址送DPTRMOV A,R2;分支转移参量送AMOV B,#03H;乘数3送BMUL AB;分支转移参量乘3MOV R6,A;乘积的低8位暂存R6MOV A,B;乘积的高8位送AADD A,DPH;乘积的高8位加到DPH中MOV DPH,A MOV A,R6JMP A+DPTR;多分支转移选择 TAB5:LJMP PRG0;多分支转移表LJMP PRG1 LJMP PRGn;重点R2中的分支转移参量乘3是由于长跳转指令LJMP要占3个单元。本例程序可位于64KB程序存储器空间的任何区域。,4.3.7 循环程序设计1循环程序的结构(1)循环初始化
21、完成循环前的准备工作。循环控制计数初值设置、地址指针起始地址设置、为变量预置初值等。(2)循环处理完成实际的处理工作,反复循环执行部分,故又称循环体。(3)循环控制在重复执行循环体过程中,不断修改循环控制变量,直到符合结束条件,就结束循环程序执行。循环结束控制方法分为循环计数控制法和条件控制法。(4)循环结束这部分是对循环程序执行的结果进行分析、处理和存放。,2循环结构的控制分为循环计数控制结构和条件控制结构。,图4-8 计数循环控制结构 图4-9 条件控制结构,(1)计数循环控制结构DJNZ Rn,rel;以工作寄存器作控制计数器DJNZ direct,rel;以直接寻址单元作控制计数器例如
22、,计算n个数据的和,计算公式为。,图4-10 求数据和的程序框图,【例4-12】求n个单字节无符号数xi的和,xi按i顺序存放在内RAM从50H开始单元中,n放在R2中,和(双字节)在R3R4中。程序如下:ADD1:MOV R2,#n;加法次数n送R2MOV R3,#0;R3存放和的高8位,初始值为0MOV R4,#0;R4存放和的低8位,初始值为0 MOV R0,#50HLOOP:MOV A,R4 ADD A,R0 MOV R4,A INC R0 CLR A ADDC A,R3 MOV R3,A DJNZ R2,LOOP;判加法循环次数是否已到?END,(2)条件控制结构【例4-13】一串字
23、符,依次存放在内部RAM从30H单元开始的连续单元中,字符串以0AH为结束标志,测试字符串长度。如果字符与“0AH”不等,则长度计数器和字符串指针都加1;如果比较相等,则表示该字符为“0AH”,字符串结束,计数器值就是字符串的长度。程序如下:MOV R4,#0FFH;长度计数器初值送R4MOV R1,#2FH;字符串指针初值送R1NEXT:INC R4INC R1 CJNE R1,#0AH,NEXT;比较,不等则进行下一字符比较 END,【例4-14】50ms延时程序。在使用12MHz晶振时,一个机器周期为1s,执行一条DJNZ指令的时间为2s。DEL:MOV R7,#200;本指令执行时间1
24、sDEL1:MOV R6,#125;本指令执行时间1sDEL2:DJNZ R6,DEL2;指令执行1次为2s,计;1252 s=250s DJNZ R7,DEL1;指令执行时间2s,本循环体;执行125次 RET;指令执行时间2s以上延时程序不是太精确,如把所有指令的执行时间计算在内,它的延时时间为1+(1+250+2)200+2s=50.603ms,如要求比较精确的延时,应对上述程序进行修改,才能达到较为精确的延时时间。但要注意,用软件实现延时程序,不允许有中断,否则将严重影响定时的准确性。对于延时更长的时间,可采用多重的循环,如1s延时,可用三重循环。,ORG 0000H MOV SP,#
25、60H MOV PSW,#00HLP01:MOV 00H,#00H MOV 08H,#00H MOV 10H,#00H MOV 18H,#00H CLR ALP10:CJNE A,#00H,LP03 SJMP LP10LP03:MOV B,ALP13:MOV A,R0 CJNE A,#00H,LP02 SJMP LP13LP02:MOV PSW,#08H SJMP LP06,LP06:MOV A,R0 CJNE A,#00H,LP05LP05:MOV PSW,#10HLP07:MOV A,R0 CJNE A,#00H,LP08 SJMP LP07LP08:MOV PSW,#18HLP09:MO
26、V A,R0 CJNE A,#00H,LP11 SJMP LP09LP11:CLR C MOV A,B ADD A,00H MOV 00H,A MOV A,B,ADD A,08H MOV 08H,A MOV A,B ADD A,10H MOV 10H,A MOV A,B ADD A,18H MOV 18H,ALP12:SJMP LP12 END,2、用子程序求1+2+100=?,结果放在 ORG 0000H R3R2中。编写程序框图。MOV SP,#60H MOV PSW,#00HLP01:MOV R2,#00H MOV R3,#00H MOV R0,#64H MOV R1,#00H INC
27、R1 LP10:MOV A,R2 ADD A,R1 MOV R2,A MOV A,R3 ADDC A,#00H MOV R3,A INC R1 DJNZ R0,LP10LP13:SJMP LP13 END,1、A中内容为1-10,分别用PC指针、DPTR指针求平方,结果存入20H单元。TABLE表放在程序存储器030H开始地址。ORG 0000H MOV DPTR,#TABLE MOVC A,A+DPTR LP01:SJMP LP01 ORG 0100HTABLE:DB 00H,01H,04H,09H DB 10H,19H,24H,31H DB 40H,51H,64H,ORG 0000HLP01:MOV PSW,#00H ADD A,R0 MOV SP,#60H MOV R2,A CLR C POP PSW MOV A,R1 POP ACC ADD A,R0 RET LCALL LP10 ENDLP02:SJMP LP02ORG 100HLP10:PUSH ACC PUSH PSW MOV PSW,#08H CLR C MOV A,R1,3、将30H-40H单元内容从大到小排序,结果放回30H-40H。4、编写延时1秒子程序,用主程序调延时子程序,延时10秒。,
链接地址:https://www.desk33.com/p-740555.html