单片机培训四汇编语言程序设计课件

PPT
  • 阅读 44 次
  • 下载 0 次
  • 页数 70 页
  • 大小 1.132 MB
  • 2022-11-24 上传
  • 收藏
  • 违规举报
  • © 版权认领
下载文档30.00 元 加入VIP免费下载
此文档由【小橙橙】提供上传,收益归文档提供者,本网站只提供存储服务。若此文档侵犯了您的版权,欢迎进行违规举报版权认领
单片机培训四汇编语言程序设计课件
可在后台配置第一页与第二页中间广告代码
单片机培训四汇编语言程序设计课件
可在后台配置第二页与第三页中间广告代码
单片机培训四汇编语言程序设计课件
可在后台配置第三页与第四页中间广告代码
单片机培训四汇编语言程序设计课件
单片机培训四汇编语言程序设计课件
还剩10页未读,继续阅读
【这是免费文档,您可以免费阅读】
/ 70
  • 收藏
  • 违规举报
  • © 版权认领
下载文档30.00 元 加入VIP免费下载
文本内容

【文档说明】单片机培训四汇编语言程序设计课件.ppt,共(70)页,1.132 MB,由小橙橙上传

转载请保留链接:https://www.ichengzhen.cn/view-44742.html

以下为本文档部分文字说明:

1第4章汇编语言程序设计周剑峰2汇编语言简介汇编语言格式计算机所能执行的每条指令都对应一组二进制代码。为了容易理解和记忆计算机的指令,人们用一些英语的单词和字符以及数字作为助记符来描述每一条指令的功能。用助记符描述的指

令系统,称为机器的汇编语言系统,简称汇编语言。汇编语言也是面向机器的,每种计算机系统也都有它自己的汇编语言,用汇编语言编写的程序,称为汇编语言源程序或汇编源程序。由2~5个英文字母组成的助记符至少一个空格用“,”隔开,

操作个数可为无,1,2,3由操作助记符和操作数字段组成汇编指令指能汇编成机器语言代码的指令。格式:操作码[操作数1],[操作数2],[操作数3]3汇编伪指令伪指令:汇编时不产生机器语言代码的指令,仅提供汇编控制信息。一、定位伪指令ORGmm:一般为十六进制数。m指出

在该伪指令后的指令的汇编地址,即生成的机器指令起始存贮器地址。显然,当使用多条ORGm伪指令时,应注意其后生成的机器指令存放地址不应重叠。例如:ORG0START:SJMPMAINORG0BHLJMPPTFOORG4

0HMAIN:4二、定义字节伪指令[标号:]DBX1、X2…Xn例如:ORG1000HDB0AAHSR-DATA:DB25,25HDZX-DATA:DB'MCS-51'经汇编后,从地址1000H处

存贮器的内容为:(1000H)=AAH(1001H)=19H(1002H)=25H(1003H)=4DH(1004H)=43H(1005H)=53H(1006H)=2DH(1007H)=35H(1008H)=31H5三、字定义伪指令[标号:]DWY1、Y2…Yn通知汇编程序从当

前ROM地址开始,保留存贮单元,并存入DW后面的数据。存放时高8位在前,低8位在后。例如:ORG1000HDW1234HSR_DATA:DW56H,2000经汇编后,从地址1000H处存贮器的内容为:(1000H)=12H(100

1H)=34H(1002H)=00H(1003H)=56H(1004H)=07H(1005H)=D0H6四、EQU赋值伪指令字符名称EQU项(数或汇编符号)EQU伪指令是把“项”赋给“字符名称”,注意这里的“字符名称”不同于标号(其后没有冒号),但它是必须的。用EQU赋过值的符号名可以用作

数据地址、代码地址、位地址或是一个立即数。例如:AAEQUR1MOVA,AAD10EQU10ADD_YEQU07ABHMOVA,D10LCALLADD_Y7五、DS定义存贮空间伪指令DS表达式在汇编时,从指定地址开始保留DS之后“

表达式”的值所规定的存贮单元。例如:ORG1000HDS07HDB20H,20DW12H经汇编后,从地址1000H开始保留7个单元,然后从1007H处存贮器的内容为:(1007H)=20H(1008H)=14H

(1009H)=00H(100AH)=12H8六、DATA数据地址赋值伪指令字符名称DATA表达式这里的“字符名称”与标号不同(其后没有冒号),但它是必须的,其功能是把“表达式”的值赋给左边的“字符名称”。DATA伪指令与EQ

U伪指令的主要区别是:EQU定义的“字符名称”必须先定义后使用,而DATA定义的“字符名称”没有这种限制,故DATA伪指令通常用在源程序的开头或末尾。例如:ORG0100HAADATA35HDPTRADATA0AA00HMOVA,AA;(35H)A

MOVDPTR,#DPTRA;0AA00HDPTR9七、BIT定义位地址符号伪指令字符名称BIT位地址这里的“字符名称”与标号不同(其后没有冒号),但它是必须的,其功能是把BIT之后的“位地址”值赋给“字符名称”。例如:P11BITP1.

1A2BIT02HMOVC,P11MOVA2,C八、汇编结束伪指令END—指出汇编结束,其后即使还有指令,汇编程序也不作处理。10汇编语言程序设计汇编语言程序设计方法程序设计步骤根据设计任务要求,采用汇编语言编制程序的过程。应用程序

设计步骤:1.拟定任务书2.建立数学模型3.建立算法4.绘制程序流程图5.编制汇编语言源程序6.上机调试注意:汇编调试需要多次试验,往往调试占整个任务的大部分时间11程序设计要求及基本方法可靠性高、可读性

好、效率高、占用存储容量小和执行速度快②汇编程序结构设计的基本方法:①汇编程序结构设计的基本要求:1.顺序程序的设计2.分支程序设计3.循环程序设计4.子程序设计5.查表程序设计6.散转程序设计12一、顺序程序•顺序程序是最简单的程序结构,在顺序程序中没有任何的转移指令,以下是一

个典型的例子。•例1:字节(双字)加法。将内部RAM30H开始的4个单元中存放的4字节十六进制数和内部RAM40H单元开始的4个单元中存放的4字节十六进制数相加,结果存放到40H开始的单元中。(如0a0ab234fh存放在片内RAM30h开始的4个单元如图所示)30H31

H33H32H加数1存放处4FH23HABHA0H13题意分析示意图(1)题意分析。题目的要求如图所示。30H31H33H32H加数1存放处4FH23HABHA0H43H42H41H40H7BH56H80HE8H加数2存放处43H42H41H40HCAH79H2BH

89H相加结果存放处+A0AB234FE880567B892B79CA114ORG0200HMOVA,30HADDA,40HMOV40H,A;最低字节加法并送结果MOVA,31HADDCA,41HMOV41H,A;第二字节加法并送结果(2)汇编语言源程

序。按照双字节加法的思路,实现4字节加法的源程序如下:15MOVA,32HADDCA,42HMOV42H,A;第三字节加法并送结果MOVA,33HADDCA,43HMOV43H,A;第四字节加法并送结果,进位位在CY中SJMP$END

16分支程序分支程序可以分为:单分支双分支多分支17单分支单分支程序的基本结构:条件成立?程序段下条指令NY18双分支双分支程序的基本结构:程序段1条件成立?程序段2NY19多分支多分支程序的基本结构:程序段

2条件N=?程序段N-10N程序段1程序段N1N-1……20例:如图所示,设计一段程序实现功能:如果(A)中1的个数为奇数,所有的二极管发光;如果全0,则只让VD0-VD3发光;否则全灭。单分支程序举例E

A/VP31X119X218RESET9INT012INT113T014T115P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P0.039P0.138P0.237P0.336P0.435P0.534P0.633P0.732

P2.021P2.122P2.223P2.324P2.425P2.526P2.627P2.728RD17WR16PSEN29ALE/P30TXD11RXD10AT89C51C230pFC330pFY16.000MHZGNDVD1VD2VD3VD4VD5V

D6VD7R2330R3330R4330R5330R6330R7330R8330R9330GNDR110K+C147uFGNDVCCVCCVD021开始位P=1?(A)=0?P2FFHP200HP20FH结束YYNNORG0200HJBP,JISHUJ

ZQUANMOVP2,#00HSJMPTOendJISHU:MOVP2,#0FFHSJMPTOendQUAN:MOVP2,#0FHTOend:SJMP$END流程图:源程序:判断奇偶标志位的值判断(A)的值是否为0(A

)有偶数个1,二极管灭(A)有奇数个1,二极管全亮(A)为0,VD0-VD3亮注意:在MCS-51单片机中,实现单分支常用的指令有:JZ、JNZ、DJNZ、CJNE、JC、JNC、JB、JNB、JBC等。虚线框代表一个单分支22双分支程序设计例:内部RAM的40H单元和50H单元各存放了一

个8位无符号数,请比较这两个数的大小,比较结果用发光二极管显示(LED为低有效):若(40H)≥(50H),则P1.0管脚连接的LED1发光;若(40H)<(50H),则P1.1管脚连接的LED2发光。23题意分析:本例是

典型的分支程序,根据两个无符号数的比较结果(判断条件),分别点亮相应的发光二极管。比较两个无符号数常用的方法是将两个数相减,然后判断有否借位CY。若CY=0,无借位,则X≥Y;若CY=1,有借位,则X<Y。

程序的流程图如下图所示。24两数比较流程图X-YX≥Y,LED1点亮CY=1?X<Y,YNLED2点亮开始结束25源程序如下:XDATA40H;数据地址赋值伪指令DATAYDATA50HORG1000HMOVA,X;(X)→ACLRC;CY=0SUBBA,Y;带借位减法,A-

(Y)-CY→A26JCL1;CY=1,转移到L1CLRP1.0;CY=0,(40H)≥(50H),点亮P1.0连接的LED1SJMPFIN;直接跳转到结束等待L1:CLRP1.1;(40H)<(50H),点亮P1.1接的LED2FIN:

SJMP$END27多分支程序举例例:在某单片机系统中,按下一按键,键值(代表哪个键被按下)存放在内部RAM的40H单元内。设计一段程序实现功能:如果(40H)=00H,调用子程序SUB1;如果(40H)=01H,调用子程序SUB2;如果(40H)=02H,调用子程序SUB3;如果

(40H)=03H,调用子程序SUB4;如果(40H)=04H,调用子程序SUB5。28流程图……..(40H)=?调SUB1调SUB2调SUB3调SUB4调SUB5=00H=02H=03H=04H=01H29程序清单……MOV40H,A

MOVDPTR,#TABRLAADDA,40HJMP@A+DPTR……TAB:LCALLSUB1LCALLSUB2LCALLSUB3LCALLSUB4LCALLSUB5设定表格首地址40H×3传送给A查表转移

转移地址表30循环程序设计循环程序设计循环程序的特点是程序中含有可以重复执行的程序段,该程序段通常称为循环体。例如,求100个数的累加和是没有必要连续安排100条加法指令的,可以只用一条加法指令并使之循环执行100次。循环程序设计不仅可以大大缩短所编程序长度和使程序所占存储

单元数最少,也能使程序结构紧凑和可读性变好。应注意循环程序设计并不能缩短完成任务的程序执行时间。循环程序的组成(四部分):①.循环初始化循环初始化程序段位于循环程序开头,用于完成循环前的准备工作,例如:循环体中循环计数器和各工作寄存器设置初值,其中循环计数器用于控制循环次数

。②.循环处理这部分程序位于循环体内,是循环程序的工作程序,需要重复执行。要求编写得尽可能简练,提高程序执行速度。31③.循环控制循环控制程序也在循环体内,常常由修改循环计数器内容的语句和条件转移语句等组

成,用于控制循环执行次数。④.循环结束这部分程序用于存放执行循环程序所得结果以及恢复各工作单元循环前的初值。循环程序通常有两种编制方法:一种是先循环处理后循环控制(即先处理后判断),如图4-3(a)所示;另一种是先循环控制后循环处

理(即先判断后处理),如图4-3(b)所示。32初始化循环处理循环控制循环结束完成?初始化循环处理循环控制完成?循环结束(a)先处理后判断(b)先判断后处理循环程序结构类型33例1:设计一段程序实现功能:统计(A)中1的个数,把结果存入30H单元中。循环程序举例解题思路:要统计1的

个数,可以利用RLC指令把A带上Cy循环左移,如果移入Cy的是1,就让(30H)加1,重复8次,可以统计出结果。30H00HR208H(循环次数)RLCACy=0?30H(30H)+1(R2)-1=0?下一条指令NYYN……MOV30

H,#00HMOVR2,#08HLOOP:RLCAJNCNEXTINC30HNEXT:DJNZR2,LOOP……30H赋初始值,置循环次数移位,判断Cy是否为1,为1则30H自加1判断是否结束34例:将内部RAM单元中20H单元到2FH单元的数传到外部

RAM中的2000H到200FH单元中.R2←10H,R0←20HDPTR←2000HNA←@R0@DPTR←AR0←(R0)+1DPTR←(DPTR)+1(R2)-1=0?ENDY流程图:35源程序:ORG1000HMOVR

0,#20HMOVDPTR,#2000HMOVR2,#10HLOOP:MOVA,@R0MOVX@DPTR,AINCR0INCDPTRDJNZR2,LOOPSJMP$END设置进行数据传送的内部和外部RAM的首地址利用ACC进行数据传送设定循环次数RAM地址加“1”

循环次数判定36查表程序设计查表是根据存放在ROM中数据表格的项数来查找和它对应的表中值。方法简便,可缩短程序长度和提高程序执行效率。注意:MOVCA,@A+DPTR指令可以实现64K地址范围内的数据查寻,而MOVCA,@A+PC指令只能实现25

6字节范围内的数据查寻。[例]已知BLOCK1为起始地址的数据块(数据块长度在LEN单元),数块中每个存储单元中的高、低4位分别为两个十六进制数,请编程把它们转换为相应ASCII码,并存放在BLOCK2开始

的连续存储单元(低4位ASCII码在前,高4位ASCII码在后)。37解:由于每个存储单元中放有两个十六进制数,因此每个存储单元中十六进制数应分别转换成ASCII码。这就需要两次使用查表指令MOVCA,@A+PC,这两条查表指令在程序中位置是不相同的,故两次对P

C调整的值也不相同。在编程时,可以先把整个程序编完,然后再计算两条加法指令中的data修正值并填入相应位置。相应参考程序为:ORG1000HLENDATA30HBLOCK1DATA31HBLOCK2DATA51HMOVR0,#BLOCK1;BLOCK1送R0MOVR1,#BLOCK2;B

LOCK2送R1LOOP:MOVA,@R0;取源数据块中数ANLA,#0FH;取出低4位38ADDA,#17;第一次地址调整MOVCA,@A+PC;第一次查表MOV@R1,A;存第一次转换结果MOVA,@R0;重新取出被转换数SWAPA;高4位调入低4位ANLA,#

0FH;取出低4位ADDA,#09;第二次地址调整MOVCA,@A+PC;第二次查表INCR1;修改目的数据块指针MOV@R1,A;存第二次转换结果INCR0;修改源数据块指针INCR1;修改目的数据块指针DJNZLEN,LOOP;若未转换完,则转LOOPSJMP

$ASCTAB:DB‘0’,’1’,’2’,’3’,’4’DB‘5’,’6’,’7’,’8’,’9’DB‘A’,’B’,’C’,’D’,’E’,’F’END39子程序设计40在实际问题中,常常会遇到在一个程序中多次用到相同的运算或操作,若每遇

到这些运算或操作,都从头编起,将使程序繁琐、浪费内存。因此在实际中,经常把这种多次使用的程序段,按一定结构编好,存放在存储器中,当需要时,可以调用这些独立的程序段。子程序设计41子程序设计子程序是指完成确定任务并能为其他程序反复调用的程序段。调用子程序的程序叫做主程序或称调用程序。只要

在主程序中安排程序的主要线索,在需要调用某个子程序时采用LCALL或ACALL调用指令,便可从主程序转入相应子程序执行,CPU执行到子程序末尾的RET返回指令,即可从子程序返回主程序断点处执行。在工程上,几乎所有实用程序

都是由许多子程序构成的。子程序可以构成子程序库,集中存放在某一存储空间,任凭主程序随时调用。采用子程序设计能使整个程序结构简单,缩短程序设计时间,减少对存储空间的占用。42例如:如果某一实用程序需要10次调用某一子程序,那么只要在主程序的相应地安排10条调用指令

就可以避免把同一子程序编写10遍,内存空间几乎可以减少9倍子程序的长度。主程序和子程序是相对的,没有主程序也不会有子程序。同一程序既可以作为另一程序的子程序,也可以有自己的子程序。即子程序是允许嵌套的,嵌套深度和堆栈区的大小有关。总之,子程序是一种能完成某一专用任务的程序段,其资源需要为所有调用

程序共享,因此,子程序在结构上应具有通用性和独立性,在编写子程序时应注意以下问题。43主程序与子程序的关系子程序SUB主程序MAINLCALLSUB调用子程序子程序入口地址RET44ORG1000HMAIN:MOVA,#0FEH;送显示初值LP:MOVR0,#10;送闪烁

次数LP0:MOVP1,A;点亮LEDLCALLDELAY;延时MOVP1,#0FFH;熄灭灯LCALLDELAY;延时DJNZR0,LP0RLASJMPLPEND实例:LED灯的闪烁点亮(一)延时次数-1=0点亮相

应的LEDYN熄灭相应的LED延时初值左移1位指向下一个LED设闪烁次数送显示初值开始45子程序嵌套子程序嵌套(或称多重转子)是指在子程序执行过程中,还可以调用另一个子程序。子程序SUB1主程序MAINL

CALLSUB1RET子程序SUB2RETLCALLSUB246子程序嵌套范例:LED灯闪烁(二)ORG1000HMAIN:MOVA,#0FEH;送显示初值COUN:ACALLFLASH;调闪烁子程序RL

A;A左移,下一个灯闪烁SJMPCOUN;循环不止FLASH:MOVR0,#10;送闪烁次数FLASH1:MOVP1,A;点亮LEDLCALLDELAY;延时MOVP1,#0FFH;熄灭灯LCALLDELAY;延时DJNZR0,FLASH1;闪烁次数不够10次,继续RETDELAY:MOVR3,

#0FFH;延时子程序DEL2:MOVR4,#0FFHDEL1:NOPDJNZR4,DEL1DJNZR3,DEL2RETEND47子程序的调用与返回问题:子程序调用、返回到主程序中的正确位置,并接著执行主程序中的后续指令呢?为了解决这个问题,我们采用了堆栈技术。子程序SUB1主

程序MAINRET子程序SUB2RET20102013211021132100220020132013PC21131321堆栈指针SP堆栈LCALLSUB1LCALLSUB22113201348子程序的参数传递范例:计算平方和c=a2+b2O

RG1000H;主程序MOVSP,#3FH;设置栈底MOVA,31H;取数a存放到累加器A中作为入口参数LCALLSQR;计算a2MOVR1,A;出口参数——平方值存放在A中MOVA,32H;取数b存放到累加器A中作为出口参数LCALLSQR;计算b2ADDA,R1;求和MOV3

3H,A;存放结果SJMP$49;子程序:SQR;功能:通过查表求出平方值y=x2;入口参数:x存放在累加器A中;出口参数:求得的平方值y存放在A中;占用资源:累加器A,数据指针DPTRSQR:PUSHDPH;保护现场,将主程序中

DPTR的高八位放入堆栈PUSHDPL;保护现场,将主程序中DPTR的低八位放入堆栈MOVDPTR,#TABLE;在子程序中重新使用DPTR,表首地址→DPTRMOVCA,@A+DPTR;查表POPDPL;恢复现场,将主程序中DPTR的低八位从堆栈中

弹出POPDPH;恢复现场,将主程序中DPTR的高八位从堆栈中弹出RETTABLE:DB0,1,4,9,16,25,36,49,64,8150使用注意事项:1)子程序的第一条指令地址称为子程序的始地址或入口地址。该指令前必

须有标号,标号应以子程序任务定名,以便一看就一目了然。例如:延时程序常以DELAY作为标号。2)主程序调用子程序是通过安排在主程序中的调用指令实现的,子程序返回主程序一般执行安排在子程序末尾的一条RET返回指令。3)主程序调用子程序和从子程序返回主程序,计算机能自动保护和恢复主程序

的断点地址。但对于各工作寄存器、特殊功能寄存器和内存单元中内容,如果需要保护和恢复,就必须在子程序开头和末尾(RET指令前)安排一些能够保护和恢复它们的指令。51使用注意事项4)为使所编子程序可以放在64KB内存的任何区域并能为主程序调用,子程序内部一般使用相对转移指令而不使用其他转移指

令,以便汇编时生成浮动代码。5)子程序参数可以分为入口和出口参数两类:入口参数是指子程序需要的原始数,由调用它的主程序通过约定的工作寄存器R0~R7、特殊功能寄存器SFR、内存单元或堆栈等预先传送给子程序使用:出口参数是由子程

序根据入口参数执行程序后获得的结果参数,应由子程序通过约定的R0~R7、SFR、内存单元或堆栈等传递给主程序使用。52传送子程序参数的方法通常有以下几种:1)利用寄存器或片内RAM传送子程序参数对于某些简单子程序、

入口参数和出口参数通常较少。常可采用本传送参数的方式。例如:CPU可以预先在主程序中把乘数和被乘数送入R0~R7,转入乘法子程序执行后得到的乘积也可通过R0~R7传送给主程序。2)利用寄存器传送子程序参数的地址如果上述方法不太方便,CPU也可在主程序中把

子程序入口参数地址通过R0~R7传送给子程序,子程序根据R0~R7中入口参数地址便可找到入口参数并对它们进行相应的操作,操作得到的出口参数也可把它们的地址通过寄存器R0~R7传送给主程序。533)

利用堆栈传送子程序参数任何符合先进后出或后进先出原则的片内RAM区都可称为堆栈。堆栈中数据的存取是由堆栈指针SP指示的。因此,堆栈也可用来传送子程序参数。例如:CPU可以通过主程序中的PUSH指令把入口参数压入堆栈传送给子程序,子程序的出

口参数也可通过堆栈传送给主程序。4)利用位地址传送子程序参数如果子程序的入口参数是字节中的某些位,那么利用本方法传送入口和出口参数也有方便之处,传送参数过程和上述诸方法类似。子程序参数的上述传递方法也适用于中断服务程序的编制。54单片机常见汇编语言程序设计举例:数制转换程序算术和

逻辑运算类程序设计定时程序常见汇编语言程序设计551、数制转换例1:将20H单元的两个压缩BCD码拆开变成ASCII码,存入21H、22H单元。(假设20H中的BCD码为00110100)什么是BCD码?什么是ASCI

I码?·········20H21H22HAB0011压缩BCD码001100110100低四位ASCII码高四位ASCII码56方法1:将BCD码除以10H,恰好是将BCD码分别移到了A、B的低4位。然后再各自与

30H相或,即成为ASCII码。方法2:利用半字节交换指令来实现。57ORG1000HMOVA,20HMOVB,#10HDIVABORLB,#30HMOV22H,BORLA,#30HMOV21H,ASJMP$END开始(20H)A10HBA/B(A中为高4位BCD码,B中为低

4位BCD码)B+30HBB(22H)A+30HAA(21H)结束数制转换程序1---方法1源程序如下:·········20H21H22HAB00110100PCPC0011010000010000PC0011000000000100PC00110100PCPCPC00

11PC58ORG1000HMOVR0,#20HMOVA,#30HXCHDA,@R0MOV21H,AMOVA,@R0SWAPAANLA,#0FHORLA,#30HMOV22H,ASJMP$END简单程序

例1---方法2开始#20HR0#30HAA的低4位(20H)的低4位A(21H)(20H)AA的低4位A的高4位A(22H)结束A+30HAPCPCPCPCPCPCPCPC源程序如下:·········20H21H

22HAR000110010000000110100000001000011010000110000001100000011PC0011PC59BCD码十进制转换成二进制例:假如在内部RAM40H单元中存储有一个压缩BCD编码的两位十进制数,设计一段程序把这个数转换成二进制数并

存入41H单元中。16(40H)余数商为二进制的高四位余为二进制的低四位解题思路:将高四位乘以10H,再加上低四位即可。60程序清单ORG1000HMOVA,40HMOVB,#16DIVAB

MOV20H,BMOVB,#10HMULABADDA,20HMOV41H,ASJMP$END取出40H数据除以16,商A,余B将十位数的二进制数加上个位数,结果41H将十位数乘以10H,其结果不

会超过一个字节,在A中612.算术和逻辑运算类程序设计多字节BCD码十进制数相加例:假如在MCS-51单片机内部RAM中30H~37H单元、38H~3FH单元分别存放有两个8字节BCD码十进制数,设计一段程序将这两个数相加,并把结果存于2FH~37

H单元中,小地址存数据的高字节。解题思路:先清Cy位,把(37H)和(3FH)进行带Cy相加,在进行十进制调整,结果存于37H单元中;把(36H)和(3EH)进行带Cy相加,在进行十进制调整……循环至结束,结果把最高字节的Cy存入2FH单元。62极值查找

程序例:在MCS-51单片机内部RAM的40H-47H单元中存有8个无符号数,设计一段程序找出其中的最大值,并存放到48H单元中。这是一个求最大值的问题。解题思路:先把(A)(40H),然后将(

41H)和(A)进行比较,如果(41H)>(A),则(A)(41H),然后和下一个字节进行比较,依次类推,最后(A)必定是最大值。40H41H42H43H44H45H46H47H48H63开始R040H(数据区首地址)R207H(循环次数)A((R0))(取第一个

数)R0(R0)+1(指向下一个数)B((R0))结束A≥B?NYA(B)(R2)-1=0?48H(A)NYORG1000HMOVR2,#07HMOVR0,#40HMOVA,@R0LOOP:IN

CR0MOVB,@R0CJNEA,B,NEXNEX:JNCNETMOVA,BNET:DJNZR2,LOOPMOV48H,ASJMP$END设定循环次数R1,R0作为数据指针,指向数据区第一个字节取出下一个字节,存入B如果(A)<(B),则(A)(B)次数到否,到则取出(A)

48H64例:将片内RAM中20H-27H中的数据按照从小到大的顺序重新排列。解题思路:见下图RAM地址20H21H22H23H24H25H26H27H原始数据66H11H10H34H67H01H89HA0H101H11H1

0H34H67H66H89HA0H201H10H11H34H67H66H89HA0H301H10H11H34H67H66H89HA0H401H10H11H34H66H67H89HA0H501H10H11H34H66H67H89HA0H601H10

H11H34H66H67H89HA0H701H10H11H34H66H67H89HA0H数据排序程序65R1←20H,R0←(R1)+1R3←08HB←((R1)),R2←(R3)-1查找最小值并和(R1)单元互换R3-1=0?ENDR1←(R1)

+1NY程序流程:66程序清单:ORG1000HMAIN:MOVR1,#20HMOVR3,#08H•LOOP1:MOVA,R1;R0←(R1)+1•INCA•MOVR0,A•MOVA,R3;R2←(R3)-1•DECA•MOVR2,A•MOVB,@R1•LOOP:MOVA

,@R0•CJNEA,B,MM•MM:JNCSS;如果A≥B跳转•MOVB,A•MOV28H,R0;28h纪录最小值所在单元的编号•SS:INCR0•DJNZR2,LOOP•MOVR0,28H;最小值单元和20H单元内容互换•MOVA,@

R1;数据•MOV@R0,A•MOV@R1,B•INCR1•DJNZR3,LOOP1•END673.定时程序单重循环延时例1:假设单片机的fosc=12MHz,计算单片机执行下面程序消耗的时间。DELAY:MOVR5,#TIME;1机器周

期MM:NOP;1机器周期DJNZR5,MM;2机器周期RET;2机器周期执行完以上4条语句,所花时间:T=(1+(1+2)×TIME)+2×1s推广计算式:T(机器周期数)=(循环体机器周期数)×循环次数+初始化机

器周期数68多重循环延时例1:假设单片机的fosc=12MHz,计算单片机执行下面程序消耗的时间。DELAY2:MOVR3,#TIME1;1机器周期LOOP1:MOVR2,#TIME2;1机器周期LOOP2:

NOP;1机器周期DJNZR2,LOOP2;2机器周期DJNZR3,LOOP1;2机器周期RET;2机器周期执行完以上6条语句,所花时间:T=(1+(1+(1+2)×TIME2+2)×TIME1+2)×1s69本章小结•本章要求:掌握M

CS-51单片机汇编语言程序的基本格式及伪指令;掌握程序的基本结构(顺序结构、分支结构、循环结构)和程序设计的基本方法;掌握子程序的设计方法及其参数传递方法;了解数制转换、算术运算、极值查找等典型程序的设计。70TheEnd

小橙橙
小橙橙
文档分享,欢迎浏览!
  • 文档 25747
  • 被下载 7
  • 被收藏 0
相关资源
广告代码123
若发现您的权益受到侵害,请立即联系客服,我们会尽快为您处理。侵权客服QQ:395972555 (支持时间:9:00-21:00) 公众号
Powered by 太赞文库
×
确认删除?