下载

1下载券

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 第四章 80C51单片微机的程序设计

第四章 80C51单片微机的程序设计.ppt

第四章 80C51单片微机的程序设计

frankann245
2014-03-05 0人阅读 举报 0 0 暂无简介

简介:本文档为《第四章 80C51单片微机的程序设计ppt》,可适用于高等教育领域

第四章C单片微机的程序设计第四章C单片微机的程序设计概述汇编语言格式概述汇编语言格式计算机语言机器语言、汇编语言与高级语言程序:为计算某一算式或完成某一工作的若干指令的有序集合。计算机的全部工作概括起来就是执行这一指令序列的过程。程序设计:为计算机准备这一指令序列前的过程。⑴机器语言机器语言系统:用二进制代码表示的指令系统简称为机器语言。直接用机器语言编写的程序称为手编程序或机器语言程序。⑵汇编语言在机器语言这些英文字符被称为助记符。用这种助记符表示指令系统的语言称为汇编语言或符号语言用汇编语言编写的程序称为汇编语言程序。特点:①助记符指令与机器指令是对应的用汇编语言编写的程序效率高占用存储空间小运行速度快而且能反映计算机的实际运行情况所以用汇编语言能编写出最优化的程序。②汇编语言是“面向机器”的语言编程比使用高级语言困难。③汇编语言能直接访问存储器、输入与输出接口及扩展的各种芯片(比如AD、DA等)也可直接处理中断汇编语言能直接管理和控制硬件设备。④汇编语言通用性差汇编语言和机器语言一样都面向一台具体的机器不同的单片微机具有不同的指令系统并且不能通用。不能直接识别在汇编语言中出现的字母、数字和符号需要将其转换成用二进制代码表示的机器语言程序才能够识别和执行。通常把这一转换(翻译)工作称为汇编。人工汇编:由程序员通过查指令表把汇编指令程序转换为机器语言程序的过程。由专门的程序来进行汇编这种程序称为汇编程序。经汇编程序汇编而得到的机器语言程序计算机能够识别和执行这一机机器语言程序称为目的程序或目标程序而汇编语言程序称为源程序。这者之间的关系如图–所示。⑶高级语言比如BASIC、FORTRAN、COBOL及PASCAL等都是一些参照数学语言而设计的、近似于人们日常用语的语言。通用性强易于移植到不同类型的机器中去。计算机也不能直接识别和执行高级语言需要将其转换为机器语言才能识别和执行。对于高级语言这一转换工作通常称为编译或者解释。进行编译或者解释的专用程序称为编译程序或者解释程序。由于高级语言不受具体机器的限制而且使用了许多数学公式和习惯用语从而简化了程序设计的过程因此是一种面向问题或者面向过程的语言。比如APT、PROLOG、LISP、PLM以及C语言等。而C系列单片微机作为工业标准地位从年开始就有C语言编译器简称C。⒉汇编语言⑴汇编语言语句的种类和格式①汇编语言语句的种类指令语句:每个指令语句都在汇编时产生个目标代码对应着机器的种操作。例如:MOVA#伪指令语句:主要是为汇编语言服务的在汇编时没有目标代码与之对应。例如:ONEEQU宏指令语句:用以代替汇编语言源程序中重复使用的程序段的种语句由汇编程序在汇编时产生相应的目标代码。②汇编语言语句的格式指令语句的格式为:【标号(名字)】:助记符(操作码)【操作数(参数)】【注释】伪指令语句的格式:名字定义符参数注释各字段之间用个空格或字段定界符分隔常用的字段定界符有冒号“:”、逗号“”和分号“”。其中方括号括起来的是可选择部分。标号域:说明指令的地址。标号可以作为LJMP、AJMP、LCALL及ACALL等指令的操作数。     在指令语句中标号位于一个语句的开头位置由字母和数符组成字母打头冒号“:”结束。标号中的字符个数一般不超过个若超过个则以前面的个为有效后面字符不起作用。     不能使用本汇编语言中已经定义了的符号作标号比如指令助记符(如ADD)、伪指令(如END)      一条语句可以有标号也可以没有标号操作码域:是指令的助记符或定义符用来表示指令的性质规定这个指令语句的操作类型。伪指令语句中的定义符规定这个指令语句的伪操作功能。对于标号缺省的语句操作码域作为一行的开始。但在书写时应与上一行的操作码对齐。操作数域:给出的是参与运算或进行其它操作的数据或这些数据的地址。      操作数与操作码之间用空格“”分隔若有两个操作数这两个操作数之间必须用逗号“”分开。对于操作数域出现的常数:若采用十六进制数表示其末尾必须加“H”说明若十六进制数以A、B、C、D、E、F开头其前面必须添个“”进行引导说明。若采用二进制数表示其末尾必须用“B”说明。若采用十进制数表示可以不加后缀或加“D”说明。 注释域由分号“”引导开始是说明语句功能、性质以及执行结果的文字。以分号“”引导。例:把片外存储器H单元中的数送入片内H单元中。标号域操作码域操作数域注释域BEGIN:MOVDPTR#H(DPTR)=HMOVR#H(R)=HMOVXADPTR(A)=((DPTR))MOVRA((R))=(A)伪指令语句伪指令:为了便于编程和对汇编语言程序进行汇编各种汇编程序都提供一些特殊的指令供人们编程使用。由伪指令确定的操作称为伪操作。伪指令又称汇编程序控制译码指令。“伪”体现在汇编时不产生机器指令代码不影响程序的执行仅指明在汇编时执行一些特殊的操作。伪指令语句⒈ORG(ORiGIN)汇编起始地址伪指令指令格式为:ORG<表达式>含义:向汇编程序说明下述程序段的起始地址由表达式指明。表达式通常为进制地址码。     一般规定在由ORG伪指令定位时其地址应当由小到大不能重叠。      它的有效范围一直到下一条ORG伪指令出现为止。      跟在ORG伪指令后面的程序段或数据段是绝对地址还是浮动地址段依赖于ORG右边的表达式性质。ORGHSTART:MOVA#H含义:通知汇编程序从START开始的程序段其起始地址由H开始。由于H是立即数型地址码所以还隐含地指明该程序段是绝对地址段。假定ORG右边的表达式是浮动程序段中定义的标号RELOCA则ORGRELOCASUBROU:……表明SUBROU起始于RELOCA(它是相对地址)浮动地址的程序段。⒉END(ENDofassembly)汇编结束伪指令 汇编结束伪指令一般有以下两种格式:主程序模块:<标号>END<表达式>子程序模块:<标号>END含义:通知汇编程序该程序段汇编至此结束。END语句应设置在整个程序(包括伪指令在内)的后面。当源程序为主程序时END伪指令中可有标号这个标号应是主程序第一条指令的符号地址。若源程序为子程序则在END伪指令中不需要带标号。⒊EQU(EQUate)赋值伪指令 指令格式为:<标号>EQU<表达式>含义:把表达式赋值于标号这里的标号和表达式是必不可少的。例如:LOOPEQUH是向汇编程序表明标号LOOP的值为H。又如:LOOPEQULOOPLOOP已赋值为H则相当于LOOP=LOOP即LOOPI也为H在程序中LOOP和LOOP可以互换使用。用EQU语句给一个标号赋值以后在整个源程序中该标号的值是固定的不能更改。⒋DL定义标号值伪指令 指令格式为:<标号>DL<表达式>含义:说明标号等值于表达式。同样标号和表达式是必不可少的。例如COUNTDLHS定义标号COUNT的值为HCOUNTDLCOUNT十重新定义COUNT的值为H+l可用DL语句在同一源程序中给同一标号赋予不同的值即可更改已定义的标号值而用EQU语句定义的标号在整个源程序中不能更改。⒌DB(DefineByte)定义字节伪指令 指令格式为:<标号>DB<表达式或表达式表>含义:将表达式或表达式表所表示的数据或数据串存入从标号开始的连续存储单元中。标号为可选项它表示数据存储单元地址。表达式或表达式表是指一个字节或用逗号分开的字节数据。可以是用引号括起来的字符串。字符串中的字符按ASCII码存于连续的ROM中。例如:ORGHTABLEDBH-“ABC”表示字节串数据存入由TABLE标号为起始地址的连续存储器单元中。即从H存储单元开始依次连续存放数据为:HHHHHFEHHHH。若不采用ORG伪指令专门规定数据区的起始地址则数据区的起始地址即根据DB命令前一条指令的地址确定。这时DB所定义的数据字节的起始地址为DB命令前一条指令的地址加上该指令的字节数。 ⒍DW(DefineWord)定义字伪指令指令格式为:<标号>DW<表达式或表达式表>含义:把字或字串值存入由标号开始的连续存储单元中且把字的高字节数存入低地址单元低字节数存入高地址单元。按顺序连续存放。DWHH表示按顺序存入HHHHHEH注:DB和DW定义的数表数的个数不得超过个。若数据的数目较多时可以使用多个定义命令。一般以DB来定义数据以DW来定义地址。⒎DS(DefineStorage)定义存储区伪指令指令格式为:<标号>DS<表达式>含义:通知汇编程序在目标代码中以标号为首地址保留表达式值的若干存储单元以备源程序使用。汇编时对这些单元不赋值。例如:BASEDSH通知汇编程序从标号BASE开始保留H个存储单元以备源程序另用。注意对于C单片微机DB、DW、DS等伪指令只能应用于程序存储器而不能对数据存储器使用。⒏BIT位定义伪指令 命令格式为:<字符名称>BIT<位地址>含义:给字符名称赋予位地址。其中位地址可以是绝对地址也可以是符号地址。例:ABCBITP把P位地址赋值给ABC在后面的编程中ABC即可作为位地址P使用。例伪指令应用ORGHBUFFERDSHDW“AB”DWHACH说明:①从H至FH为缓冲区空间②(H)=H(‘A’)(H)=H(‘B’)③H单元起存放H、H、H、ACH、FCH、DHC汇编语言程序设计C汇编语言程序设计汇编语言程序设计就是采用汇编指令来编写计算机程序。在实际编程中如何正确选择指令、寻址方式和合理使用工作寄存器包括数据存储器单元如何对扩展的IO端口进行操作等都是基本的汇编语言程序设计技巧。程序结构一般采用以下种基本控制结构即顺序结构、分支结构和循环结构来组成再加上使用广泛的子程序及中断服务子程序共有种基本结构。顺序结构程序设计 按照逻辑操作顺序从某一条指令开始逐条顺序执行直至某一条指令为止。例数据传送和交换。将R与R内容互换R与内存H单元内容互换。XCHR:MOVARXCHARXCHARR与R内容互换MOVARXCHAHXCHARR与H单元内容互换顺序结构程序设计 例不带符号多字节加法。设被加数存放于片内RAM的H(低位字节)、H(高位字节)加数存放于H(低位字节)和H(高位字节)运算结果的和数存放于H(低位字节)和H(高位字节)中。实现位相加。START:PUSHACC将A中内容进栈保护MOVR#H将H地址送RMOVR#H将H地址值送RMOVA@R被加数低字节内容送AADDA@R低字节数相加MOV@RA低字节数和存H中例不带符号多字节加法。INCR指向被加数高位字节INCR指向加数高位字节MOVA@R被加数高位字节送AADDCA@R高字节数带进位相加MOV@RA高字节数和存H中CLRAADDCA,#HMOVH,A进位暂存于H中POPACC恢复A原内容注意:对于对带符号数原码的减法运算只要先将减数原码的符号位取反即可把减法运算按加法运算的原则来处理。对于带符号数的加法运算首先要进行两数符号的判定若两数符号相同则进行两数相加并以被加数符号为结果的符号。如果两数符号不同则进行两数相减。如果相减结果为正则该数即为最后结果并以被减数符号为结果的符号。如果两数相减的结果为负则应将其差数取补并把被减数的符号取反后作为结果的符号。例双字节乘法。多字节乘法的基础是加法。分别相乘后对应字节相加(个位、十位、百位等分别相加并考虑低字节向高字节的进位)。选用工作寄存器暂存中间积。分析:设被乘数低字节(addrl)用A表示高字节(addr)用B表示乘数低字节(addr)用L表示高字节(addr)用M表示。例双字节乘法。双字节相乘的过程如下:工作寄存器用来存放部分积R存放(HAL+LBL+LMA)R存放(HBLCY+HMA+LBM)R存放(HBM十CY)。START:PUSHPSWPSW、A、B入栈PUSHACCPUSHBMOVPSW#H选用工作寄存器组MOVR#addrl被乘数低字节地址送RMOVR#addr乘数低字节地址送RMOVA@R被乘数低字节内容送APUSHA被乘数低字节内容A压栈MOVB@R乘数低字节内容送BMULAB()A×LMOV@RA积的最低字节存入addrl中MOVRBHAL送R中INCR指向被乘数高字节MOVA@R被乘数高字节送AMOVB@R乘数低字节送BMULAB()B×LADDARHAL十LBLMOVRAHAL十LBI之和送RMOVABHBL送AADDCA#HHBL+CYMOVRAHBL送RPOPA被乘数低字节内容L出栈INCR指向ddrMOVB@RM送BMULAB()M×AADDARLMA+(R)MOVRALMA+HAL十LBL之和送RMOVABHMA送AADDCARHMA十HBL+CYMOVRAHMA+HBL+CY之和送RMOVR#清RJNCLOOPCY=转LOOPINCRCY=则(R)←R+lLOOP∶MOVARB送AMOVB@RM送BMULAB()M×BADDARHMA十HBL+LBMMOVRAHMA+HBL+LBM之和送RMOVABHBM送AADDCARR+HBM=RESMOV@RARES存入addr中MOVARRES存入addr中MOV@RADECR指向addrMOVARRES存入addr中MOVRAPOPBB、A、PSW出栈POPACCPOPPSW……对于带符号数的乘法其原则为:原码相乘乘积的符号位为被乘数与乘数符号位的“异或”例查表查表:根据变量x在表格中查找对应的y值使y=f(x)。y与x的对应关系可有各种形式而表格也可有各种结构。一般表格常量设置在程序存储器的某一区域内。MOVCA@A+DPTR远程查表MOVCAAPC近程查表例查表设有一个巡回检测报警装置需对路输入进行控制每路设有一个最大额定值为双字节数。控制时需根据检测的路号找出该路对应的最大额定值。设R用于寄存检测路号查找到的对应的最大额定值存放于H和H单元中。查找最大允许额定值子程序如下:地址机器码源程序注释 ORGHEAMOVAR检测路号送AAADDAR(R)×FMOVHA距表首址偏移量ADDA#H偏移量MOVCAAPC查表读取第个字节内容CXCHAH第字节存入H单元ADDA#H偏移量BMOVCAAPC查表读取第字节CFMOVHA第字节存入H单元E………ORGH最大额定值表TABDWH路号DWH路号DWH路号DWH路号END说明:rel计算H(H)=H(H)(BH)=H例查表设表中有个元素每个元素为两个字节则表格总长为个字节。现按R和R的内容从表格中查出对应的数据元素值送存R和R中。TBDP:MOVDPTR#TBDP表格首地址值送DPTRMOVAR查表参数低位字节送ACLRC清CYRLCA带进位左移一位XCHAR将查表参数R内容送ARLCA带进位左移一位XCHARR与R内容互换例查表ADDADPLDPL+查表参数低位字节MOVDPLA调整DPL、DPHMOVADPHDPH送AADDCARDPH+查表参数高位字节MOVDPHA相加和存DPHCLRA清AMOVCAA+DPTR查表读第字节MOVRA第字节存入RCLRA清AINCDPTR(DPTR)+MOVCA@A+DPTR查表读第字节MOVRA第字节存入RRETTBDPDW…数据表DW…分支结构程序设计 特点:程序执行流程中必然包含有条件判断符合条件要求和不符合条件要求分别有不同的处理路径。在程序设计时往往借助程序框图(判断框)来指明程序的走向。一般情况下每个分支均需单独一段程序在程序的起始地址赋予一个地址标号以便当条件满足时转向指定地址单元去执行条件不满足时仍顺序往下执行。分支结构程序设计⒈单分支结构程序仅有两个出口两者选一。通常用条件判跳指令来选择并转移。可实现单分支程序转移的指令有位条件转移指令如:JC、JNC、JB、JNB和JBC等还有一些条件转移指令如:JZ、JNZ、DJNZ等。有种典型形式(见图–)。图–(a)当条件满足时执行分支程序否则执行分支程序。图–(b)当条件满足时跳过程序段从程序段开始继续顺序执行否则顺序执行程序段和程序段。图–(c)当条件满足时程序顺序执行程序段否则重复执行程序段直到条件满足为止。实际是循环结构程序。例求双字节补码程序设对addrladdrl+的双字节数取补后存入addr和addr十单元中其中高位字节在高地址单元中。位微机对双字节数取补需分两次进行。首先对低字节数取补然后判其结果是否为全“”。若为“”则高字节数取补否则高位字节数取反。START:MOVR#addrl原码低字节地址码送RMOVR#addr补码低字节地址码送RMOVA@R原码低字节内容送ACPLAINCAA内容取反加l即取补MOV@RA低字节补码存addr单元例求双字节补码程序INCR指向原码高字节INCR指向补码高字节JZLOOP当(A)=转LOOPMOVA@R原码高字节送ACPLA高字节内容取反MOV@RA字节反码存(addr十)单元SJMPLOOP转LOOP结束LOOP:MOVA@R低字节补码为CPLA对高字节数取补INCAMOVRA高字节补码存(addr)单元LOOP:…END结束例、试编写计算下式的程序Y=a+b(当b≥时)Y=a-b(当b<时)ORGHSTART:MOVA#aMOVBAMULAB(B)(A)=aMOVRA(R)(R)=aMOVRBMOVA#bCJNEA#AHMMNb≠则转移例、试编写计算下式的程序MM:ADDARb≥,ab=YMOVRAMOVA#HADDCARMOVRASJMPMMNNMMN:JNCMM无借位(即b>)转MMMOVRAR←bMOVARCLRCSUBBA,(R)(R)←abMOVRAMOVARSUBBA#HMOVRAMMNN:MOVYR(Y)(Y)←结果MOVYRHERE:AJMPHERE注:Y、Y需用位定义伪指令赋值。⒉多分支选择结构多分支结构:程序的判别部分有两个以上的出口流向。通常有两种形式参见图–。分支结构程序允许嵌套.即一个程序的分支又由另一个分支程序所组成从而形成多级分支程序结构。C设有两条多分支选择指令:散转指令JMP@A+DPTR散转指令由数据指针DPTR决定多分支转移程序的首地址由累加器A中内容动态地选择对应的分支程序可从多达个分支中选一。比较指令CJNEAdirectrel比较两个数的大小必然存在大于、等于、小于种情况这时就需从个分支中选一。另外还可以使用查地址表的办法、查转移指令表的办法或通过堆栈来实现多分支程序转移。例通过堆栈操作实现分支程序转移设分支转移序号在R中分支程序入口地址放在BRTAB表中。MOVDPTR#BRTAB分支入口地址表首地址MOVARRLA×MOVRAINCA取低位地址MOVCAADPTRPUSHA低位地址入栈MOVARMOVCAADPTR取高位地址并入栈PUSHARET分支入口地址出栈送入PCBRTABDWBRBR……分支程序入口地址表注:RET指令与两条PUSH指令配对压栈时先“低”后“高”。而DW伪指令在字节存放时先“高”后“低”。例通过堆栈操作实现分支程序转移例通过查转移指令表实现多分支程序转移由H单元中动态运行结果值来选择分支程序(H)=转处理程序(H)=转处理程序(H)=n转处理程序nSTART:MOVDPTR#ADDR多分支转移指令表首址送DPTRMOVAHH单元内容送ACLRC清CYRLCAA内容左移一位例通过查转移指令表实现多分支程序转移JNCTABLE若CY=,转TABELINCDPH若CY=lDPH内容十TABEL:JMPA十DPTR多分支转移ADDR:AJMPLOOP转分支程序AJMPLOOP转分支程序…AJMPLOOPn转分支程序n由于选用绝对转移指令AJMP每条指令占用两个字节因此要求A中内容为偶数在程序中将选择参量(A中内容)左移一位。如果最高位为则将它加到DPH中这样分支量可在~中选一。根据AJMP指令的转移范围要求分支程序段和各处理程序入口均位于KB范围内。如果要求不受此限制可选用长跳转指令LJMP但它需占用个字节。START:MOVDPTR#ADDR分支程序段首址送DPTRMOVAH选择参量送AMOVB#H乘数送入BMULAB参量×MOVRA乘积低位暂存R中MOVAB乘积高位送AADDADPH乘积高位加到DPH中MOVDPHAMOVARJMP@A+DPTR多分支选择ADDR:LJMPLOOP转分支程序LJMPLOOP转分支程序…LJMPLOOPn转分支程序n例对从P口输入的个~的数进行概率统计。统计的数值分别存入H~H中。CLRA结果单元H~H清零MOVR#MOVR#HLP:MOVRAINCRDJNZRLPMOVR#个数的计数器READ:MOVAP读入P例对从P口输入的个~的数进行概率统计。统计的数值分别存入H~H中。CHK:CJNEA#CHK比较不为“”继续比较INCH是“”则“”计数单元加SJMPEND是否全部统计完?CHK:CJNEA#CHKINCH是“”则“”计数单元加SJMPENDCHK:CJNEA#CHKINCH是“”则“”计数单元加SJMPENDCHK:CJNEA#CHKINCH是“”则“”计数单元加SJMPENDCHK:CJNEA#CHKINCH是“”则“”计数单元加SJMPENDCHK:CJNEA#CHKINCH是“”则“”计数单元加SJMPENDCHK:CJNEA#CHKINCH是“”则“”计数单元加SJMPENDCHK:CJNEACHKINCH是“”则“”计数单元加SJMPENDCHK:CJNEA#CHKINCH是“”则“”计数单元加SJMPENDCHK:CJNEA#ERRINCH是“”则“”计数单元加END:DJNZRREAD判是否全部统计完?HERE:SJMPHEREERR:…非~出错循环结构程序设计循环:强制CPU重复多次地执行一串指令的基本程序结构。循环程序结构是分支程序中的一个特殊形式。计数循环结构如图–所示条件循环结构如图所示。循环结构程序设计⒈循环程序的个部分 ()循环初始化在进入循环程序体之前所必要的准备工作:需给用于循环过程的工作单元设置初值如循环控制计数初值的设置、地址指针的起始地址的设置、为变量预置初值等有些情况下还要进行现场保护。()循环体循环结构程序的核心部分完成实际的处理工作是需反复循环执行的部分。()循环控制控制循环程序的循环与结束部分通过循环变量和结束条件进行控制。在重复执行循环体的过程中不断修改循环变量直到符合结束条件就结束循环程序的执行。在循环过程中除不断修改循环变量外还需修改地址指针等有关参数。实现方法主要有循环计数控制法和条件控制法。 ◆循环次数不确定的情况:满足条件就结束循环。采用条件控制法。◆循环次数己知的情况:采用计数控制法。()结束部分对循环程序执行的结果进行分析、处理和存放。有些情况下需恢复现场。◆图–是计数循环结构形式。主机对循环程序的初始化和结束部分均只执行一次而对循环体和循环控制部分则常需重复执行多次不管条件如何它至少执行一次循环体.循环程序设计的重点。◆图–是条件循环结构形式。条件循环先检查控制条件是否成立决定循环程序是否执行。⒉计数控制循环结构计数循环程序的特点是循环次数已知必须在初始化部分设定计数的初值循环控制部分依据计数器的值决定循环次数。一般均设置为减“”计数器每循环一次自动减“”直到回时结束循环。DJNZRnrel以工作寄存器作控制计数器DJNZdirectrel以直接寻址单元作控制计数器例软件延时有些情况可以不采用单片微机内的定时器计数器作定时而是采用软件延时的办法执行一段循环程序而循环程序执行的时间即为延时时间。DELAY:MOVR#data预置计数循环控制常数DELAY:DJNZRDELAY当(R)≠转向本身RET根据R的不同初值(~FFH)可实现~个机器周期的延时。例软件延时⒊条件控制循环结构根据控制循环结束的条件决定是否继续循环程序的执行。所谓的结束条件可以是搜索到某个参数(比如回车符“CR”)也可以是发生的某种变化(如故障引起电路电平变化)等什么时侯结束循环是不可预知的。一般常用比较转移指令或条件判跳指令进行控制和实现。例把内部RAM中起始地址为DATA的数据串传送到外部RAM以BUFFER为首地址的区域直到发现“$”字符的ASCII码为止数据串的最大长度在内存H中。MOVR#DATA数据区首地址MOVDPTR#BUFFER数据区长度指针LOOP:MOVARCJNEA#HLOOP判是否为“$”符(H)SJMPLOOP是“$”符则结束LOOP:MOVAR不是“$”符则传送MOVXDPTRA例INCRINCDPTRDJNZHLOOP数据串未查完继续LOOP:…注:一个是条件循环控制以找到ASCII码“$”符为循环结束条件笫二个是计数循环结构万一找不到ASCII码“$”符则由数据串的最大长度作为计数循环控制。⒋循环嵌套结构 循环嵌套就是在循环内套循环的结构形式也称多重循环。循环的执行过程是从内向外逐层展开的。内层执行完全部循环后外层则完成一次循环逐次类推。层次必须分明层次之间不能有交叉否则将产生错误。子程序设计⒈子程序及其调用◆子程序是一段由专门的子程序调用指令CALL调用而以子程序返回指令RET结束的程序段。◆将那些需多次应用的、但完成的运算或操作相同的程序段编制成一个子程序并尽量使其标准化存放于某存储区域。◆调用子程序的程序称为主程序或调用程序。子程序设计   调用指令自动将断点地址(当前PC值)压入堆栈保护以便于程序执行完毕正确返回原程序从断点处继续往下执行。    返回指令:RET。设置在子程序的末尾表示子程序执行完毕。它的功能是自动将断点地址从堆栈弹出送PC从而实现程序返回原程序断点处继续往下执行。◆子程序的第一条指令地址通常称为子程序首地址或入口地址往往采用标号(可用助记符)加以表示调用(转子)指令的下一条指令地址通常称为返回地址或断点。子程序与主程序之间的关系如图-所示。在子程序的执行过程中可能出现在子程序中再次调用其它子程序的情况。像这种子程序调用子程序的现象通常称为子程序嵌套。⑴子程序入口条件在凋用子程序之前必须先将数据或参数送到主程序与子程序的某一共享存储单元或寄存器中调用子程序后子程序从共享存储单元或寄存器中取得数在返回主程序之前子程序还必须把计算结果送到共享存储单元或寄存器中。⑵保护现场与恢复现场在调用子程序时单片微机只是自动保护断点地址。PSW、A、B等可通过压栈指令进栈保护。工作寄存器保护采用选择不同工作寄存器组的方式来达到的。当子程序执行完后即返回主程序时应先将上述内容送回到来时的寄存器中去这后一过程称为恢复现场。◆在编写子程序时还应注意保护(压栈)和恢复(弹出)的顺序即先压入者后弹出。⑶子程序的特性对于通用子程序为便于各种用户程序的选用要求在子程序编制完成后提供一个说明文件,一般包含如下内容:  子程序名。标明子程序功能的名字。  子程序功能。简要说明子程序能完成的主要功能。子程序入口条件和出口结果。说明当主程序或调用程序调用本子程序时应设置哪些参量说明子程序执行结果及其存储单元。 子程序所用的寄存器、存储单元、标志位等提示主程序或调用程序是否需要在调用本子程序前对此进行保护。子程序嵌套。指明本子程序需调用哪些子程序。例中值数字滤波子程序应用软件来进行数字滤波。中值滤波就是连续输入三个检测信号值从中选择一个中间值为有效信号。入口条件:三次采集数据分别存储在内部存储器的H、H和H中。出口结果:中间值在R寄存器中。使用资源:累加器A、R及内存H、H和H。例中值数字滤波子程序ORGHFILLE:PUSHPSWPSW及ACC保护入栈PUSHACCMOVAH取第一个数据CLRCSUBBAH与第二个数据比较JNCLOB第一个数据比第二个数据大转LOBMOVAH第一个数据比第二个数据小交换二个数的位置XCHAHMOVHALOB:MOVAHCLRCSUBBAH第三个数据与前二个数据中的较大数比较JNCLOB第三个数据大于前二个数据中的较大数转LOBMOVAHCLRCSUBBAH第三个数据与前二个数据中的较小数比较JNCLOBMOVAHMOVRALOB:POPACC恢复ACC和PSWPOPPSWRETLOB:MOVAHMOVRAAJMPLOBLOB:MOVAH存入中值MOVRAAJMPLOB例码制转换把外部RAMH~FH共个单元中的ASCII码依次转换为十六进制数并拼装压缩存入内部H~H共个单元中。ASCTOH:MOVR#H设ASCII码地址指针MOVR#H设十六进制数地址指针MOVR#H拼装的十六进制数字节个数。AB:ACALLTRAN调用转换子程序。SWAPAMOVXRAINCR例码制转换ACALLTRAN调用转换子程序。XCHDARINCRINCRDJNZRABHALT:SJMPHALTTRAN:CLRCASCII码数转换为十六进制数子程序MOVXARSUBBA#HCJNEA#AHBBAJMPBCBB:JCDONEBC:SUBBA#H≥AH则再减HDONE:RET注:转换算法把欲转换的ASCII码数减H,若小于则为非十六进制数若为~即为转换结果。若≥AH,则应再减H(“H”“A”)若在AH~FH间即为转换结果若小于AH或大于FH均为非十六进制数。标号为TRAN的子程序实现ASCII码数转换为十六进制数调用前应把欲转换的ASCII码数放在以R间接寻址的单元中转换结果在累加器A中。  程序设计举例 ⒈数据排序程序常用的有插入排序法、冒泡排序法、快速排序法、选择排序法、堆积排序法、二路归并排序法及基数排序法等。★冒泡法是一种相邻数互换的排序方法。从前向后进行相邻数比较若数据的大小次序与要求的顺序不符时(逆序)就将二数互换正序时不交换假定是升序排序则通过这种相邻数互换方法使小数向前移大数向后移从前向后进行一次冒泡(相邻数互换)把最大数换到最后再进行一次冒泡就会把次大数排在倒数第二直至冒泡结束。  程序设计举例假定原始数据为FHHHHHDHH冒泡过程:FHHHHHDHHH(逆序则两数互换)HFHHHHDHH(逆序则两数互换)HHFHHHDHH(逆序则

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/110

第四章 80C51单片微机的程序设计

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利