欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    第4章-89S51的汇编语言程序设计课件.ppt

    • 资源ID:3730285       资源大小:1.10MB        全文页数:56页
    • 资源格式: PPT        下载积分:16金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要16金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    第4章-89S51的汇编语言程序设计课件.ppt

    2023/3/18,1,第4章 89S51的汇编语言程序设计,程序编制的方法和技巧,4.1,源程序的编辑和汇编,4.2,基本程序结构,4.3,子程序及其调用,4.4,2023/3/18,2,单片机应用系统由硬件系统和应用程序构成。,汇编语言 高级语言(例如,C语言),应用程序设计方法,汇编语言,生成的目标程序占内存空间少、运行速度快,具有效率高、实时性强的特点。,高级语言,对系统的描述与实现与人的思维相似,程序阅读、修改和移植方便,适合于编写复杂的程序。,2023/3/18,3,4.1 程序编制的方法和技巧,4.1.1 程序编制的步骤,明确任务:功能要求、技术指标 运行环境调研,任务分析,将实际问题转化为计算机处理的程序算法。算法比较与优化(内存需求、运行速度、效率)。,算法设计,2023/3/18,4,强化模块观念,使程序结构清晰。简化代码。,程序模块(主程序模块、各种子程序模块)模块化优点:分块设计、层次清晰、便于接口。,4.1.2 程序编制的方法和技巧,采用循环和子程序的优点,注意:1、循环初值和结束条件,避免“死循环”现象。2、子程序的现场保护。,2023/3/18,5,4.1.3 汇编语言的语句格式,标号代表本行程序所在的地址。标号由18个ASCII码字符组成,第一个字符必须是字母。不能用已定义的关键字(指令助记符、伪指令等)。同一标号在一个程序中只能定义一次,不能重复定义。标号后跟英文冒号“:”。,标号(即符号地址),标号:指令助记符 操作数1,操作数2,操作数3,;注释,2023/3/18,6,数据:二进制(B)十进制(D或省略D)十六进制(H)。注意:若十六进制操作数以字符AF开头,需在它前面加一个“0”,以便汇编时把它和标号区分开。符号:符号名、标号或“$”。表达式:由运算符和数据构成。,操作数,2023/3/18,7,注释,英文分号“;”开头。汇编时,遇到“;”就停止“翻译”。因此,注释字段不会产生机器代码。,2023/3/18,8,4.2.1 伪指令,4.2 源程序的编辑,4.2.2 源程序的编辑,2023/3/18,9,4.2.1 伪指令,伪指令:用于指导汇编工作。汇编后,伪指令没有与之对应的机器代码。,起始地址设定伪指令ORG,ORG 表达式,表达式通常为十六进制地址,例:,ORG 8000HSTART:MOV A,#30H,ORG可多次使用,但地址值的顺序要由小到大。,2023/3/18,10,结束汇编伪指令END,END,该伪指令位于源程序的最后一行,表示汇编到此结束。整个源程序中只能有一条END命令,且位于程序的最后。对于END之后的程序,将不进行汇编处理。,2023/3/18,11,定义字节数据表伪指令DB,定义字数据表伪指令DW,1000H,标号:DB 字节数据表,ORG 1000HDB-2,-4,-6,8,10,18,1001H,标号:DW 字数据表,ORG 1400HDATA1:DW 324AH,3CH,1400H,1401H,1402H,1403H,注意:字母按ASCII码存储。,2023/3/18,12,预留空间伪指令DS,标号:DS 预留空间字节数,ORG 2000HTAB1:DB 12H,34H DS 4H DB 5,2023/3/18,13,定义常量值的伪指令EQU,符号名 EQU 常值表达式,LEN EQU 10 SUM EQU 21HBLOCK EQU 22H MOV R7,LEN MOV R0,BLOCK MOV SUM,A,2023/3/18,14,位定义命令 BIT,用于给字符名称赋予位地址,位地址可以是绝对位地址,也可是符号地址。例如:LEDBIT P1.6功能是把P1.6的位地址赋给变量LED。,2023/3/18,15,4.2.2 源程序的编辑,源程序的编辑,ORG 0000H LJMP MAIN ORG 0040HMAIN:MOV R7,#16 MOV R0,#60H MOV A,#55HLOOP:MOV R0,A INC R0 DJNZ R7,LOOP SJMP$END,依据汇编语言规则用好伪指令符号不用中文汇编程序以.ASM存盘,2023/3/18,16,4.3.1 顺序程序,(无分支、无循环),4.3 基本程序结构,ORG 0040HSTART:MOV A,21H;取21H的内容 ANL A,#0FH;保留低半字节 SWAP A;移至高半字节 MOV 20H,A;存于20H单元 MOV A,22H;取22H的内容 ANL A,#0FH;保留低半字节 ORL 20H,A;合并到结果单元 SJMP$;等待 END,2023/3/18,17,4.3.2 分支程序,(双分支),【例】实现两个8位无符号数求和的子程序。,SADD:MOV A,R3;取加数(在R3中)CLR C ADD A,R4;被加数(在R4中)加A JC PP1 MOV R3,#00H;结果小于255时,高字节R3内容为00H SJMP PP2 PP1:MOV R3,#01H;结果大于255时,高字节R3内容为01H PP2:MOV R4,A;结果的低字节在R4中 RET,入口:(R3)=加数;(R4)=被加数。,出口:(R3)=和的高字节;(R4)=和的低字节。,2023/3/18,18,【例】求单字节有符号数的二进制补码。正数补码是其本身,负数补码是其反码加1。因此,应首先判被转换数的符号,负数进行转换,正数本身即为补码。设二进制数放在A中,其补码放回到A中。参考程序如下:CMPT:JNB Acc.7,RETURN;(A)0,不需转换 MOV C,Acc.7;符号位保存 CPL A;(A)求反,加1 ADD A,#1 MOV Acc.7,C;符号位存在A的最高位RETURN:RET,2023/3/18,19,4.3.2 分支程序,(多分支),多分支结构是程序中常见的结构,在多分支结构的程序中,能够按调用号执行相应的功能,完成指定操作。若给出调用号来调用子程序,一般用查表方法,查到子程序的地址,转到相应子程序。,2023/3/18,20,指令系统提供了非常有用的两种多分支选择指令:间接转移指令 JMP A+DPTR比较转移指令 CJNE A,direct,rel CJNE A,#data,rel CJNE Rn,#data,rel CJNE Ri,#data,rel 间接转移指令“JMP A+DPTR”由数据指针DPTR决定多分支转移程序的首地址,由A的内容选择对应分支。4条比较转移指令CJNE能对两个欲比较的单元内容进行比较,当不相等时,程序实现相对转移;若两者相等,则顺序往下执行。,2023/3/18,21,【例】设变量x存放在片内RAM的30H单元,变量y与x的关系是:当x大于0时,y=x;当x=0时,y=20H;当x小于0时,y=x+5。编制程序,根据x的大小求y,并送回原单元。,2023/3/18,22,ORG 0040HSTART:MOV A,30H;取x至累加器 JZ NEXT;x=0,转NEXT ANL A,#80H;否,保留符号位 JZ DONE;x 0,转结束 MOV A,#05H;x 0处理 ADD A,30H MOV 30H,A;X+05H送Y SJMP DONE NEXT:MOV 30H,#20H;x=0,20H送Y DONE:SJMP DONE END,2023/3/18,23,【例】求符号函数的值。符号函数定义如下:X存放在40H单元,Y存放在41H单元。,2023/3/18,24,程序如下:SIGNFUC:MOV A,40H CJNE A,#00H,NZEAR AJMP NEGTNZEAR:JB Acc.7,POSI MOV A,#01H AJMP NEGTPOSI:MOV A,#81HNEGT:MOV 41H,A END,2023/3/18,25,【例】根据R7的内容x(转移序号)转向相应的处理程序。设R7内容为04,对应的处理程序入口地址分别为PP0PP4。,2023/3/18,26,START:MOV R7,#3;转移序号为3,欲转向PP3 ACALL JPNUM;子程序调用 AJMP START JPNUM:MOV DPTR,#TAB;DPTR指向分支入口的表首地址 MOV A,R7 ADD A,R7;R7乘2,调整偏移量(3x2=6)MOV R3,A;A=R3=6 MOVC A,A+DPTR;先取PP3的高字节(PP3是DW)XCH A,R3;高字节暂存于R3 INC A;增1后,A=7,指向下一个 MOVC A,A+DPTR;再取PP3的低字节 MOV DPL,A;处理程序入口地址低8位送DPL MOV DPH,R3;处理程序入口地址高8位送DPH CLR A;DPTR指向PP3地址 JMP A+DPTR;跳转向PP3服务程序,2023/3/18,27,TAB:DW PP0;TAB是转移地址表 DW PP1 DW PP2 DW PP3 DW PP4 PP0:MOV 30H,#0;转移序号为0时,置功能号“0”于30H单元 RET PP1:MOV 30H,#1;转移序号为1时,置功能号“1”于30H单元 RET PP2:MOV 30H,#2;转移序号为2时,置功能号“2”于30H单元 RET PP3:MOV 30H,#3;转移序号为3时,置功能号“3”于30H单元 RET PP4:MOV 30H,#4;转移序号为4时,置功能号“4”于30H单元 RET,2023/3/18,28,4.3.3 查表程序,【例4-3】设计一子程序,功能是根据累加器A中的数x(09之间)查x的平方表y,根据x的值查出相应的平方y。本例中的x和y均为单字节数。ADD A,#01HMOVC A,A+PCRET DB 00H,01H,04H,09H,10H DB 19H,24H,31H,40H,51H;数09的平方表,2023/3/18,29,指令“ADD A,#01H”的作用是A中的内容加上“01H”,“01H”即为查表指令与平方表之间的“RET”指令所占的字节数。加上“01H”后,可保证PC指向表首,累加器A中原来的内容仅是从表首开始向下查找多少个单元。在进入程序前,A的内容在0009H之间,如A中的内容为02H,它的平方为04H,可根据A的内容查出x的平方。指令“MOVC A,A+DPTR”应用范围较广,使用该指令时不必计算偏移量,优点是表格可以设在64KB程序存储器空间内的任何地方,而不像“MOVC A,A+PC”那样只设在PC下面的256个单元中,所以使用较方便。,2023/3/18,30,如果DPTR已被使用,则在查表前必须保护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,2023/3/18,31,【例4-4】有一巡回检测报警装置,需对16路(x)输入进行检测,每路有一个最大允许值(y),为双字节数。需根据测量的路数(x),查表找出对应该路的最大允许值(y),看输入值是否大于最大允许值,如果大于就报警。取路数为x(0 x15),y为最大允许值,放在表格中。设进入查表程序前,假设路数x已放于R2中,查表后该路的最大允许值y放于R3R4中。查表的程序如下:理解:根据路数x,查最大允许值y。,2023/3/18,32,TB3:MOV A,R2ADDA,R2;(R2)*2(A)MOV R3,A;保存指针 ADDA,#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,2023/3/18,33,表格长度不能超过256B,且表格只能存放于“MOVC A,A+PC”指令以下的256个单元中,如需把表格放在程序存储器空间的任何地方,应使用指令“MOVC A,A+DPTR”。【例4-5】以AT89S51为核心的温度控制器,温度传感器输出的电压与温度为非线性关系,传感器输出的电压已由A/D转换为10位二进制数。测得的不同温度下的电压值数据构成一个表,表中温度值为y(双字节无符号数),x(双字节无符号数)为电压值数据。设测得电压值x放入R2R3中,根据电压值x,查找对应的温度值y,仍放入R2R3中。参考程序:理解:根据电压值x,查温度值y。,2023/3/18,34,LTB2:MOVDPTR,#TAB2 MOVA,R3 CLRC RLCA MOVR3,A XCHA,R2 RLCA XCHR2,A ADDA,DPL;(R2R3)+(DPTR)(DPTR)MOVDPL,A MOVA,DPH ADDC A,R2 MOVDPH,A CLRA,2023/3/18,35,MOVC A,A+DPTR;查第一字节MOVR2,A;第一字节存入R2中CLRAINCDPTRMOVC A,A+DPTR;查第二字节MOVR3,A;第二字节存入R3中RETTAB2:DW,;温度值表 由于使用了指令“MOVC A,A+DPTR”,表TAB2可放入64KB程序存储器空间任何位置,表格的长度可大于256B。,2023/3/18,36,4.3.4 查找关键字,在表中查找关键字的操作,也称为数据检索。【例4-6】从50个字节的表中查找一个关键字“xxH”。ORG1000HMOV30H,#xxH;关键字xxH送30H单元MOVR1,#50;查找次数送R1MOVA,#14;修正值送AMOV DPTR,#TAB4;表首地址送DPTR,2023/3/18,37,LOOP: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个数据表,2023/3/18,38,4.3.5 查找最值,【例4-7】片内RAM中存放一批数据,查找出最大值并存放于首地址中。设R0中存放首地址,R2中存放字节数。程序如下:MOV R2,n;n为要比较的数据字节数 MOV A,R0;存首地址指针 MOV R1,A DEC R2 MOV A,R1,2023/3/18,39,LOOP:MOV R3,ADEC R1CLR CSUBB A,R1;两个数比较JNC LOOP1;C=0,A中数大,跳LOOP1MOV A,R1;C=1,则大数送ASJMP LOOP2LOOP1:MOV A,R3 LOOP2:DJNZ R2,LOOP;是否比较结束?MOV R0,A;存最大数RET,2023/3/18,40,【例】将内部RAM的30H至3FH单元初始化为00H。,MOV 30H,#00H;,MOV 31H,#00H;,MOV 3EH,#00H;,MOV 3FH,#00H;,2023/3/18,41,4.3.6 循环程序,1循环程序的结构:主要由以下四部分组成。(1)循环初始化完成循环前的准备工作。例如,设置循环控制计数初值、起始地址、变量初值等。(2)循环体完成实际的处理工作,反复执行循环体。(3)循环控制在重复执行循环体的过程中,不断修改循环控制变量,直到符合结束条件,就结束循环体的执行。循环结束的控制方法有计数控制法和条件控制法。(4)循环结束对循环程序执行的结果进行分析、处理和存放。,2023/3/18,42,(1)计数控制法 依据计数器的值来决定循环次数,一般为减1计数器,计数器减到“0”时,结束循环。计数器初值在初始化设定。MCS-51指令系统提供了功能极强的循环控制指令:DJNZ Rn,rel;以工作寄存器作控制计数器 DJNZ direct,rel;以直接寻址单元作控制计数器,2023/3/18,43,【例】将内部RAM的30H至3FH单元初始化为00H。,MAIN:MOV R0,#30H;R0用作地址指针,置地址初值 MOV R7,#16;计数值,16个单元 MOV A,#00H;LOOP:MOV R0,A;循环处理 INC R0;指向下一个单元 DJNZ R7,LOOP;循环 SJMP$;等待,2023/3/18,44,例:对RAM中22H开始的10个单元的数据求和,并将求和的结果放在21H单元中。,CLR A MOV R7,10;计数初值 MOV R0,22H;R0作为数据单元指针 LOOP:ADD A,R0 INC R0 DJNZ R7,LOOP MOV 21H,A,2023/3/18,45,(2)条件控制法 计数控制法只有在循环次数已知的情况下才适用。循环次数未知,不能用循环次数来控制,往往需要根据某种条件来判断是否应该结束循环。条件控制法:设置一个条件,判断是否满足该条件。如满足,则循环结束;如不满足该条件,则循环继续。,2023/3/18,46,【例】将内部RAM起始地址为60H的数据串传送到外部RAM中起始地址为1000H的存储区域,直到发现$字符停止传送。,MAIN:MOV R0,#60H;置初值 MOV DPTR,#1000HLOOP0:MOV A,R0;取数据 CJNE A,#24H,LOOP1;循环结束?SJMP DONE;是LOOP1:MOVX DPTR,A;把A的内容传到片外 INC R0;片内:指向下一个单元 INC DPTR;片外:指向下一个单元 SJMP LOOP0;继续循环 DONE:SJMP DONE;等待,2023/3/18,47,【例4-13】一串字符,依次存放在内部RAM从30H单元开始的单元中,字符串以0AH为结束标志,测试字符串的长度。采用逐个字符依次与“0AH”比较(设置的条件)的方法。设置一个累计字符串长度的计数器和一个指向字符串的指针。如果字符与“0AH”不等,则长度计数器和字符串指针都加1;如果比较相等,则表示该字符为“0AH”,字符串结束,计数器值就是字符串的长度。程序如下:,2023/3/18,48,MOVR4,#0FFH;长度计数器初值送R4MOV R1,#2FH;字符串指针初值送R1NEXT:INC R4INC R1CJNE R1,#0AH,NEXT;比较,不等则进行下一;字符比较END 上面两例都是在一个循环程序中不再包含其他循环程序,则称该循环程序为单重循环。如果一个循环程序中包含了其他循环程序,则称为多重循环。常见的多重循环是由DJNZ指令构成的软件延时程序,是常用程序之一。,2023/3/18,49,【例4-14】50ms的延时程序。在使用12MHz晶振时,一个机器周期为1s,执行一条DJNZ指令的时间为2s。可用多重循环的方法的延时50ms程序:DEL:MOV R7,#200;本指令执行时间1sDEL1:MOV R6,#125;本指令执行时间1sDEL2:DJNZ R6,DEL2;指令执行1次为2s,共;1252 s=250s DJNZ R7,DEL1;指令执行时间2s,本循环体执行125次 RET;指令执行时间2s,2023/3/18,50,以上延时程序不是太精确,把所有指令的执行时间计算在内,其延时时间为1+(1+250+2)200+2s=50.603ms,如要求比较精确的延时,应对上述程序进行修改,才能达到较为精确的延时时间。但要注意,用软件实现延时程序,不允许有中断,否则将严重影响定时的准确性。对于延时更长的时间,可采用多重的循环,如1s延时,可用三重循环。,2023/3/18,51,4.4 子程序及其调用,完成通用功能、反复使用的程序设计成子程序。这样会使程序结构清晰紧凑,便于阅读和调试。,执行要由其它程序来调用,执行完后要返回到调用程序。,子程序调用:ACALL、LCALL;子程序返回:RET。,2023/3/18,52,1子程序的设计原则和应注意的问题编写子程序应注意以下问题:(1)子程序的入口地址,前必须有标号。(2)主程序调用子程序,是通过调用指令来实现。有两条子程序调用指令:绝对调用指令ACALL addr11。双字节,addr11指出了调用的目的地址,PC中16位地址中的高5位不变,被调用的子程序的首地址与绝对调用指令的下一条指令的高5位地址相同,即只能在同一个2KB区内。长调用指令LCALL addr16。三字节,addr16为直接调用的目的地址,子程序可放在64KB程序存储器区任意位置。,2023/3/18,53,(3)子程序结构中必须用到堆栈,用来进行断点和现场的保护。(4)子程序返回主程序时,最后一条指令必须是RET指令,功能是把堆栈中的断点地址弹出送给PC,从而实现子程序返回后从主程序断点处继续执行主程序。(5)子程序可以嵌套,即主程序可以调用子程序,子程序又可以调用另外的子程序。,2023/3/18,54,在子程序中实现,SUB1:PUSH PSW;保护现场(含当前工作寄存器组号)PUSH ACC;PUSH B;MOV PSW,#10H;切换当前工作寄存器组 POP B;恢复现场 POP ACC;POP PSW;内含当前工作寄存器组切换 RET,现场保护与恢复,Thank You!,

    注意事项

    本文(第4章-89S51的汇编语言程序设计课件.ppt)为本站会员(小飞机)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开