欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    第四章程序设计基础.pptx

    • 资源ID:96719578       资源大小:327.78KB        全文页数:51页
    • 资源格式: PPTX        下载积分:10金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要10金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

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

    第四章程序设计基础.pptx

    第4章程序设计基础4.1MCS-51单片机汇编语言的伪指令MCS-51单片机中除了前面讲述的指令系统中111条指令外,还有另一类指令,这类指令称为伪指令。例如在程序的开头处有ORG,程序结束处END,等等。这些指令在汇编后不产生机器码,只是在程序进行汇编时,向汇编软件提供程序中的一些特殊信息。比如,程序起止,定义的数据,表格存放位置等。下面介绍单片机汇编语言程序设计中,常用的伪指令有以下几种:1.起始伪指令起始伪指令ORGORG伪指令的功能是规定这条下面源程序和数据的起始地址格式为:ORGAddrl6.例如:ORG2000HSTART:MOVA即规定标号START所在地址为2000H,也就是第一条指令从2000H开始存放。一般说来,ORGAddrl6,表示了一个源程序或数据块的起始地址。在一段程序中允许多次使用ORG指令,以规定不同的程序段或数据块的起始位置,并规定地址从小到大,不允许重叠。2结束伪指令ENDEND伪指令用来指示源程序到此全部结束,在汇编时,当汇编程序检测到源程序中的该指令时,它就认为源程序已经到此为止。对END后面的指令都不予汇编。因此一个源程序只能有一个END语句,且放在整个程序的末尾。3赋值伪指令赋值伪指令EQU格式:字符名称EQU常数或汇编符号EQU伪指令的功能是将一个常数和汇编符号赋给字符名称在使用中要注意:(1)字符名称不等于标号,不用“:”来作分隔符:(2)和MOV传送指令不一样,用EQU赋值的常数和汇编符号,其值在整个程序中有效;(3)使用EQU伪指令时必须先赋值,后使用:(4)用EQU赋过值的符号名称可以用作数据地址,代码地址,位地址或是一个立即数。可以是8位或16位的。例如:ABCEQU30HDLYEQU8034HMOVA,ABCLCALLDLY这里ABC代表了30H的内存单元。DLY定义16位地址,实际是一个子程序的入口地址。4定义字符指令定义字符指令DB格式:DB8位二进制常数表DB伪指令的功能是从ROM的指定的地址单元开始存入DB后面的数据,这些数据可以是用逗号隔开的字节串或括在单引号中的ASCII字符串。例如:ORG 2000HDB 54HTAB:DB 0B7H 34H 96HSTR:DB 6AB4定义字符指令定义字符指令DB经汇编后:(2000H)=54H(2001H)=B7H(2002H)=34H(2003H)=96H(2004H)=36H(2005H)=41H(2006H)=42H 其中36H,41H,42H分别是6、A、B的ASCII编码值。5定义字伪指令定义字伪指令DW格式:DW16位数据表该指令用于从指定地址开始,在程序储存器的连续单元中定义双字节的数据。例如:ORG 1000HTAB:DW 3456H,7BH,10H 汇编后(1000H)=34H (1001H)=56H(1002H)=00H (1003H)=7BH(1004H)=00H (1005H)=10H 6定义储存空间伪指令定义储存空间伪指令DS格式:DS表达式在汇编时,从指令地址开始保留DS之后表达式的值所规定的储存单元以备后用。例如:ORG1000HDS08HDB30H汇 编 后,从 1000H保 留 8个 单 元,然 后(1008H)=30H。注意:以上DB,DW,DS只对程序储存器起作用,它们不能对数据储存器进行初始化。7位地址符号命令位地址符号命令BIT格式:字符名BIT位地址其功能是将BIT之后的位地址值赋给字符名。例如:A1BITP1.0A2BITP1.1SETBA1;(P1.0)1CLRA2;(P1.1)04.2 汇编语言程序的基本结构汇编语言程序的基本结构汇编语言程序一般有4种结构形式:顺序结构,分支结构,循环结构利子程序结构。1顺序结构顺序结构顺序结构是最简单的程序结构,其特点:程序中的语句由前向后顺序执行,直到最后,这种程序中的无分支、循环和子程序调用。2分支程序分支程序分支程序是通过条件转移指令实现的,根据程序执行中的条件对程序进行判断,满足条件则进行程序转移,不满足条件就顺序执行。对于MCS-51单片机,能实现分支转移的指令有JZ,JNZ,CJNE,DJNZ和位状态条件判断指令JC,JNC,JB,JNB等。这些指令条件判断在指令系统中已经作了说明。分支程序又分为单分支和多分支结构:2分支程序分支程序(1)单分支程序。单分支程序都是使用前述的条件转移指令实现的。例4.1:假设内部RAM40H与41H单元中有两个无符号数,现要求将其大者存入40H中,小者存入41H中。2分支程序分支程序源程序如下:MOVA,40HCLRCSUBBA41HJNCWAITMOVA,40HXCHA,41HMOV40H,AWAIT:SJMPWAIT2分支程序分支程序例4.2:设变量X存于内部RAM20H单元,函数值Y存于21H单元,试按照下式要求对Y赋值。X+3X0Y=20X=0XX0流程图如图4.2所示:2分支程序分支程序源程序如下:MOVA,20HJZZERO;(A)=0JBACC.7,STOREADDA,#03HSJMPSTOREZERO:MOVASTORE:MOV21H(2)多分支程序例4.3在某单片机应用系统中,接有一键盘,键值(代表哪个键被按下)存放在内部RAM的40H单元内。设计一段程序实现如下功能:如果(40H)=00H,调用子程序SUBl;如果(40H)=01H,调用子程序SUB2:如果(40H)=02H,调用子程序SUB3;如果(40H)=03H,调用子程序SUB4;如果(40H)=04H,调用子程序SUB5。解:先画出本例的示意流程图如图4.3:(2)多分支程序程序如下:MOVA,40HMOVDPTR,#TABLERLA;(A)(A)2ADDA,40HJMPA+DPTRTABLE:LCALLSUBlLCALLSUB2LCALLSUB3LCALLSUB4LCALLSUB5上例的这种结构通常又称为散转结构。在本例中,由于LCALL指令是3字节指令,为保证JMP指令执行后能正确调用相应子程序,所以JMP指令前要将(40H)乘3并存入A中。3循环结构循环结构程序设计中,经常需要连续重复执行某段程序,解决这种问题最好采用循环结构的程序来完成,这种设计方法可大大地简化程序。循环程序一般如下四部分组成:置循环初值用来设置循环初值,如:预置变量,计数器数据指针初值等,为循环作准备。循环体循环体指要求重复执行的程序段,通过它完成对数据进行实际处理的任务。3循环结构循环结构修改控制变量一般用一个工作寄存器Rn作为对循环次数的计数,每循环一次计数器减一,即修改循环控制变量。循环控制部分控制循环次数,当循环一定的次数后当满足循环结束条件时,停止循环。(1)循环次数已知的单循环例4.4:设计一段程序,统计累加器A的8位数中1的个数,把结果存入30H单元中。解题思路:用RLC指令把A带上Cy循环左移8次,每移一次,判移入Cy的是否为1,若为1,(30H)+1。流程图如图4.5。MOV30H,#00H;循环初值MOVR2,#08HLOOP:RLCAJNCNEXTINC30HNEXT:DJNZR2(2).条件控制的单重循环例4.5设字符串存放在RAM31H开始的单元中,以“$”作为结束标志,现要求计算该字符串的长度,并将其存放在20H中。程序如下:CRLAMOVR0,#31HLOOP:CJNER0,#24H,NEXT;与“$”(ASCII值为十六进制24)比较SJMPCOMP;找到“$”结束NEXT:INCA;不为“$”则计数器加1INCR0;修改地址指针SJMPLOOPCOMP:MOV20H,A;存结果4子程序子程序(1)子程序的概念在程序设计中,经常发生一些程序段被频繁使用,如一些数学函数的计算,二十进制转换,显示程序,延时程序等,为了避免重复节省内存,常把这些程序作为一种独立的,标准化的通用程序段,供需要时调用,这些独立程序段称为子程序。主程序可以通过专门的指令来调用子程序,称子程序调用。当子程序执行完毕后,再由返主指令,返回到原程序,并带回结果。(2)子程序设计几点注意l子程序的第一条指令地址称为子程序的入口地址。该指令前必须要有标志,标号最好以子程序功能命名,以便主程序调用,这样会一目了然,例如延时程序常以DELAY作为标号。l主程序调用子程序是通过LCALL、ACALL指令完成的。例如LCALLDELAY执行调用延时子程序,子程序返回主程序是通过执行RET指令来完成的。l子程序内部如果有控制转移指令,最好使用相对转移指令,以便汇编时生成不随子程序的存放地址改变而改变的代码,子程序可以存放ROM空间的任意位置。l在子程序开始部分要注意现场保护,在退出子程序之前要恢复现场。保护现场和恢复现场操作一般用PUSH和POP指令完成,要遵守“先进后出、后入先出”的原则。(2)子程序设计几点注意在子程序运行时,不可避免地要改变一些寄存器或数据存储器的内容,有时这些内容是主程序不可缺少的,因此,在子程序调用时,应该先将有关寄存器或存储器的内容保护起来,子程序返回前再恢复原来的内容,这一过程称为现场的保护与恢复。现场保护通常由堆栈来完成,在子程序的开始部分使用压栈指令,将需要保护的内容压入堆栈;在子程序返回前通过出栈指令,将原有的内容弹出堆栈,送到原来的寄存器或存储器单元中,从而实现了现场保护与恢复。(3)子程序参数传递调用子程序时,主程序应把子程序使用的有关参数送入约定的位置,子程序运行时,可以从约定的位置得到有关的参数,这类由主程序提供给予子程序的参数叫做入口参数。同样,在子程序结束前,也应把运算结果送到指定的位置,返回主程序后,主程序可以从指定的位置得到需要的结果,这类由子程序返回主程序的参数叫做入口参数。实现参数传递有多种方法,常用的方法有以下三种:(3)子程序参数传递1)用工作寄存器或累加器传递参数。数据通过R0-R7或累加器A来传递。在调用前,先将数据送入寄存器或者累加器,供子程序使用。子程序执行后结果参数仍由寄存器和累加器送回。其优点是程序简单,速度快。缺点是传递的参数不能太多。2)用指针寄存器传递参数。为了能传递较多的数据,可以使用指针寄存器传递参数。由于数据通常是存放在存储器中,可用指针来指示数据的位置,并可实现变长度运算。若数据在内部RAM中,可以用R0或R1作为数据指针,若参数在外部RAM中,可以使用DPTR作指针。3)用堆栈传递参数。使用堆栈进行参数传递时,主程序使用PUSH指令把参数压入堆栈,进入子程序后可以通过堆栈指针POP指令来间接访问堆栈中的参数。同样,子程序的出口参数也可用堆栈传递给主程序。请注意,在调用子程序时,断点地址自动进栈,占用两个单元,在于程序中弹出参数时,不要把断点地址也弹出。另外,在执行RET指令时,要自动弹出断点地址,以便正确返回。(3)子程序参数传递例4.6利用累加器传递参数设有一个从21H开始存放的数据块,每个单元均有一个十六进制数(0-F),数据块长度存放在20H中,编程将他们转化为相应ASCII码,并存放在41H开始的单元中。根据ASCII码表,0-9的ASCII码为30H-39H,即只要加上30H就可得到相应ASCII码,而A-F的ASCII码为41H-46H,即只要加上37H也可得到相应的ASCII码。4.3实用程序设计举例4.3.1数制转换程序1二进制转换成BCD码十进制例4.7:将RAM中30H单元中二进制数转换为3位BCD码格式的十进制数,2位BCD码占用2个字节单元,即百位数BCD码放在32H单元中,十位和个位BCD码放在31H单元中。2将二进制数转成ASCII码例4.8:将A中的二进制数(0-F)转化为相应的ASCII码CNV:ADDA,#90HDAAADCA,#40HDAARET如果执行ADDA,#90H和DAA两条指令后产生进位,则说明被转换二进制数不大于09H,否则小于0AH,后两条指令在于产生正确的高位ASCII代码;二进制数大于09H时为4H;二进制数大于0AH时为3H。3BCD码十进制转换成二进制例4.9:假设在内部RAM中40H单元内存中存有一个BCD十进制数,设计一段程序把这个数转换成二进制数,并存入41H单元中。用(40H)16,商就是二进制数的高4位,余数就是二进制数的低4位,把这高、低4位组合,便是对应的二进制数。程序如下:MOVA,40HMOVB,#16DIVABSWAPAADDA,BMOV41H,A4.3.2算术和逻辑运算类程序设计1多字节加减运算利用ADDCSUBB指令及Cy标志位,能实现多字节的加减运算。运算时,从低字节到高字节顺序进行。若参与运算是无符号数,在产生进位(加法)或借位(减法)时,将置位Cy。若参与运算的是有符号补码,因原始输入的数据最高位为符号位,故溢出标志OV将指示溢出的情况。例4.10有二个多字节数相减,被减数的最低字节以R0为指针,减数的最低字节以R1为指针,数据长度由R2指示。减法结果送入原被减数所在的各单元。最后检查是否有溢出。程序如下:SUBSTR:CLRC;清借位SUBSI:MOVA,R0;取被减数字节SUBBA,R1;取减数字节MOVR0,A;存差字节INCR0;指向下一个字节INCR1DJNZR2,SUBSI;循环是否完成JBOV,OVFU;判溢出RET;OV=0,无溢出,返回OVFU:(溢出处理);OV=1溢出RET2查找最大值例4.11:在内部RAM30H-37H单元中存有8个无符号数,设计一段程序找出其中最大值存入40H中。首先取(30H),40H,后继的字节取到A中 将(A)与(40H)比 较,将 大 数 存 入(40H)中。程序如下:2查找最大值3延时程序在单片机应用程序中,经常需要延时来达到控制目的。实现延时有两种方法:一种采用内部定时计数器来实现。在以后章节中叙述:另一种是采用软件延时方法。下面来介绍软件延时。例4.12:已知单片机的晶振频率fosc=12MHz,试计算执行下面程序需要多少时间?DLYl:MOVR2,#data;执行时需1个机器周期LOOP:NOP;执行时需1个机器周期DJNZR2LOOP;执行时需2个机器周期RET;执行时需2个机器周期解:因为晶振为12MHz,所以1个机器周期=1s,综合计算执行上段程序的时间为:T=(1+(1+2)data+2)1s当 data1=01H,延 时 时 间 最 短,T=6s;data=00H (相当于256),延时时间最长,T=771s。在使用中,若需要加长延时时间,可增加NOP例4.13:假设单片机晶振频率fosc=12MHz,试计算执行下面程序需要多少时间?这是一个双重循环程序,LOOPl是外层循环,循环次数为data1,LOOP2是内层循环,循环次数为data2。执 行 该 段 程 序 时 间 T=(1+(1+2)data2+2)datal+2)1s当datal和data2都取01H时,延时时间最短,T=9s;当datal和data2都取00H时,延时时间最长,T=197379s。4.3.3查表程序设计在单片机应用系统中,查表程序的设计广泛用于LED显示的段码控制,数据计算,代码转换等各种场合。查表,首先在内存中建立一个表格,表格中的数据可以通过DB,DW伪指令来实现,然后,根据自变量X,通过查表指令,在表格中查找与其有某种关系的Y值。查表指令有如下两条:MOVCA,A+DPTRMOVCAA+PC(1)用DPTR作为基地址的查表方法先将所查的表格首地址存入DPTR中将访问项的偏移值存入A采用MOVCA,A+DPTR(2)用PC作为基地址的查表方法以PC为基础的形式用于较小局部的表格,它具有不影响数据指针的优点,对于中断服务程序或数据指针DPTR不允许改变的场合,它的方法是:先将欲查访表的项数装入累加器A中;再将计算查表指令所在地址(该地址+1)到表首地址的偏移量,再加到累加器A中 执行MOVC A A+PC指令,将查表内容取出送入A中 例4.14:计算在R3存放的十进制形式(用二位BCD码)的平方值注意:采用MOVCA,A+PC指令查表时,表长度不能超过255个字节。TAB表中的存放数的平方是事先计算出来的。例4.15:某控制系统的键盘扫描程序,要求根据按下的键值(0,1,2,9)转换成对应的双字节命令入口地址要求对应关系如下:思考题与习题4.1从内部RAM的30H单元开始存放一组用补码表示的带符号数,其数目已存放在20H单元。编写程序统计出其中正数、0和负数的数目,并将结果分别存入21H、22H、23H单元。4.2内部RAM中有一数据块,存放在20H-2FH单元中。要求对这些数据进行奇偶校验,凡是满足奇偶校验的数据(1的个数为偶数)都要转存到外部RAM8000H开始的数据区中。试编写有关程序。4.3编写程序,把外部RAM1000H-10FFH区域内的数据逐个搬到从2000H单元开始的区域。4.4从内部RAM的30H单元开始存放着一组无符号数,其数目存放在21H单元中。试编写程序,求出这组无符号数中的最小的数,并将其存入20H单元。4.5设计一个循环系统,如图3-11所示。单片机的P1口并行输出驱动8个光二级管。试编写程序,使这些发光二级管每次只点亮一个,循环左移或右移,一个接一个地亮,循环不止。思考题与习题四4.6设计一段程序实现如下功能:把片内RAM30H-3FH单元中的16个数的存放顺序颠倒过来。4.7设计一段程序实现如下功能:找出从片内RAM30H开始的16个单元中最小值所在的单元,并将该单元的内容改成0FFH。4.8编写一段程序实现逻辑运算:P1.7=P1.6(P1.5P1.4)。4.9设计一段程序实现如下功能:统计出从片内RAM30H开始的16个单元中有多少数大于40小于80,并把结果存入40H单元中。

    注意事项

    本文(第四章程序设计基础.pptx)为本站会员(uij****hh)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

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




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开