C51单片微机的程序设计.ppt

上传人:max****ui 文档编号:12558291 上传时间:2020-05-11 格式:PPT 页数:99 大小:535KB
返回 下载 相关 举报
C51单片微机的程序设计.ppt_第1页
第1页 / 共99页
C51单片微机的程序设计.ppt_第2页
第2页 / 共99页
C51单片微机的程序设计.ppt_第3页
第3页 / 共99页
点击查看更多>>
资源描述
第四章80C51单片微机的程序设计,南京邮电大学电气工程系,OUTLINE,4.1概述4.1.1汇编语言格式4.1.2伪指令语句4.280C51汇编语言程序设计4.2.1顺序结构程序设计4.2.2分支结构程序设计4.2.3循环结构程序设计4.2.4子程序设计4.2.5程序设计举例4.3本章小结,4.1.1汇编语言格式,计算机语言机器语言、汇编语言与高级语言程序与程序设计,4.1概述,机器语言,助记符指令与机器指令一一对应用汇编语言编写的程序效率高,占用存储空间小,运行速度快,而且能反映计算机的实际运行情况,所以用汇编语言能编写出最优化的程序。汇编语言是“面向机器”的语言,编程比使用高级语言困难能直接访问存储器、输入与输出接口及扩展的各种芯片(比如A/D、D/A等),也可直接处理中断,汇编语言能直接管理和控制硬件设备通用性差,汇编语言特点,汇编过程示意图,80C51系列单片微机从1985年开始就有C语言编译器,简称C51。,高级语言,汇编语言,汇编语言语句的种类指令语句:汇编时产生1个目标代码,对应1种操作例如:MOVA,#0伪指令语句:为汇编语言服务的,在汇编时没有目标代码与之对应例如:ONEEQU1宏指令语句:用以代替汇编语言源程序中重复使用的程序段的1种语句,由汇编程序在汇编时产生相应的目标代码,汇编语言语句的格式指令语句的格式:【标号(名字)】:助记符(操作码)【操作数(参数)】;【注释】伪指令语句的格式:名字定义符参数;注释各字段之间用1个空格或字段定界符分隔,常用的字段定界符有冒号“:”、逗号“,”和分号“;”。其中方括号括起来的是可选择部分。,标号(名字)域:说明指令的地址;可以作为LJMP、AJMP、LCALL及ACALL等指令的操作数。在指令语句中,标号位于一个语句的开头位置,由字母和数符组成,字母打头,冒号“:”结束。标号中的字符个数一般不超过8个,若超过8个,则以前面的8个为有效,后面字符不起作用。不能使用本汇编语言中已经定义了的符号作标号,比如指令助记符(如ADD)、伪指令(如END)一条语句可以有标号,也可以没有标号,操作码域:是指令的助记符或定义符,用来表示指令的性质,规定这个指令语句的操作类型伪指令语句中的定义符规定这个指令语句的伪操作功能对于标号缺省的语句,操作码域作为一行的开始。但在书写时,应与上一行的操作码对齐,操作数域:给出的是参与运算或进行其它操作的数据或这些数据的地址。操作数与操作码之间用空格“”分隔,若有两个操作数,这两个操作数之间必须用逗号“,”分开。对于常数:若采用十六进制数表示,其末尾必须加“H”说明;若十六进制数以A、B、C、D、E、F开头,其前面必须添1个“0”进行引导说明。若采用二进制数表示,其末尾必须用“B”说明;若采用十进制数表示,可以不加后缀或加“D”说明,例:把片外存储器2200H单元中的数送入片内70H单元中。标号域操作码域操作数域注释域BEGIN:MOVDPTR,#2200H;(DPTR)=2200HMOVR0,#70H;(R0)=70HMOVXA,DPTR;(A)=(DPTR)MOVR0,A;(R0)=(A),伪指令:为了便于编程和对汇编语言程序进行汇编,各种汇编程序都提供一些特殊的指令由伪指令确定的操作称为伪操作。伪指令又称汇编程序控制译码指令。“伪”体现在汇编时不产生机器指令代码,不影响程序的执行,仅指明在汇编时执行一些特殊的操作,4.1.2伪指令语句,指令格式为:ORG表达式含义:向汇编程序说明,下述程序段的起始地址由表达式指明。表达式通常为16进制地址码。一般规定,在由ORG伪指令定位时,其地址应当由小到大,不能重叠。有效范围一直到下一条ORG伪指令出现为止跟在ORG伪指令后面的程序段或数据段是绝对地址还是浮动地址段依赖于ORG右边的表达式性质,ORG(ORiGIN)汇编起始地址伪指令,ORG1000HSTART:MOVA,12H假定ORG右边的表达式是浮动程序段中定义的标号RELOCA,则ORGRELOCASUBROU:表明SUBROU起始于RELOCA(它是相对地址)浮动地址的程序段。,汇编结束伪指令一般有以下两种格式:主程序模块:标号END表达式子程序模块:标号END含义:通知汇编程序,该程序段汇编至此结束。END语句应设置在整个程序(包括伪指令在内)的后面。当源程序为主程序时,END伪指令中可有标号,这个标号应是主程序第一条指令的符号地址。若源程序为子程序,则在END伪指令中不需要带标号。,END(ENDofassembly)汇编结束伪指令,指令格式为:标号EQU表达式含义:把表达式赋值于标号,这里的标号和表达式是必不可少的。例如:LOOPEQU2002H是向汇编程序表明,标号LOOP的值为2002H。又如:LOOP1EQULOOPLOOP已赋值为2002H,则相当于LOOP1LOOP,即LOOPI也为2002H,在程序中LOOP和LOOP1可以互换使用。用EQU语句给一个标号赋值以后,在整个源程序中该标号的值是固定的,不能更改。,EQU(EQUate)赋值伪指令,指令格式为:DL含义:说明标号等值于表达式。同样,标号和表达式是必不可少的。例如;COUNTDL3000H;S定义标号COUNT的值为;3000HCOUNTDLCOUNT十1;重新定义COUNT的值为;3000Hl注:可用DL语句在同一源程序中给同一标号赋予不同的值,即可更改已定义的标号值;而用EQU语句定义的标号,在整个源程序中不能更改,DL定义标号值伪指令,指令格式为:标号DB表达式或表达式表含义:将表达式或表达式表所表示的数据或数据串存入从标号开始的连续存储单元中。标号为可选项,它表示数据存储单元地址。表达式或表达式表是指一个字节或用逗号分开的字节数据。可以是用引号括起来的字符串。字符串中的字符按ASCII码存于连续的ROM中。例如:ORG2000HTABLEDB73H,04,100,32,00,2,“ABC”表示字节串数据存入由TABLE标号为起始地址的连续存储器单元中。即从2000H存储单元开始依次连续存放数据为:73H,04H,64H,20H,00H,FEH,41H,42H,43H。,DB(DefineByte)定义字节伪指令,注意:若不采用ORG伪指令专门规定数据区的起始地址,则数据区的起始地址即根据DB命令前一条指令的地址确定。这时DB所定义的数据字节的起始地址为DB命令前一条指令的地址加上该指令的字节数。,指令格式为:标号DW表达式或表达式表含义:把字或字串值存入由标号开始的连续存储单元中,且把字的高字节数存入低地址单元,低字节数存入高地址单元。按顺序连续存放。DW100H,3456H,814表示按顺序存入01H,00H,34H,56H,03H,2EH注:DB和DW定义的数表,数的个数不得超过80个。若数据的数目较多时,可以使用多个定义命令。一般以DB来定义数据,以DW来定义地址。,DW(DefineWord)定义字伪指令,指令格式为:DS含义:通知汇编程序,在目标代码中,以标号为首地址保留表达式值的若干存储单元以备源程序使用。汇编时,对这些单元不赋值。例如:BASEDS100H通知汇编程序,从标号BASE开始,保留100H个存储单元,以备源程序另用。注意:对于80C51单片微机,DB、DW、DS等伪指令只能应用于程序存储器,而不能对数据存储器使用。,DS(DefineStorage)定义存储区伪指令,命令格式为:BIT含义:给字符名称赋予位地址。其中,位地址可以是绝对地址,也可以是符号地址。例:ABCBITP3.1把P3.1位地址赋值给ABC,在后面的编程中,ABC即可作为位地址P3.1使用,BIT位定义伪指令,例1.伪指令应用ORG8100HBUFFERDS10HDW“AB”DW100H,1ACH,-814说明:从8100H至810FH为缓冲区空间(8110H)=41H(A)(8111H)=42H(B)8112H单元起存放01H、00H、01H、ACH、FCH、D2H,4.280C51汇编语言程序设计,4.2.1顺序结构程序设计,例2.数据传送和交换。将R0与R7内容互换,R4与内存20H单元内容互换。XCHR:MOVA,R0XCHA,R7XCHA,R0;R0与R7内容互换MOVA,R4XCHA,20HXCHA,R4;R4与20H单元内容互换,设被加数存放于片内RAM的20H(低位字节)、21H(高位字节),加数存放于22H(低位字节)和23H(高位字节),运算结果的和数存放于20H(低位字节)和21H(高位字节)中。实现16位相加。START:PUSHACC;将A中内容进栈保护MOVR0,20H;将20H地址送R0MOVR1,22H;将22H地址值送R1MOVA,R0;被加数低字节内容送AADDA,R1;低字节数相加MOVR0,A;低字节数和存20H中,例3.不带符号多字节加法,INCR0;指向被加数高位字节INCR1;指向加数高位字节MOVA,R0;被加数高位字节送AADDCA,R1;高字节数带进位相加MOVR0,A;高字节数和存21H中CLRAADDCA,#00HMOV10H,A;进位暂存于10H中POPACC;恢复A原内容,多字节乘法的基础是加法。分别相乘后对应字节相加(个位、十位、百位等分别相加,并考虑低字节向高字节的进位)。选用工作寄存器暂存中间积。分析:设被乘数低字节(addrl)用A表示,高字节(addr2)用B表示;乘数低字节(addr3)用L表示,高字节(addr4)用M表示。,例.双字节乘法,双字节相乘的过程如下:,工作寄存器用来存放部分积,R2存放(HALLBLLMA),R3存放(HBL+CYHMALBM),R4存放(HBM十CY)START:PUSHPSW;PSW、A、B入栈PUSHACCPUSHBMOVPSW,18H;选用工作寄存器组3MOVR0,addrl;被乘数低字节地址送R0MOVR1,addr3;乘数低字节地址送R1MOVA,R0;被乘数低字节内容送APUSHA;被乘数低字节内容A压栈,MOVB,R1;乘数低字节内容送BMULAB;(1)ALMOVR0,A;积的最低字节存入addrl中MOVR2,B;HAL送R2中INCR0;指向被乘数高字节MOVA,R0;被乘数高字节送AMOVB,R1;乘数低字节送BMULAB;(2)BL,ADDA,R2;HALLBLMOVR2,A;HALLBI之和送R2MOVA,B;HBL送AADDCA,00H;HBLCYMOVR3,A;HBL送R3POPA;被乘数低字节内容L出栈INCR1;指向ddr4MOVB,R1;M送B,MULAB;(3)MAADDA,R2;LMA(R2)MOVR2,A;LMAHAL十LBL之和送R2MOVA,B;HMA送AADDCA,R3;HMAHBLCYMOVR3,A;HMAHBLCY之和送R3MOVR4,0;清R4,JNCLOOP;CY0,转LOOPINCR4;CY1,则(R4)R4lLOOPMOVA,R0;B送AMOVB,R1;M送BMULAB;(4)MBADDA,R3;HMAHBLLBMMOVR3,A;HMAHBLLBM之和送R3MOVA,B;HBM送AADDCA,R4;R4HBMRES3,MOVR1,A;RES3存入addr4中MOVA,R2;RES1存入addr2中MOVR0,ADECR1;指向addr3MOVA,R3;RES2存入addr3中MOVR1,APOPB;B、A、PSW出栈POPACCPOPPSW,对于带符号数的乘法,其原则为:原码相乘乘积的符号位为被乘数与乘数符号位的“异或”,查表:根据变量x,在表格中查找对应的y值,使yf(x)。y与x的对应关系可有各种形式,而表格也可有各种结构。一般表格常量设置在程序存储器的某一区域内。MOVCA,ADPTR;远程查表MOVCA,A+PC;近程查表,例.查表,设有一个巡回检测报警装置,需对4路输入进行控制,每路设有一个最大额定值,为双字节数。控制时需根据检测的路号找出该路对应的最大额定值。设R2用于寄存检测路号,查找到的对应的最大额定值存放于31H和32H单元中。查找最大允许额定值子程序如下:,地址机器码源程序注释ORG2000H2000EAMOVA,R2;检测路号送A20012AADDA,R2;(R2)22002F531MOV31H,A;距表首址偏移量20042408ADDA,#19H;偏移量200683MOVCA,A+PC;查表,读取第1个字节内容2007C531XCHA,31H;第1字节存入31H单元20092404ADDA,#15H;偏移量200B83MOVCA,A+PC;查表,读取第2字节200CF532MOV32H,A;第2字节存入32H单元200E,ORG2020H;最大额定值表20201230TAB:DW1230H,;路号020221540DW1540H;路号120242340DW2340H,;路号220262430DW2430H;路号3END说明:rel计算2020H-(2006H+1)=19H(2020H+1)-(200BH+1)=15H,设表中有1024个元素,每个元素为两个字节,则表格总长为2048个字节。现按R4和R5的内容从表格中查出对应的数据元素值,送存R4和R5中。TBDP1:MOVDPTR,addrl6;表格首地址值送DPTRMOVA,R5;查表参数低位字节送ACLRC;清CYRLCA;带进位左移一位XCHA,R4;将查表参数R4内容送ARLCA;带进位左移一位XCHA,R4;R4与R5内容互换,例.查表,ADDA,DPL;DPL查表参数低位字节MOVDPL,A;调整DPL、DPHMOVA,DPH;DPH送AADDCA,R4;DPH查表参数高位字节MOVDPH,A;相加和存DPHCLRA;清A,MOVCA,ADPTR;查表,读第1字节MOVR4,A;第1字节存入R4CLRA;清AINCDPTR;(DPTR)1MOVCA,ADPTR;查表,读第2字节MOVR5,A;第2字节存入R5RETTBDP2:DW;数据表DW,特点:程序执行流程中必然包含有条件判断,符合条件要求和不符合条件要求分别有不同的处理路径。在程序设计时,往往借助程序框图(判断框)来指明程序的走向。一般情况下,每个分支均需单独一段程序,在程序的起始地址赋予一个地址标号,以便当条件满足时转向指定地址单元去执行,条件不满足时仍顺序往下执行。,4.2.2分支结构程序设计,程序仅有两个出口,两者选一。通常用条件判跳指令来选择并转移。可实现单分支程序转移的指令有位条件转移指令,如:JC、JNC、JB、JNB和JBC等,还有一些条件转移指令,如:JZ、JNZ、DJNZ等。有3种典型形式,单分支结构,单分支结构示意图,设对addrl,addrl1的双字节数取补后存入addr2和addr2十1单元中,其中高位字节在高地址单元中。8位微机对双字节数取补需分两次进行。首先对低字节数取补,然后判其结果是否为全“0”。若为“0”,则高字节数取补;否则,高位字节数取反。START:MOVR0,addrl;原码低字节地址码送R0MOVR1,addr2;补码低字节地址码送R1MOVA,R0;原码低字节内容送ACPLAINCA;A内容取反加l,即取补MOVR1,A;低字节补码存addr2单元,例.求双字节补码程序,INCR0;指向原码高字节INCR1;指向补码高字节JZLOOP1;当(A)0,转LOOP1MOVA,R0;原码高字节送ACPLA;高字节内容取反MOVR1,A;字节反码存(addr2十1)单元SJMPLOOP2;转LOOP2,结束LOOP1:MOVA,R0;低字节补码为0CPLA;对高字节数取补INCAMOVR1,A;高字节补码存(addr2+1)单元LOOP2:END;结束,Y=a2b(当b10时)Y=a2b(当b10)转MMMOVR3,A;R3bMOVA,R0CLRC,SUBBA,,3;(R1)(R0)a2-bMOVR0,AMOVA,R1SUBBA,#00HMOVR1,AMMNN:MOVY0,R0;(Y1)(Y0)结果MOVY1,R1HERE:AJMPHERE注:Y1、Y0需用位定义伪指令赋值。,多分支结构:程序的判别部分有两个以上的出口流向。分支结构程序允许嵌套即一个程序的分支又由另一个分支程序所组成,从而形成多级分支程序结构。通常有两种形式,多分支选择结构,多分支结构示意图,80C51设有两条多分支选择指令:散转指令JMPADPTR散转指令由数据指针DPTR决定多分支转移程序的首地址,由累加器A中内容动态地选择对应的分支程序,可从多达256个分支中选一。比较指令CJNEA,direct,rel比较两个数的大小,必然存在大于、等于、小于3种情况,这时就需从3个分支中选一。另外,还可以使用查地址表的办法、查转移指令表的办法或通过堆栈来实现多分支程序转移。,设分支转移序号在R3中,分支程序入口地址放在BRTAB表中。MOVDPTR,#BRTAB;分支入口地址表首地址MOVA,R3RLA;2MOVR1,AINCA;取低位地址MOVCA,A+DPTRPUSHA;低位地址入栈MOVA,R1MOVCA,A+DPTR;取高位地址,并入栈PUSHARET;分支入口地址出栈送入PCBRTAB:DWBR0,BR1,;分支程序入口地址表注:RET指令与两条PUSH指令配对,压栈时先“低”后“高”。而DW伪指令在字节存放时,先“高”后“低”。,例.通过堆栈操作实现分支程序转移,由40H单元中动态运行结果值来选择分支程序(40H)0,转处理程序0(40H)1,转处理程序1(40H)n,转处理程序nSTART:MOVDPTR,addr16;多分支转移指令表首址送;DPTRMOVA,40H;40H单元内容送ACLRC;清CYRLCA;A内容左移一位,例.通过查转移指令表实现多分支程序转移,JNCTABLE;若CY0,转TABELINCDPH;若CYl,DPH内容十1TABEL:JMPA十DPTR;多分支转移ADDR16:AJMPLOOP0;转分支程序0AJMPLOOP1;转分支程序1AJMPLOOPn;转分支程序n由于选用绝对转移指令AJMP,每条指令占用两个字节,因此,要求A中内容为偶数,在程序中将选择参量(A中内容)左移一位。如果最高位为1,则将它加到DPH中,这样分支量可在0255中选一。,根据AJMP指令的转移范围,要求分支程序段和各处理程序入口均位于2KB范围内。如果要求不受此限制,可选用长跳转指令LJMP,但它需占用3个字节。START:MOVDPTR,ADDR16;分支程序段首址送DPTRMOVA,40H;选择参量送AMOVB,03H;乘数3送入BMULAB;参量3MOVR7,A;乘积低8位暂存R7中,MOVA,B;乘积高8位送AADDA,DPH;乘积高8位加到DPH中MOVDPH,AMOVA,R7JMPADPTR;多分支选择ADDR16:LJMPLOOP0;转分支程序0LJMPLOOP1;转分支程序1LJMPLOOPn;转分支程序n,CLRA;结果单元20H29H清零MOVR0,#10MOVR1,#20HLP:MOVR1,AINCR1DJNZR0,LPMOVR0,#100;100个数的计数器READ:MOVA,P1;读入P1,例.对从P1口输入的100个09的数进行概率统计,统计的数值分别存入20H29H中,CHK0:CJNEA,#0,CHK1;比较,不为“0”,继续比较INC20H;是“0”,则“0”计数单元加1SJMPEND0;是否全部统计完?CHK1:CJNEA,#1,CHK2INC21H;是“1”,则“1”计数单元加1SJMPEND0CHK2:CJNEA,#2,CHK3INC22H;是“2”,则“2”计数单元加1SJMPEND0,CHK3:CJNEA,#3,CHK4INC23H;是“3”,则“3”计数单元加1SJMPEND0CHK4:CJNEA,#4,CHK5INC24H;是“4”,则“4”计数单元加1SJMPEND0CHK5:CJNEA,#5,CHK6INC25H;是“5”,则“5”计数单元加1SJMPEND0,CHK6:CJNEA,#6,CHK7INC26H;是“6”,则“6”计数单元加1SJMPEND0CHK7:CJNEA,7,CHK8INC27H;是“7”,则“7”计数单元加1SJMPEND0,CHK8:CJNEA,#8,CHK9INC28H;是“8”,则“8”计数单元加1SJMPEND0CHK9:CJNEA,#9,ERRINC29H;是“9”,则“9”计数单元加1END0:DJNZR0,READ;判是否全部统计完?HERE:SJMPHEREERR:;非09,出错,4.2.3循环结构程序设计,计数循环结构示意图条件循环结构示意图,循环程序的4个部分(1)循环初始化(2)循环体(3)循环控制(4)结束部分,计数循环程序的特点是循环次数已知,必须在初始化部分设定计数的初值,循环控制部分依据计数器的值决定循环次数。一般均设置为减“1”计数器,每循环一次自动减“1”,直到回0时结束循环。DJNZRn,rel;以工作寄存器作控制计数器DJNZdirect,rel;以直接寻址单元作控制计数器,计数控制循环结构,DELAY:MOVR2data;预置计数循环控制常数DELAY1:DJNZR2,DELAY1;当(R2)0,转向本身RET根据R2的不同初值(0FFH),可实现4514个机器周期的延时,例.软件延时,结束条件:可以是搜索到某个参数(比如回车符“CR”),也可以是发生的某种变化(如故障引起电路电平变化)等,什么时侯结束循环是不可预知的。一般常用比较转移指令或条件判跳指令进行控制和实现。,条件控制循环结构,把内部RAM中起始地址为DATA的数据串传送到外部RAM以BUFFER为首地址的区域,直到发现“$”字符的ASCII码为止,数据串的最大长度在内存20H中。MOVR0,#DATA;数据区首地址MOVDPTR,#BUFFER;数据区长度指针LOOP:MOVA,R0CJNEA,#24H,LOOP2;判是否为“$”符(24H)SJMPLOOP1;是“$”符,则结束LOOP2:MOVA,R0;不是“$”符,则传送MOVXDPTR,A,例,INCR0INCDPTRDJNZ20H,LOOP;数据串未查完,继续LOOP1:注:一个是条件循环控制,以找到ASCII码“$”符为循环结束条件;笫二个是计数循环结构,万一找不到ASCII码“$”符,则由数据串的最大长度作为计数循环控制。,循环嵌套结构循环内套循环,也称多重循环。循环的执行过程是从内向外逐层展开的。内层执行完全部循环后,外层则完成一次循环,逐次类推。层次必须分明,层次之间不能有交叉,否则将产生错误。,子程序及其调用子程序是一段由专门的子程序调用指令CALL调用而以子程序返回指令RET结束的程序段。将那些需多次应用的、但完成的运算或操作相同的程序段,编制成一个子程序,并尽量使其标准化,存放于某存储区域。调用子程序的程序称为主程序或调用程序。,4.2.4子程序设计,子程序调用与返回过程示意图,注意事项:子程序入口条件保护现场与恢复现场断点、数据压栈、出栈顺序,说明文件,一般包含如下内容:子程序名子程序功能子程序入口条件和出口结果子程序所用的寄存器、存储单元、标志位等,提示主程序或调用程序是否需要在调用本子程序前对此进行保护子程序嵌套,子程序的特性,应用软件来进行数字滤波。中值滤波就是连续输入三个检测信号值,从中选择一个中间值为有效信号。入口条件:三次采集数据分别存储在内部存储器的20H、21H和22H中。出口结果:中间值在R0寄存器中。使用资源:累加器A、R0及内存20H、21H和22H。,例.中值数字滤波子程序,ORG2100HFILLE:PUSHPSW;PSW及ACC保护入栈PUSHACCMOVA,20H;取第一个数据CLRCSUBBA,21H;与第二个数据比较,JNCLOB1;第一个数据比第二个数据大,转;LOB1MOVA,20H;第一个数据比第二个数据小,交换;二个数的位置XCHA,21HMOV20H,ALOB1:MOVA,22HCLRCSUBBA,20H;第三个数据与前二个数据中的较大;数比较JNCLOB3;第三个数据大于前二个数据中的较;大数,转LOB3,MOVA,22HCLRCSUBBA,21H;第三个数据与前二个数据中的较小数比较JNCLOB4MOVA,21HMOVR0,ALOB2:POPACC;恢复ACC和PSWPOPPSWRET,LOB3:MOVA,20HMOVR0,AAJMPLOB2LOB4:MOVA,22H;存入中值MOVR0,AAJMPLOB2,把外部RAM30H3FH共16个单元中的ASCII码依次转换为十六进制数,并拼装压缩存入内部60H67H共8个单元中。ASCTOH:MOVR0,#30H;设ASCII码地扯指针MOVR1,#60H;设十六进制数地址指针MOVR7,#08H;拼装的十六进制数字节个数。AB:ACALLTRAN;调用转换子程序。SWAPAMOVXR1,AINCR0,例.码制转换,ACALLTRAN;调用转换子程序。XCHDA,R1XCHDA,R1INCR0INCR1DJNZR7,ABHALT:SJMPHALT,TRAN:CLRC;ASCII码数转换为十六进制数子程序MOVXA,RSUBBA,#30HCJNEA,#0AH,BBAJMPBCBB:JCDONEBC:SUBBA,#07H;0AH,则再减07HDONE:RET,注:转换算法把欲转换的ASCII码数减30H,若小于0则为非十六进制数,若为09,即为转换结果。若0AH,则应再减07H(“41H”“A”),若在0AH0FH间,即为转换结果,若小于0AH或大于0FH,均为非十六进制数。标号为TRAN的子程序实现ASCII码数转换为十六进制数,调用前应把欲转换的ASCII码数放在以R0间接寻址的单元中,转换结果在累加器A中。,数据排序程序常用的有插入排序法、冒泡排序法、快速排序法、选择排序法、堆积排序法、二路归并排序法及基数排序法等。冒泡法是一种相邻数互换的排序方法。从前向后进行相邻数比较,若数据的大小次序与要求的顺序不符时(逆序),就将二数互换,正序时不交换,假定是升序排序,则通过这种相邻数互换方法,使小数向前移,大数向后移,从前向后进行一次冒泡(相邻数互换),把最大数换到最后,再进行一次冒泡,就会把次大数排在倒数第二,直至冒泡结束。,4.2.5程序设计举例,假定原始数据为5FH,38H,7H,13H,44H,D8H,22H冒泡过程:5FH,38H,7H,13H,44H,D8HH,22H(逆序,则两数互换)38H,5FH,7H,13H,44H,D8H,22H(逆序,则两数互换)38H,7H,5FH,13H,44H,D8H,22H(逆序,则两数互换)38H,7H,13H,5FH,44H,D8H,22H(逆序,则两数互换)38H,7H,13H,44H,5FH,D8H,22H(正序)38H,7H,13H,44H,5FH,D8H,22H(逆序,则两数互换),第一次冒泡结束:38H,7H,13H,44H,5FH,22H,D8H第二次冒泡结束:7H,13H,38H,44H,22H,5FH,D8H第三次冒泡结束:7H,13H,38H,22H,44H,5FH,D8H第四次冒泡结束:7H,13H,22H,38H,44H,5FH,D8H第五次冒泡结束:7H,13H,22H,38H,44H,5FH,D8H,说明:每次冒泡都从向后排定了一个大数(升序),每次冒泡所需进行的比较次数都递减,例如有n个数排序,则第一次冒泡需比较(n-1)次,第二次冒泡则需(n-2)次,实际编程中为了简化程序,往往把各次比较次数都固定为(n-1)次。对于n个数,理论上说应进行(n-1)次冒泡才能完成排序,但实际上往往不到(n-1)次就已排好序。判定排序是否完成的最简单方法是每次冒泡中是否有互换发生,如果有互换发生,说明排序还没完成。控制排序结束常不使用计数方法,而使用设置互换标志的方法,以其状态表示在一次冒泡中有无数据互换进行。,在一组测量数据中,挑选出大于标准m的数值作为合格的产品,而那些小于m的数值作为不合格产品,则被剔除掉。设数据组为X1、X2、X10共10个。ORG0000H0000HC200PX:CLR00;设交换过标志0002H7B09MOVR3,#09H;10个数据比较,第一次;比较两个数据,比较次数为(n-1)次0004H7850MOVR0,#50H;10个单元无符号数存;放首址0006HE6MOVA,R0,例数据排序,0007H08PX1:INCR00008HF9MOVR1,A0009H96SUBBA,R0;DXDX+1000AHE9MOVA,R1000BH4006JCPX2;DXDX+1量交换标志位,20H.0=1,000FHC6XCHA,R0;DX与DX+1交换0010H18DECR00011HC6XCHAVR00012H08INCR00013HE6PX2:MOVA,R0;ADX+10014HDBF1DJNZR3,PX1;比较9次0016H2000E7JB00H,PX;有交换则再比较一遍0019H80FEEND0:SJMPEND0执行结果(50H)中为最小数,(59H)中为最大数。,已知采样值(无符号数)存放在外部RAM1000H100FH中,试编程找出其中的最大值存入内部RAM区的20H中。ORG0000HMOVR0,#10H;采样值数据区长度MOVDPTR,#1000H;采样值存放首址MOV20H,#00H;最大值单元初始值设为最小数LP:MOVXA,DPTR;取采样值CJNEA,20H,CHK;数值比较SJMPLP1;相等,则转移,查找无符号数中最大值程序,CHK:JCLP1;A值小,转移MOV20H,A;A值大,则送20HLP1:INCDPTRDJNZR0,LP;继续HERE:SJMPHERE;结束,注:20H中始终存放两个数比较后的大值,比较结束后存放的即是最大值。*若要寻找最小值,只要在初始化时,把可能的最大值放入最小值存放单元,比较转移用的标志位由C改为NC即可,3.数据搜索程序在数据区中寻找关键字,称为数据搜索。常用的方法有两种,即顺序搜索和对分搜索。顺序搜索:把关键字与数据区中的数据逐个比较,相等者即为找到的关键字。对分搜索:按对分原则进行取数与关键字比较,但前提是数据区中的数已排好序,这样搜索一次后,搜索的数据区范围缩小一半,搜索速度快,已知数据区内有16个数,从内部RAM30H开始存放,要搜索的关键字在20H中,若数据区中搜索到关键字,则在21H中记录关键字在数据区中的序号,若数据区中没有搜索到关键字,则置用户标志F0为1。ORG0000HMOVR0,#30H;数据区首址MOVR1,#16;数据区长度MOV20H,#KEY;关键字送20H单元CLRF0;清用户标志位MOV21H,#01;序号置1,例.搜索关键字,LP:MOVA,R0;取数CJNEA,20H,LP1HERE:SJMPHERE;找到关键字,结束LP1:INC21H;序号加1INCR0;数据区地址指针加1DJNZR1,LP;继续SETBF0;未搜索到关键字,则置位用户标志SJMPHERE,END,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


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