单片机——程序的基本结构ppt课件.pptx
MCS51 单片机,2. 7 程序的基本结构,2. 7 程序的基本结构,一、绪论,二、基本结构,1. 顺序结构,2. 分支结构,3. 查表结构,4. 子程序结构,5. 循环结构,绪 论,在汇编语言程序设计中,普遍采用结构化程序设计方法。任何复杂的程序都可由顺序结构、分支结构、循环结构、子程序结构等程序构成。结构程序设计的特点是程序的结构清晰、易于读写和验证、可靠性高。,不管多么简单或复杂的程序,总离不开若干顺序程序段所组成的。如图1所示,A框和B框分别代表不同的程序段, 是A、B顺序执行。它是最简单、最基本的程序结构,其特点是按指令的排列顺序一条条地执行,直到全部指令执行完毕为止。,图2-7-1 顺序程序结构,A,B,a,b,基本结构,顺序结构,分支结构,查表结构,子程序结构,循环结构,顺序结构,程序段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 根据分析图设计程序:MOV A, 20HANL A, #0FH ;屏蔽高4位ADD A, #30H ;得到低4位ASCII码MOV 21H, A ;个位ASCII码送21HANL 20H, #0F0H ;屏蔽低4位MOV A, 20H ;送ASWAP A ;高位交换到低位ADD A, #30H ;得到高4位ASCII码MOV 22H,A ; 十位ASCII码送22H,分支结构,顺序结构程序只能解决一些简单的算术、逻辑运算、传送操作等。实际控制问题往往要求计算机能根据给定的条件进行判断,再选择不同的处理路径,从而表现出某种智能。 程序要求改变程序执行顺序,即程序的流向有两个或两个以上时,这种程序结构称为分支程序结构,分支程序的特点是程序中包含有转移指令。根据分支出口的不同分为简单分支程序和多路分支程序。,分支结构,程序段A,程序段 B,分支结构:程序中含有转移指令,条件,Y,N,分支结构,(b)多分支结构,分支程序的两类结构,(a)单分支结构,【例2】有一离散函数如下式所示,试编写程序,根据x求y的值,设变量x保存在30H中,结果存入31H单元。已知 y= ,解:单片机中负数一般用补码表示,只要能够判断x0、 x0和 x0便能够方便实现函数。采用JZ指令进行判断,程序流程图如图21所示。,图2-7-2 程序流程图,START: MOV A,30H JZ OUT ;x0, 转移 ANL A #80H ;x0,判断正负号 JZ OUT1 ;x小于0,yx MOV 31H, 30H SJMP OK OUT: MOV 31H, #3 ;x0,则y3 OUT1: MOV A, #5 ;x0,y5+x ADD A , 30H MOV 31H, A OK: SJMP $,查表结构,MCS51汇编指令系统提供了两条专用的查表指令:,MOVC A,A+DPTR 基址寄存器DPTR能提供16位基址,因此查表范围可达64KB空间,且表格的大小和位置也可在64KB ROM中任意安排。,MOVC A,A+PC 表格只能放在该指令的256个地址单元内,地址需要调整。,查表是把事先安排的数据按照一定的顺序编制成表格存放在 ROM 中,然后根据输入的数据,从表格中查出所需的结果。查表可以将复杂的问题变得简单。,【例3】 根据项目一流水灯电路电路,采用查表方法实现相同功能。,解: 用查表法实现流水灯,要设计一个LED点亮码表格,根据8个LED点亮次序,制作数码表格,为了循环点亮LED,在点亮第8个LED后返回点亮第1个LED,表格可以设置一个结束标志码FFH。当取显示码为结束标志FFH时,返回取第1个显示码。,ORG 0000H LJMP STRAT ORG 0100H STRAT:MOV R1,#0 ; R1用于计数,R1清零 MOV DPTR,#TAB ; 设置表地址指针 GO:MOV A, R1 LOOP: MOVC A,A+DPTR ;查表取显示码 CJNE A,#0FFH,OK ;不是结束码显示码送P0口 SJMP STRAT ;是结束码,重新开始 OK:MOV P0,A LCALL DEL ;延时1s INC R1 ;循环左移一次 SJMP GO (此处略延时程序DEL) TAB:DB 0FEH,0FDH,0FBH,0F7H,0EFH DB 0DFH,0BFH,7FH,0FFH ;LED点亮码,0FFH为结束码 . END,可以被调用的程序段称为子程序。在实际问题中,常常会遇到在一个程序中有许多相同的运算或操作,例如多字节的加、减、字符处理等。如果每遇到这些运算和操作,都从头做起,则使程序非常繁琐且浪费内存。因此在实际应用中,通常把这些多次使用的程序段,按一定结构编好,存放在内存中,当需要时,程序可以去调用这些独立的程序段。因此,字程序就是一种能完成某一特定任务的程序段。,子程序,子程序的设计,1、给每个子程序赋予名字,2、现场保护与恢复,3、参数的正确传递,4、子程序说明,在编写子程序时应注意以下问题,1、子程序应有入口地址(用标号),2、主程序调用子程序,两个子程序调用指令:,(1)绝对调用指令:ACALL addr11,(2)长调用指令:LCALL addr16,在编写子程序时应注意以下问题,3、注意设置堆栈指针和现场保护,4、最后一条指令必须是RET指令,5、子程序可以嵌套,即子程序可以调用子程序(最多8层),6、在子程序调用时,还要注意参数传递的问题,子程序的基本结构,MAIN: ; IN为主程序或调用程序标号 LCALL SUB ;调用子程序SUB SUB:PUSH PSW ;现场保护 PUSH ACC 子程序处理程序段POP ACC ;现场恢复POP PSWRET ;最后一条指令必须为RET,【例4】编写一个通用子程序,实现N个单字节无符号数之和(N 100H)。调用该子程序完成将片内部30H5FH中存放的单字节无符号数求和,结果存入60H、61H单元中(高位在前)。,ORG 0100H SUB2:PUSH PSW ;保护现场 MOV R1,#0 ;目的单元清0 INC R1 MOV R1,#0 LOOP:MOV A,R0 ;取数 ADD A,R1 ;求和 MOV R1,A ;存和的低字节数 DEC R1 ;修改指针,指向和的高位地址 CLR A ADDC A,R1 ;取进位位 MOV R1,A ;存和的高字节数 INC R1 ;修改指针,指向和的低位地址 INC R0 ;修改指针,指向下一个单元 DJNZ R2,LOOP POP PSW ;恢复现场 RET,(1) 子程序如下:,ORG 0000H MAIN: MOV R0,#30H ;设置R0为入口指针寄存器 MOV R1,#60H ;设置R1为出口指针寄存器 MOV R2,#2FH ;设置R2传递字节数 ACALL SUB2 TOEND: END,(2) 子程序如下:,在应用程序中,有时需要多次反复执行相同的操作,只是操作的操作数不同,这时就可以采用循环程序结构。循环程序可以显著缩短程序,减少程序所占用的存储空间,使程序结构大大优化。,循环结构,循环程序一般包括以下几部分:,(1)设置循环初值 在进入循环之前,要设置循环次数、循环体工作单元的 初值等。,(2)循环处理 循环体是循环程序需要反复执行的部分,是循环程序结构的 主体部分。,(3)循环修改 每执行一次循环,要对参数进行修改,使指针指向下一数据 所在的位置,为进入下一轮循环作准备。,(4)循环控制 应用程序的条件判断循环程序是否结束。,循环程序有两种基本结构,,图2-7-3 循环程序基本结构,一种是先执行后判断,,一种是先判断后执行。,【例5】设8051使用12 MHz晶振,试设计延迟100 ms的延时程序。 (一般延时程序采用循环程序结构),DELAY:MOV R2,#200 ;延时一个机器周期T = 1 msLOOP1:MOV B,#250 ;每循环延时1 ms LOOP2:NOP DJNZ B,LOOP2 ;250*2=500 ms DJNZ R2,LOOP1 ;0.5ms*200=100 ms RET,延时程序如下:,【例6】对项目一流水灯电路,要求每个LED闪亮5次(亮灭各0.5s)后,再转到下一个LED闪亮,循环不止。,ORG 0000H ; 程序开始地址 MAIN:MOV A,#0FEH ; 初值 1111 1110 送P0口 ; 低电平点亮LED LOOP:MOV R5,#5 ; 闪烁次数设置 MOV P0,A LCALL DEL ; 延时0.5s LOOP1:MOV P0,#0FFH ; LED熄灭0.5s LCALL DEL MOV P0,A ; LED点亮0.5s,解:本例是一种常用循环程序结构,用R5作闪烁次数计数,LCALL DEL DJNZ R5,LOOP1 ;闪烁没有到5次,返回继续 RL A ;闪烁5次后转到下一个LED JMP LOOP DEL:MOV R1,#20 ;以下是0.5s延时子程序 DL3: MOV R2,#50 DL2: MOV R3,#250 DL1: DJNZ R3,DL1 DJNZ R2,DL2 DJNZ R1,DL3 RET END ;程序结束,谢谢指导!,谢谢指导!,谢指导,指导,谢指导,指导,谢谢指导!,谢谢,指导!,!,指,