单片机——程序的基本结构

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

♨♨✎2.7程序的基本结构一、绪论二、基本结构1.顺序结构2.分支结构3.查表结构4.子程序结构5.循环结构♨✎绪论在汇编语言程序设计中,普遍采用结构化程序设计方法。任何复杂的程序都可由顺序结构、分支结构、循环结构、子程序结构等程序构成。结构程序设计的特点是程序的结构清晰、易于读写和验证、可靠性高。♨✎不管多么简单或复杂的程序,总离不开若干顺序程序段所组成的。如图1所示,A框和B框分别代表不同的程序段,是A、B顺序执行。它是最简单、最基本的程序结构,其特点是按指令的排列顺序一条条地执行,直到全部指令执行完毕为止。图2-7-1顺序程序结构ABab♨✎几种基本结构顺序结构分支结构查表结构子程序结构循环结构基本结构顺序结构分支结构查表结构子程序结构循环结构♨✎顺序结构程序段A程序段B顺序结构程序:是一种最简单、最基本的程序,按照程序编写的顺序逐条依次执行,直到程序结束。这是程序的最基本的形式,任何程序都离不开这种形式。顺序结构♨✎【例1】将片内RAM的20H单元中的压缩BCD码拆成两个ASCII码存入21H、22H单元。高4位转换后存在21H单元,低4位转换后存在22H单元。图1-2压缩BCD码转换成两个ASCII字符图方法一分析:两个BCD码拼装在一个单元内叫压缩BCD码。设20H内为压缩BCD码59,22H通过变换BCD码“5”为ASCII码“35”;BCD码“9”变换为ASCII码“39”。♨✎程序入口:20H程序出口:21H、22H根据分析图设计程序:MOVA,20HANLA,#0FH;屏蔽高4位ADDA,#30H;得到低4位ASCII码MOV21H,A;个位ASCII码送21HANL20H,#0F0H;屏蔽低4位MOVA,20H;送ASWAPA;高位交换到低位ADDA,#30H;得到高4位ASCII码MOV22H,A;十位ASCII码送22H♨✎分支结构顺序结构程序只能解决一些简单的算术、逻辑运算、传送操作等。实际控制问题往往要求计算机能根据给定的条件进行判断,再选择不同的处理路径,从而表现出某种智能。程序要求改变程序执行顺序,即程序的流向有两个或两个以上时,这种程序结构称为分支程序结构,分支程序的特点是程序中包含有转移指令。根据分支出口的不同分为简单分支程序和多路分支程序。♨✎分支结构程序段A程序段B分支结构:程序中含有转移指令分支结构无条件分支有条件分支单分支结构多分支结构条件YN分支结构♨✎程序段2条件满足吗?YN开始程序段1程序段3结束分支程序2开始程序段1结束数字关键码分支程序3分支程序1程序段2(b)多分支结构分支程序的两类结构(a)单分支结构♨✎【例2】有一离散函数如下式所示,试编写程序,根据x求y的值,设变量x保存在30H中,结果存入31H单元。已知y=𝒙𝒙𝟎𝟑𝒙=𝟎𝟓+𝒙𝒙𝟎解:单片机中负数一般用补码表示,只要能够判断x=0、x<0和x>0便能够方便实现函数。采用JZ指令进行判断,程序流程图如图2-1所示。图2-7-2程序流程图♨✎START:MOVA,30HJZOUT;x=0,转移ANLA#80H;x≠0,判断正负号JZOUT1;x小于0,y=xMOV31H,30HSJMPOKOUT:MOV31H,#3;x=0,则y=3OUT1:MOVA,#5;x>0,y=5+xADDA,30HMOV31H,AOK:SJMP$♨✎查表结构MCS-51汇编指令系统提供了两条专用的查表指令:MOVCA,@A+DPTR基址寄存器DPTR能提供16位基址,因此查表范围可达64KB空间,且表格的大小和位置也可在64KBROM中任意安排。MOVCA,@A+PC表格只能放在该指令的256个地址单元内,地址需要调整。查表是把事先安排的数据按照一定的顺序编制成表格存放在ROM中,然后根据输入的数据,从表格中查出所需的结果。查表可以将复杂的问题变得简单。♨✎【例3】根据项目一流水灯电路电路,采用查表方法实现相同功能。解:用查表法实现流水灯,要设计一个LED点亮码表格,根据8个LED点亮次序,制作数码表格,为了循环点亮LED,在点亮第8个LED后返回点亮第1个LED,表格可以设置一个结束标志码FFH。当取显示码为结束标志FFH时,返回取第1个显示码。♨✎ORG0000HLJMPSTRATORG0100HSTRAT:MOVR1,#0;R1用于计数,R1清零MOVDPTR,#TAB;设置表地址指针GO:MOVA,R1LOOP:MOVCA,@A+DPTR;查表取显示码CJNEA,#0FFH,OK;不是结束码显示码送P0口SJMPSTRAT;是结束码,重新开始OK:MOVP0,ALCALLDEL;延时1sINCR1;循环左移一次SJMPGO(此处略延时程序DEL)TAB:DB0FEH,0FDH,0FBH,0F7H,0EFHDB0DFH,0BFH,7FH,0FFH;LED点亮码,0FFH为结束码..........END♨✎可以被调用的程序段称为子程序。在实际问题中,常常会遇到在一个程序中有许多相同的运算或操作,例如多字节的加、减、字符处理等。如果每遇到这些运算和操作,都从头做起,则使程序非常繁琐且浪费内存。因此在实际应用中,通常把这些多次使用的程序段,按一定结构编好,存放在内存中,当需要时,程序可以去调用这些独立的程序段。因此,字程序就是一种能完成某一特定任务的程序段。子程序♨✎子程序的设计1、给每个子程序赋予名字2、现场保护与恢复3、参数的正确传递4、子程序说明♨✎在编写子程序时应注意以下问题1、子程序应有入口地址(用标号)2、主程序调用子程序两个子程序调用指令:(1)绝对调用指令:ACALLaddr11(2)长调用指令:LCALLaddr16♨✎在编写子程序时应注意以下问题3、注意设置堆栈指针和现场保护4、最后一条指令必须是RET指令5、子程序可以嵌套,即子程序可以调用子程序(最多8层)6、在子程序调用时,还要注意参数传递的问题♨✎子程序的基本结构MAIN:┇;IN为主程序或调用程序标号┇LCALLSUB;调用子程序SUB┇┇SUB:PUSHPSW;现场保护PUSHACC子程序处理程序段POPACC;现场恢复POPPSWRET;最后一条指令必须为RET♨✎【例4】编写一个通用子程序,实现N个单字节无符号数之和(N100H)。调用该子程序完成将片内部30H~5FH中存放的单字节无符号数求和,结果存入60H、61H单元中(高位在前)。♨✎ORG0100HSUB2:PUSHPSW;保护现场MOV@R1,#0;目的单元清0INCR1MOV@R1,#0LOOP:MOVA,@R0;取数ADDA,@R1;求和MOV@R1,A;存和的低字节数DECR1;修改指针,指向和的高位地址CLRAADDCA,@R1;取进位位MOV@R1,A;存和的高字节数INCR1;修改指针,指向和的低位地址INCR0;修改指针,指向下一个单元DJNZR2,LOOPPOPPSW;恢复现场RET(1)子程序如下:♨✎ORG0000HMAIN:MOVR0,#30H;设置R0为入口指针寄存器MOVR1,#60H;设置R1为出口指针寄存器MOVR2,#2FH;设置R2传递字节数ACALLSUB2……TOEND:END(2)子程序如下:♨✎在应用程序中,有时需要多次反复执行相同的操作,只是操作的操作数不同,这时就可以采用循环程序结构。循环程序可以显著缩短程序,减少程序所占用的存储空间,使程序结构大大优化。循环结构循环程序一般包括以下几部分:(1)设置循环初值在进入循环之前,要设置循环次数、循环体工作单元的初值等。(2)循环处理循环体是循环程序需要反复执行的部分,是循环程序结构的主体部分。(3)循环修改每执行一次循环,要对参数进行修改,使指针指向下一数据所在的位置,为进入下一轮循环作准备。(4)循环控制应用程序的条件判断循环程序是否结束。♨✎循环程序有两种基本结构,图2-7-3循环程序基本结构一种是先执行后判断,一种是先判断后执行。♨✎【例5】设8051使用12MHz晶振,试设计延迟100ms的延时程序。(一般延时程序采用循环程序结构)DELAY:MOVR2,#200;延时一个机器周期T=1msLOOP1:MOVB,#250;每循环延时1msLOOP2:NOPDJNZB,LOOP2;250*2=500msDJNZR2,LOOP1;0.5ms*200=100msRET延时程序如下:♨✎【例6】对项目一流水灯电路,要求每个LED闪亮5次(亮灭各0.5s)后,再转到下一个LED闪亮,循环不止。ORG0000H;程序开始地址MAIN:MOVA,#0FEH;初值11111110送P0口;低电平点亮LEDLOOP:MOVR5,#5;闪烁次数设置MOVP0,ALCALLDEL;延时0.5sLOOP1:MOVP0,#0FFH;LED熄灭0.5sLCALLDELMOVP0,A;LED点亮0.5s解:本例是一种常用循环程序结构,用R5作闪烁次数计数♨✎LCALLDELDJNZR5,LOOP1;闪烁没有到5次,返回继续RLA;闪烁5次后转到下一个LEDJMPLOOPDEL:MOVR1,#20;以下是0.5s延时子程序DL3:MOVR2,#50DL2:MOVR3,#250DL1:DJNZR3,DL1DJNZR2,DL2DJNZR1,DL3RETEND;程序结束♨✎♨谢谢指导!谢指导指导谢指导指导谢谢指导!谢谢指导!!指

1 / 31
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功