您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 单片机-第四章 单片机程序设计与调试
1、伪指令2、顺序程序和分支程序设计第四章单片机的程序设计3、循环和查表程序设计4、子程序和中断程序设计伪指令汇编语言格式标号段操作码字段操作数段注释段(LABLE)(OPCODE)(OPRAND)(COMMENT)标号字段操作码字段操作数字段标号字段位于一条语句的开头,用于存放语句的标号,以表明标号所在指令码的内存地址。标号字段和操作码字段有冒号“:”相隔。为指令操作码规定的符号。是指令不可缺少的部分。可有可无,两个操作数间用“,”隔开。操作数和指令码字段间用空格隔开。操作数通常5种表示形式。注释字段为阅读程序而加的说明,可有可无,它不是源程序的一部分,因此汇编时将忽略这一部分。注释段与源程序之间以“;”隔开。;首址送R0;长度送R1;检查长度是否为零;为零则结束;不为零则开始运算;加一个数;长度减1不为零则转移;存和起始地址程序主体汇编结束标志标号注释MOVR1,DATA1CJNER1,#0,NEXTORG2000HSTART:MOVR0,#DATA1HERE:SJMP$NEXT:CLRALOOP:INCR0ADDA,@R0DJNZR1,LOOPMOVSUM,ASJMPHEREDATA1DATA20HSUMDATA1FHEND汇编语言构成1、指令性语句2、指示性语句1)ORG伪指令ORG伪指令用来规定某程序段的起始地址。格式:ORG〈表达式〉语句指定了段内在此语句后的程序或数据块存放的起始地址,即以语句中的表达式的值为起始地址,连续存放,直到遇到一个新的ORG语句。2)END伪指令标志着整个源程序的结束。格式为:END表达式产生一个存储器地址值,这个地址是当程序执行时,第一条要执行的指令地址3)EQU伪指令EQU语句给符号名定义一个值,或定义成别的符号名,甚至可定义为一条可执行的指令等。格式:NAMEEQU表达式可以是一个常数,地址表达式等4)DATA(数据地址赋值)伪指令格式:NAMEDATA表达式DATA与EQU格式相似,但有区别6)DB伪指令定义字节型常数指令。例:DB12H,100,‘A’7)DW伪指令定义字型常数指令。例:DW1234H,5678H8)DS伪指令5)BIT伪指令定义存储空间伪指令,用于预留一定数量的内存单元。位地址赋值伪指令,用于给以符号形式的位地址赋值。源程序的设计步骤一、明确设计任务和选择算法;二、确定系统规划和程序结构;三、画程序流程图;四、编写源程序编制源程序。1.合理分配存储器单元和了解I/O接口地址。2.按功能设计程序,明确各程序之间的相互关系。3.用注释行说明程序,便于阅读、修改和调试。(1)采用模块化的程序设计方法(2)尽量采用循环结构和子程序(3)合理分配内存单元(4)正确使用转移指令源程序设计注意事项模块化的程序设计方法具有如下优点:单个模块的程序功能单一,结构层次一目了然,易于编写、调试和修改。便于分工,从而可使多个程序员同时进行程序的编写和调试工作,加快软件研制进度。程序可读性好,便于程序的优化、扩充和版本升级。对程序可进行局部修改,其他部分可以保持不变。对于使用频繁的子程序可以建立子程序库,便于多个模块调用。(1)采用模块化的程序设计方法采用循环结构和子程序可以使程序所占用的存储空间大大减少,节省了存储空间单元,提高程序的运行效率。对于循环程序尤其是多重循环程序,要注意循环初值的设置和循环结束条件的判断,避免出现程序无休止循环的“死循环”现象。对于通用的子程序,考虑到其通用性,除了用于存放子程序入口参数的寄存器外,程序中用到的其他寄存器的内容应压入堆栈,即保护现场。但要特别注意恢复现场的出栈顺序要与入栈顺序相反,符合堆栈的操作规则。对于中断处理子程序也要注意类似的问题。(2)尽量采用循环结构和子程序工作寄存器R0和R1具有地址指针功能,应充分发挥其作用,避免用作其他寄存器。20H~2FH单元具有位寻址功能,通常用来存放各种软件标志、逻辑变量、状态信息等。30H~7FH单元作为一般寄存器区域,通常用来存放各种参数、指针、中间结果或作为数据缓冲区。如果程序中需要使用08H单元以后的工作寄存器组,通常把堆栈设置在内部RAM的高端处,即30H~7FH单元。(3)合理分配内存单元(4)正确使用转移指令尽量少用无条件转移指令。这样可以使程序的条理更加清楚,从而减少错误。子程序内部的转移最好使用相对转移指令,使所编写的子程序可以放在64KB程序存储器ROM的任何地方,增加子程序的通用性,便于主程序调用。顺序程序设计例:双字节变补程序(设数据在R0R1中):ORG0200HMOVA,R0;取低字节CPLAADDA,#01H;低字节变补MOVR2,AMOVA,R1;取高字节CPLAADDCA,#00H;高字节变补MOVR3,A开始结束处理处理处理应用项目中的主程序除去最后两条指令,余下的指令所构成的程序为顺序程序结构,其对应的程序流程图如图所示;②主程序:9ORG0050H10MAIN:MOVA,#03H;8155初始化命令字11MOVDPTR,#8000H;8155命令口地址12MOVX@DPTR,A;向8155写入命令字13MOVSP,#5AH;栈底移至5AH14MOV2BH,#60H;秒计数基制15MOV2CH,#60H;分计数基制16MOV2DH,#24H;时计数基制17MOVTMOD,#01H;定时器工作方式118MOVTH0,#3CH;置T0初值19MOVTL0,#0B0H20MOVIE,#87H;允许中断21SETBTR0;启动定时器T0……应用项目源程序分支程序单重分支程序一个判断决策框,程序有两条出路。两种分支结构:例:求R2中补码绝对值:正数不变,负数变补。MOVA,R2JNBACC.7,NEXT;为正数?为0跳CPLA;负数变补INCAMOVR2,ANEXT:SJMPNEXT;结束YN条件满足?影响条件处理1处理2YN条件满足?影响条件处理段由条件转移指令构成程序判断框部分,形成程序分支结构。例:FRT:MOVA,40H;取行李重量计价单位GMOVR3,AMOVB,#03H;M=G×3MULABMOVR2,A;暂存3GMOVA,R3;取回GCJNEA,#05H,L1;G=5?G≠5跳L1SJMPWETCL1:JCWETC;是,转至WETC(C=1即G<5跳)SUBBA,#05H;否则M=3G+2(G-5)RLCAADDA,R2SJMPL2WETC:MOVA,R2L2:MOV41H,A;存结果MRET内部RAM41H40H......重量(变量)价格(结果)G=5?=:跳WETC≠:G<5:跳WETCG>5:顺序执行行李计价:当G≤5,M=G×3;当G>5,M=G×3+(G-5)×(5-3)例:求符号函数Y=SGN(X)+1(当X0)SGN(X)=0(当X=0)-1(当X0)SYMB:MOVA,40H;取XJZSTOR;X=0跳,Y=XJBACC.7,MINUS;X<0(A.7=1跳)MOVA,#01H;X>0,Y=+1SJMPSTORMINUS:MOVA,#0FFH;X<0,Y=-1STOR:MOV41H,A;保存YRET开始结束YNX=0?取XY=+1X<0?Y=-1Y=0保存YNY内部RAM41H40H......X(变量)Y(函数)3、采用分支号入口地址组成表如:当分支号=0,程序转移到ADDR0处;当分支号=1,程序转移到ADDR1处;…。A=?转向0分支A=0A=1A=n-1A=n……转向1分支转向n-1分支转向n分支2、采用地址偏移量组成表1、采用转移指令组成表各个环节任务:一、初始化部分:循环准备工作。如:清结果单元、设指针、设循环控制变量初值等。二、循环体:循环工作部分:需多次重复处理的工作。循环控制部分:1.修改指针和循环控制变量。2.检测循环条件:满足循环条件,继续循环,否则退出循环。三、结束部分:处理和保存循环结果。允许0次循环的循环结构:在循环工作之前检测循环条件。YN循环控制?循环工作循环结束循环初始化循环程序设计求n个单字节数据的累加,设数据串已在43H起始单元,数据串长度42H单元,累加和不超过2个字节。SUM:MOVR0,#42H;设指针MOVA,@R0MOVR2,A;循环计数器←nCLRA;结果单元清0MOVR3,AADD1:INCR0;修改指针ADDA,@R0;累加JNCNEXT;处理进位(C=0跳)INCR3;有进位,高字节加1NEXT:DJNZR2,ADD1;循环控制:数据是否加完?MOV40H,A;循环结束,保存结果MOV41H,R3RET片内RAM……Xn……43HX142Hn41HSUMH40HSUMLR0→计数控制:为一串7位ASCII码数据的D7位加上奇校验,设数据存放在片外RAM的2101H起始单元,数据长度在2100H单元。MOVDPTR,#2100HMOVXA,@DPTRMOVR2,ANEXT:INCDPTRMOVXA,@DPTRORLA,#80HJNBP,PASS;P=0:1的个数为偶数,跳MOVX@DPTR,APASS:DJNZR2,NEXTDONE:SJMPDONE片外RAM……2102H111010002101H001011012100Hn设循环计数器,控制循环次数。正计数和倒计数两种方式。特征控制:找正数表最小值。正数表存在片外RAM中以LIST为起始单元,用-1作为结束标志。START:MOVDPTR,#LIST;数表首地址MOVB,#127;预置最小值NEXT:MOVXA,@DPTR;取数INCDPTR;修改指针CJNEA,#-1,NEXT1;是否为数表结尾?(A≠-1跳)SJMPDONE;循环结束NEXT1:CJNEA,B,NEXT2;比较(A≠B跳)NEXT2:JNCNEXT;C=0跳MOVB,A;保存较小值SJMPNEXTDONE:SJMPDONELIST片外RAM...-1设定循环结束标志实现循环控制1、单循环定时程序:MOVR5,#TIMELOOP:NOPNOPDJNZR5,LOOP软件延时程序:1T1T1T2T设:fOSC=6MHz,则T=12/6MHz=2st=(1+4×TIME)×T=2+8×TIME(s)用循环程序将指令重复多次执行,实现软件延时。试计算延时程序的执行时间。源程序指令周期(M)指令执行次数DELAY:MOVR6,#64H(=100)1I1:MOVR7,#0FFH(=255)1I2:DJNZR7,I22DJNZR6,I12RET2延时时间计算:(设时钟fOSC=12MHz)T=1st=(1×1+1×100+2×100×255+2×100+2×1)×T=51.303ms1100100×25510012、多重循环定时:用循环程序将指令重复多次执行,实现较长时间的延时。
本文标题:单片机-第四章 单片机程序设计与调试
链接地址:https://www.777doc.com/doc-3370821 .html