单片机原理及应用04第四章程序设计.ppt_第1页
单片机原理及应用04第四章程序设计.ppt_第2页
单片机原理及应用04第四章程序设计.ppt_第3页
单片机原理及应用04第四章程序设计.ppt_第4页
单片机原理及应用04第四章程序设计.ppt_第5页
已阅读5页,还剩160页未读 继续免费阅读

下载本文档

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

文档简介

4.1概述4.2简单程序设计4.3分支程序设计4.4循环程序设计4.54.6子程序设计与堆栈技术4.7实用汇编子程序举例,04第四章,4.1概述,单片机程序设计语言主要有三类:机器语言、汇编语言和高级语言。机器语言(MachineLanguage)是指直接用机器码编写程序、能够为计算机直接执行的机器级语言。机器码是一串由二进制代码“0”和“1”组成的二进制数据,其执行速度快,但是可读性极差。机器语言一般只在简单的开发装置中使用,程序的设计、输入、修改和调试都很麻烦,在实训1和实训3中直接固化或输入的程序都是机器语言程序。,汇编语言(AssemblyLanguage)是指用指令助记符代替机器码的编程语言。汇编语言程序结构简单,执行速度快,程序易优化,编译后占用存储空间小,是单片机应用系统开发中最常用的程序设计语言。汇编语言的缺点是可读性比较差,只有熟悉单片机的指令系统,并具有一定的程序设计经验,才能研制出功能复杂的应用程序,实训4中的3个程序都是用汇编语言设计的。高级语言(High-LevelLanguage)是在汇编语言的基础上用自然语言的语句来编写程序,例如PL/M-51、FranklinC51、MBASIC51等,程序可读性强,通用性好,适用于不熟悉单片机指令系统的的用户。,高级语言编写程序的缺点是实时性不高,结构不紧凑,编译后占用存储空间比较大,这一点在存储器有限的单片机应用系统中没有优势。目前,大多数用户仍然使用汇编语言进行单片机应用系统的软件设计,本章将介绍MCS-51单片机汇编语言的程序设计方法。单片机汇编语言程序设计的基本步骤如下:(1)题意分析。熟悉并了解汇编语言指令的基本格式和主要特点,明确被控对象对软件的要求,设计出算法等。(2)画出程序流程图。编写较复杂的程序,画出程序流程图是十分必要的。程序流程图也称为程序框图,是根据控制流程设计的,它可以使程序清晰,结构合理,便于调试。,(3)分配内存工作区及有关端口地址。分配内存工作区,要根据程序区、数据区、暂存区、堆栈区等预计所占空间大小,对片内外存储区进行合理分配并确定每个区域的首地址,便于编程使用。(4)编制汇编源程序。(5)仿真、调试程序。(6)固化程序。,4.2简单程序设计,简单程序也就是顺序程序,实训4中的程序1就是顺序程序结构,它是最简单、最基本的程序结构,其特点是按指令的排列顺序一条条地执行,直到全部指令执行完毕为止。不管多么复杂的程序,总是由若干顺序程序段所组成的。本节通过实例介绍简单程序的设计方法。例4.14字节(双字)加法。将内部RAM30H开始的4个单元中存放的4字节十六进制数和内部RAM40H单元开始的4个单元中存放的4字节十六进制数相加,结果存放到40H开始的单元中。,例4.1题意分析示意图,(1)题意分析。题目的要求如图所示。,ORG0000HMOVA,30HADDA,40HMOV40H,A;最低字节加法并送结果MOVA,31HADDCA,41HMOV41H,A;第二字节加法并送结果,(2)汇编语言源程序。按照双字节加法的思路,实现4字节加法的源程序如下:,MOVA,32HADDCA,42HMOV42H,A;第三字节加法并送结果MOVA,33HADDCA,43HMOV43H,A;第四字节加法并送结果,进位位在CY中END,显然,上面程序中,每一步加法的步骤很相似,因此我们可以采用循环的方法来编程,使得源程序更加简洁,结构更加紧凑。用循环方法编制的源程序见习题4.3题。例4.2数据拼拆程序。将内部RAM30H单元中存放的BCD码十进制数拆开并变成相应的ASCII码,分别存放到31H和32H单元中。(1)题意分析。题目要求如图所示。,例4.2题意分析示意图,本题中,首先必须将两个数拆开,然后再拼装成两个ASCII码。数字与ASCII码之间的关系是:高4位为0011H,低4位即为该数字的8421码。(2)汇编语言源程序。源程序如下:ORG0000HMOVR0,#30HMOVA,#30HXCHDA,R0;A的低4位与30H单元的低4位交换MOV32H,A;A中的数值为低位的ASCII码,MOVA,R0SWAPA;将高位数据换到低位ORLA,#30H;与30H拼装成ASCII码MOV31H,AEND,4.3分支程序设计,4.3.1分支程序实例1两分支程序设计例4.3两个无符号数比较(两分支)。内部RAM的20H单元和30H单元各存放了一个8位无符号数,请比较这两个数的大小,比较结果显示在实训的实验板上:若(20H)(30H),则P1.0管脚连接的LED发光;若(20H)(30H),则P1.1管脚连接的LED发光。,(1)题意分析。本例是典型的分支程序,根据两个无符号数的比较结果(判断条件),程序可以选择两个流向之中的某一个,分别点亮相应的LED。比较两个无符号数常用的方法是将两个数相减,然后判断有否借位CY。若CY=0,无借位,则XY;若CY=1,有借位,则X9,必须再减7SUBBA,#07HSJMPFINISHSB10:MOVA,BFINISH:POPB;恢复现场POPPSWRET,例4.15二进制数转换为ASCII码,将累加器A中的一位16进制数(A中低4位,x0HxFH)转换成ASCII码,还存放在累加器A中。汇编语言源程序如下:;程序名:BINASC;功能:二进制数转换为ASCII码;;入口参数:要转换的二进制数存在A中;出口参数:转换后的ASCII码存放在A中BINASC:PUSHPSW;保护现场ANLA,#0FH;屏蔽掉高4位PUSHACC;将A暂存堆栈中CLRC;清CY,SUBBA,#0AH;A-10JCLOOP;判断有否借位POPACC;如果没有借位,表示A10ADDA,#37HSJMPFINISHLOOP:POPACC;否则A10ADDA,#30HFINISH:POPPSWRET,4.7.2算术运算子程序单片机指令系统中只提供了单字节二进制数的加、减、乘、除指令,对于多字节数和BCD码的四则运算则必须由用户自己编程实现。例4.1给出了多字节无符号数加法程序,这里再提供一些简单的算术运算的子程序。例4.16单字节十进制数(BCD码)减法程序。已知工作寄存器R6、R7中有两个BCD数,R6中的数作为被减数,R7中的数作为减数,计算两数之差,并将差值存入累加器A中。,(1)题意分析。单片机指令系统中没有十进制减法调整指令,因此我们采用BCD补码运算法则,把减法转换为加法:被减数-减数被减数+减数的补数然后对加法结果进行十进制加法调整。操作步骤如下:求BCD减数的补数公式:9AH-减数。这里的9AH代表两位BCD码的模100。被减数加上减数的补数。对第步的加法之和进行十进制加法调整,调整结果即为所求的减法结果。,(2)汇编语言源程序。;程序名:BCDSUB;功能:单字节十进制数(BCD码)减法;入口参数:被减数存放在R6中,减数存放在R7中;出口参数:差数存放在累加器A中BCDSUB:CLRCMOVA,#9AH;两位BCD模ASUBBA,R7;求减数的补数A,ADDA,R6;被减数+减数的补数ADAA;十进制加法调整CLRC;想一想为什么?RET例4.17双字节无符号数乘法。设被乘数存放在R2、R3寄存器中,乘数存放在R6、R7中,乘积存放在以R0内容为首地址的连续4个单元内。(1)题意分析。我们先用一个具体例子来分析乘法的具体过程:设被乘数=6,乘数=5,相乘公式如下:,110(b2b1b0)101(c2c1c0)110000+11011110把乘数(c=c2c1c0=101)的每一位分别与被乘数(b=b2b1b0=110)相乘,操作过程如下:相乘的中间结果称为部分积,假设为x,y(x保存低位,y保存高位),预设CY=0,x=0,y=0。,c0=1,x=x+b=b2b1b0。x、y右移一位,CYxyCY,把x的低位移入y中,则x=0b2b1,y=b0。c1=0,x=x+000。(5)CYxyCY,x=00b2,y=b1b0。c2=1,x=x+b=00b2+b2b1b0=111,CY=0,y=b1b0=10。右移一次:CYxyCY。乘数的每一位都计算完毕,x和y中的值合起来即为所求乘积。,由以上分析可见,对于三位二进制乘法,部分积x、y也是三位的,这种方法称为部分积右移计算方法。部分积右移算法归纳如下:将存放部分积的寄存器清0,设置计数位数,用来表示乘数位数。从最低位开始,检验乘数的每一位是0还是1,若该位是1,部分积加上被乘数;若该位为0,就跳过去不加。部分积右移1位。判断计数器是否为0,若计数器不为0,重复步骤,否则乘法完成。部分积右移算法的程序流程图如图4.23所示。,图4.23部分积右移算法流程图,(2)汇编语言源程序。;程序名:DMUL;功能:双字节无符号数乘法;入口参数:被乘数存放在R2、R3(R2高位,R3低位)寄存器中乘数存放在R6、R7(R6;高位,R7低位)中;出口参数:乘积存放在R4、R5、R6、R7寄存器中(R4为高位,R7为低位),DMUL:PUSHACC;保护现场PUSHPSWMOVR4,#0;部分积清0MOVR5,#0MOVR0,#16;计数器清0CLRC;CY=0,NEXT:ACALLRSHIFT;部分积右移一位,CYR4R5R6R7CYJNCNEXT1;判断乘数中相应的位是否为0,若是,转移到NEXT1MOVA,R5;否则,部分积加上被乘数(双字节加法)ADDA,R3MOVR5,AMOVA,R4,ADDCA,R2MOVR4,ANEXT1:DJNZR0,NEXT;移位次数是否为0,若不为0转移到NEXTACALLRSHIFT;部分积右移一位POPPSW;恢复现场POPACCRET;程序名:RSHIFT,;功能:部分积右移一位;入口参数:部分积R4、R5、R6、R7;出口参数:CYR4R5R6R7CYRSHIFT:MOVA,R4RRCA;CYR4CYMOVR4,AMOVA,R5RRCA;CYR5CY,MOVR5,AMOVA,R6RRCA;CYR6CYMOVR6,AMOVA,R7RRCA;CYR7CYMOVR7,ARET,例4.1816位8位无符号数除法。被除数存放在R6、R5(R6高8位,R5低8位)中,除数存放在R2中,商存放在R5中,余数存放在R6中。(1)题意分析。与实现双字节乘法的部分积右移算法类似,双字节除法采用部分余数左移的算法。该算法仿照手算的方法编制,基本思想如下:,商数除数被除数-除数;试做减法,够减商上1余数-除数;再试做减法,不够减,商上0,并恢复减法前的余数余数-除数;再做减法手工算法中,习惯将余数右移对齐。在计算机中,保留了手工算法的特点,但采用部分余数左移的方法。部分余数左移算法流程图如图所示。,部分余数左移算法流程图,(2)汇编语言源程序。;程序名:DDIV;功能:16位8位无符号数除法;入口参数:被除数存放在R6、R5(R6高8位,R5低8位)中,除数存放在R2中;出口参数:商存放在R5中,余数存放在R6中;占用资源:位地址单元07H作为标志位暂存单元,DDIV:PUSHPSWMOVR7,#08H;R7为计数器初值寄存器,R7=08HDDIV1:CLRC;清CYMOVA,R5;部分余数左移一位(第一次为被除数移位)RLCA;CYR5R60MOVR5,A,MOVA,R6RLCA

温馨提示

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

评论

0/150

提交评论