第四章程序设计基础ppt课件_第1页
第四章程序设计基础ppt课件_第2页
第四章程序设计基础ppt课件_第3页
第四章程序设计基础ppt课件_第4页
第四章程序设计基础ppt课件_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

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

文档简介

1、第4章 程序设计根底4.1 MCS-51单片机汇编言语的伪指令 MCS-51单片机中除了前面讲述的指令系统中111条指令外,还有另一类指令,这类指 令称为伪指令。例如在程序的开头处有ORG,程序终了处END,等等。这些指令在汇编后 不产活力器码,只是在程序进展汇编时,向汇编软件提供程序中的一些特殊信息。比如,程序起止,定义的数据,表格存放位置等。 下面引见单片机汇编言语程序设计中,常用的伪指令有以下几种:1. 起始伪指令ORG ORG伪指令的功能是规定这条下面源程序和数据的起始地址格式为:ORG Addrl6.例如:ORG 2000H START: MOV A即规定标号START所在地址为20

2、00H,也就是第一条指令从2000H开场存放。普通说来,ORG Addrl6,表示了一个源程序或数据块的起始地址。在一段程序中允许多次运用ORG指令,以规定不同的程序段或数据块的起始位置,并规定地址从小到大,不允许重叠。 2终了伪指令END END伪指令用来指示源程序到此全部终了,在汇编时,当汇编程序检测到源程序中 的该指令时,它就以为源程序曾经到此为止。对END后面的指令都不予汇编。因此一个 源程序只能有一个END语句,且放在整个程序的末尾。 3赋值伪指令EQU 格式:字符称号EQU常数或汇编符号 EQU伪指令的功能是将一个常数和汇编符号赋给字符称号在运用中要留意:1字 符称号不等于标号,不

3、用“:来作分隔符:(2)和MOV传送指令不一样,用EQU赋值的常数和汇编符号,其值在整个程序中有效;(3)运用EQU伪指令时必需先赋值,后运用:(4)用EQU赋过值的符号称号可以用作数据地址,代码地址,位地址或是一个立刻数。可以是8位或16位的。例如:ABC EQU 30HDLY EQU 8034HMOV A, ABCLCALL DLY这里ABC代表了30H的内存单元。DLY定义16位地址,实践是一个子程序的入口地址。4定义字符指令DB 格式:DB 8位二进制常数表DB伪指令的功能是从ROM的指定的地址单元开场存入DB后面的数据,这些数据 可以是用逗号隔开的字节串或括在单引号中的ASCII字符

4、串。例如: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 格式:DW 16位数据表该指令用于从指定地址开场,在程序储存器的延续单元中定义双字节的数据。例如:ORG 1000HTAB:DW 3456H,7BH,10H 汇编后 (1000H)=34H (1001H)=56H(100

5、2H)=00H (1003H)=7BH (1004H)=00H (1005H)=10H 6定义储存空间伪指令DS格式:DS 表达式在汇编时,从指令地址开场保管DS之后表达式的值所规定的储存单元以备后用。例如:ORG 1000HDS 08HDB 30H汇编后,从1000H保管8个单元,然后(1008H)=30H。 留意:以上DB,DW,DS只对程序储存器起作用,它们不能对数据储存器进展初始化。 7位地址符号命令BIT格式:字符名 BIT 位地址 其功能是将BIT之后的位地址值赋给字符名。例如: A1 BIT P1.0 A2 BIT P1.1 SETB A1 ; (P1.0)1 CLR A2 ;

6、(P1.1)04.2 汇编言语程序的根本构造汇编言语程序普通有4种构造方式:顺序构造,分支构造,循环构造利子程序构造。1顺序构造顺序构造是最简单的程序构造,其特点:程序中的语句由前向后顺序执行,直到最后,这种程序中的无分支、循环和子程序调用。2分支程序分支程序是经过条件转移指令实现的,根据程序执行中的条件对程序进展判别,满足 条件那么进展程序转移,不满足条件就顺序执行。对于MCS-51单片机,能实现分支转移的指令有JZ,JNZ,CJNE,DJNZ和位形状条件判别指令JC,JNC,JB,JNB等。这些指令条件判别在指令系统中曾经作了阐明。分支程序又分为单分支和多分支构造: 2分支程序(1)单分支

7、程序。单分支程序都是运用前述的条件转移指令实现的。例4.1:假设内部RAM40H与41H单元中有两个无符号数,现要求将其大者存入40H中,小者存入41H中。2分支程序源程序如下: MOV A, 40H CLR C SUBB A 41H JNC WAIT MOV A, 40H XCH A, 41H MOV 40H,A WAIT: SJMP WAIT 2分支程序例4.2:设变量X存于内部RAM20H单元,函数值Y存于21H单元,试按照下式要求对Y赋值。 X+3 X0 Y= 20 X=0 X X0 流程图如图4.2所示:2分支程序源程序如下: MOV A, 20H JZ ZERO ;(A)=0 JB

8、 ACC.7, STORE ADD A, #03H SJMP STOREZERO: MOV ASTORE:MOV 21H (2) 多分支程序例4.3在某单片机运用系统中,接有一键盘,键值(代表哪个键被按下)存放在内部 RAM的40H单元内。设计一段程序实现如下功能:假设(40H)=00H,调用子程序SUBl;假设(40H)=01H,调用子程序SUB2:假设(40H)=02H,调用子程序SUB3;假设(40H)=03H,调用子程序SUB4;假设(40H)=04H,调用子程序SUB5。 解:先画出本例的表示流程图如图4.3: (2) 多分支程序程序如下: MOV A,40H MOV DPTR, #

9、TABLE RL A ; (A) (A)2 ADD A, 40H JMP A+DPTRTABLE:LCALL SUBl LCALL SUB2 LCALL SUB3 LCALL SUB4 LCALL SUB5上例的这种构造通常又称为散转构造。在本例中,由于LCALL指令是3字节指令,为保证JMP指令执行后能正确调用相应子程序,所以JMP指令前要将(40H)乘3并存入A中。 3循环构造程序设计中,经常需求延续反复执行某段程序,处理这种问题最好采用循环构造的程序来完成,这种设计方法可大大地简化程序。循环程序普通如下四部分组成:置循环初值用来设置循环初值,如:预置变量,计数器数据指针初值等,为循环作预

10、备。循环体循环体指要求反复执行的程序段,经过它完成对数据进展实践处置的义务。 3循环构造修正控制变量普通用一个任务存放器Rn作为对循环次数的计数,每循环一次计数器减一,即修正循环控制变量。 循环控制部分控制循环次数,当循环一定的次数后当满足循环终了条件时,停顿循环。(1)循环次数知的单循环例4.4:设计一段程序,统计累加器A的8位数中1的个数,把结果存入30H单元中。 解题思绪:用RLC指令把A带上Cy循环左移8次,每移一次,判移入Cy的能否为1,假设为1,(30H)+1。流程图如图4.5。 MOV 30H,#00H ;循环初值 MOV R2, #08H LOOP:RLC A JNC NEXT

11、 INC 30HNEXT: DJNZ R2(2). 条件控制的单重循环例4.5设字符串存放在RAM31H开场的单元中,以“$作为终了标志,现要求计算该字符串的长度,并将其存放在20H中。 程序如下: CRL A MOV R0,#31HLOOP: CJNE R0,#24H,NEXT ;与“$(ASCII值为十六进制24)比较 SJMP COMP ;找到“$终了NEXT: INC A ;不为“$那么计数器加1 INC R0 ;修正地址指针 SJMP LOOPCOMP: MOV 20H,A ;存结果4子程序 1子程序的概念 在程序设计中,经常发生一些程序段被频繁运用,如一些数学函数的计算,二十进制转

12、换,显示程序,延时程序等,为了防止反复节省内存,常把这些程序作为一种独立的,规范化的通用程序段,供需求时调用,这些独立程序段称为子程序。 主程序可以经过专门的指令来调用子程序,称子程序调用。当子程序执行终了后,再由返主指令,前往到原程序,并带回结果。2子程序设计几点留意 l子程序的第一条指令地址称为子程序的入口地址。该指令前必需求有标志,标号最 好以子程序功能命名,以便主程序调用,这样会一目了然,例如延时程序常以DELAY作为标号。l主程序调用子程序是经过LCALL、ACALL指令完成的。例如LCALL DELAY执 行调用延时子程序,子程序前往主程序是经过执行RET指令来完成的。l子程序内部

13、假设有控制转移指令,最好运用相对转移指令,以便汇编时生成不随子 程序的存放地址改动而改动的代码,子程序可以存放ROM空间的恣意位置。l 在子程序开场部分要留意现场维护,在退出子程序之前要恢复现场。维护现场和恢 复现场操作普通用PUSH和POP指令完成,要遵守“先进后出、后入先出的原那么。2子程序设计几点留意在子程序运转时,不可防止地要改动一些存放器或数据存储器的内容,有时这些内容是主程序不可短少的,因此,在子程序调用时,应该先将有关存放器或存储器的内容维护起来,子程序前往前再恢复原来的内容,这一过程称为现场的维护与恢复。现场维护通常由堆栈来完成,在子程序的开场部分运用压栈指令,将需求维护的内容

14、压入堆栈;在子程序前往前经过出栈指令,将原有的内容弹出堆栈,送到原来的存放器或存储器单元中,从而实现了现场维护与恢复。3子程序参数传送 调用子程序时,主程序应把子程序运用的有关参数送入商定的位置,子程序运转时,可以从商定的位置得到有关的参数,这类由主程序提供应予子程序的参数叫做入口参数。同样,在子程序终了前,也应把运算结果送到指定的位置,前往主程序后,主程序可以从指定的位置得到需求的结果,这类由子程序前往主程序的参数叫做入口参数。实现参数传送有多种方法,常用的方法有以下三种:3子程序参数传送1) 用任务存放器或累加器传送参数。数据经过R0-R7或累加器A来传送。在调用前,先将数据送入存放器或者

15、累加器,供子程序运用。子程序执行后结果参数仍由存放器和累加器送回。其优点是程序简单,速度快。缺陷是传送的参数不能太多。2) 用指针存放器传送参数。为了能传送较多的数据,可以运用指针存放器传送参数。由于数据通常是存放在存储器中,可用指针来指示数据的位置,并可实现变长度运算。假设数据在内部RAM中,可以用R0或R1作为数据指针,假设参数在外部RAM中,可以运用DPTR作指针。3) 用堆栈传送参数。运用堆栈进展参数传送时,主程序运用PUSH指令把参数压入堆栈,进入子程序后可以经过堆栈指针POP指令来间接访问堆栈中的参数。同样,子程序的出口参数也可用堆栈传送给主程序。请留意,在调用子程序时,断点地址自

16、动进栈,占用两个单元,在于程序中弹出参数时,不要把断点地址也弹出。另外,在执行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

17、:将RAM中30H单元中二进制数转换为3位BCD码格式的十进制数,2位BCD码占用2个字节单元,即百位数BCD码放在32H单元中,十位和个位BCD码放在31H单元中。2将二进制数转成ASCII码例4.8:将A中的二进制数(0-F)转化为相应的ASCII码CNV: ADD A,#90HDA AADC A,#40HDA ARET假设执行ADD A,#90H和DA A两条指令后产生进位,那么阐明被转换二进制数不大于09H,否那么小于0AH,后两条指令在于产生正确的高位ASCII代码;二进制数大于09H时为4H;二进制数大于0AH时为3H。3BCD码十进制转换成二进制例4.9:假设在内部RAM中40H

18、单元内存中存有一个BCD十进制数,设计一段程序把这个数转换成二进制数,并存入41H单元中。用(40H)16,商就是二进制数的高4位,余数就是二进制数的低4位,把这高、低4位组合,便是对应的二进制数。程序如下: MOV A,40H MOV B,#16 DIV AB SWAP A ADD A,B MOV 41H,A 4.3.2 算术和逻辑运算类程序设计1多字节加减运算利用ADDCSUBB指令及Cy标志位,能实现多字节的加减运算。运算时,从低字 节到高字节顺序进展。假设参与运算是无符号数,在产生进位(加法)或借位(减法)时,将置位Cy。假设参与运算的是有符号补码,因原始输入的数据最高位为符号位,故溢

19、出标志OV将指示溢出的情况。例4.10有二个多字节数相减,被减数的最低字节以R0为指针,减数的最低字节以R1为指针,数据长度由R2指示。减法结果送入原被减数所在的各单元。最后检查能否有溢出。程序如下: SUBSTR:CLR C;清借位 SUBSI: MOV A,R0;取被减数字节 SUBB A,R1 ;取减数字节 MOV R0, A ;存差字节 INC R0;指向下一个字节 INC R1 DJNZ R2, SUBSI ;循环能否完成 JB OV, OVFU ;判溢出 RET ;OV=0,无溢出,前往 OVFU:(溢出处置) ;OV=1溢出 RET 2查找最大值例4.11:在内部RAM 30H-

20、37H单元中存有8个无符号数,设计一段程序找出其中最大值存入40H中。 首先取(30H),40H,后继的字节取到A中将(A)与(40H)比较,将大数存入(40H)中。程序如下: 2查找最大值3延时程序在单片机运用程序中,经常需求延时来到达控制目的。实现延时有两种方法:一种采用内部定时计数器来实现。在以后章节中表达:另一种是采用软件延时方法。下面来引见软件延时。例4.12:知单片机的晶振频率fosc=12MHz,试计算执行下面程序需求多少时间? DLYl: MOV R2,#data ;执行时需1个机器周期 LOOP: NOP ;执行时需1个机器周期 DJNZ R2 LOOP ;执行时需2个机器周

21、期 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当

22、datal和data2都取01H时,延时时间最短,T=9s;当datal和data2都取00H时,延时时间最长,T=197379s。 4.3.3 查表程序设计在单片机运用系统中,查表程序的设计广泛用于LED显示的段码控制,数据计算,代码转换等各种场所。 查表,首先在内存中建立一个表格,表格中的数据可以经过DB,DW伪指令来实现,然后,根据自变量X,经过查表指令,在表格中查找与其有某种关系的Y值。查表指令有如下两条: MOVC A, A+DPTR MOVC A A+PC (1) 用DPTR作为基地址的查表方法 先将所查的表格首地址存入DPTR中 将访问项的偏移值存入A 采用MOVC A,A+DPTR (2) 用PC作为基地址的查表方法 以PC为根底的方式用于较小部分的表格,它具有不影响数据指针的优点,对于 中断效力程序或数据指针DPTR不允许改动的场所,它的方法是: 先将欲查访表的项数装入累加器A中; 再将计算查表指令所在地址(该地址+1)到表首地址的偏移量,再加到累加器A中 执行MOVC A A+PC指令,将查表内容取出送入A中 例4.14:计算在R3存

温馨提示

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

评论

0/150

提交评论