3章程序设计本科.ppt

上传人:本田雅阁 文档编号:2884787 上传时间:2019-06-01 格式:PPT 页数:29 大小:429.02KB
返回 下载 相关 举报
3章程序设计本科.ppt_第1页
第1页 / 共29页
3章程序设计本科.ppt_第2页
第2页 / 共29页
3章程序设计本科.ppt_第3页
第3页 / 共29页
3章程序设计本科.ppt_第4页
第4页 / 共29页
3章程序设计本科.ppt_第5页
第5页 / 共29页
点击查看更多>>
资源描述

《3章程序设计本科.ppt》由会员分享,可在线阅读,更多相关《3章程序设计本科.ppt(29页珍藏版)》请在三一文库上搜索。

1、例3-2:将R4R5双字节符号数求补码程序。,ORG 0000H MOV A,R4 JB ACC.7, CPLL ;判符号位 SJMP $ ;正数的补码原码 CPLL: MOV A,R5 ;取低字节 CPL A ADD A,#1 ;低字节变补 MOV R5,A MOV A,R4 ;取高字节 CPL A ADDC A,#0 ;高字节变补 ORL A, #80H ; 恢复负号 MOV R4,A SJMP $,分析:先判符号,再根据不同情况处理。,例3-3 求 Y=X2 (0X5)。 分析 :变量X放在片内RAM的20H单元,其值为00H05H 之间, Y在片内RAM的21H单元,在程序存储器安排一

2、张平方表,通过查表求 Y=X2 这样比完成 X*X 编程简便多了。表,ORG 0000H MOV DPTR,#TAB MOV A, 20H ;取X MOVC A,A+DPTR ; 查表 MOV 21H,A ; 存于Y SJMP $ TAB: DB 00H,01H,04H,09H,16H,25H END,首地址为TAB,以DPTR指向表首址,利用查表指令MOVC A,A+DPTR,即可求得。 表中数据用BCD码存放合乎人们的习惯.,如果平方值为两个字节,程序应如何编。,例3-4 分解压缩式BCD码,使其成为非压缩式BCD码。 如把 65H06H和05H,见图,ORG 0000H MOV R0,#

3、40H ;设指针 MOV A,R0 ;取一个字节 MOV R2,A ;暂存 ANL A,#0FH ;清0高半字节 INC R0 MOV R0,A ;保存数据个位,MOV A,R2 SWAP A ;十位换到低半字节 ANL A,#0FH INC R0 MOV R0,A ;保存数据十位 SJMP $,05,06,3.4 分支程序的设计 由条件转移指令构成程序判断框部分,形成分支结构,通常转移条件取决标志位。常见的分支见下图:,【例3-5】 在内部RAM的40H和41H地址单元中,有 2个无符号数,试编程比较这两数的大小,将大数存于内部RAM的GR单元,小数存于LE单元,如两数相等,则分别送入GR和

4、LE地址单元。 分析 采用CJNE指令,即可以判断相等与否,还可以通过CY标志判断大小,程序如下:,ORG 0000H MOV A, 40H CJNE A, 41H, NEQ ;两数不等转 NEQ MOV GR, A ;两数相等,GR单元和LE单元均存此数 MOV LE, A SJMP $ NEQ: JC LESS ;A小则转LESS MOV GR, A ;A大,大数存GR单元 MOV LE, 41H ;小数存LE单元 SJNE $ LESS: MOV LE, A ;A小,小数存LE单元 MOV GR, 41H ;大数存GR单元 SJMP $ GR EQU 30H LE EQU 31H END

5、,例 3-6】 设变量X以补码形式存放在片内RAM的30H单元, 函数Y与X有如下关系式: X X0 Y= 20H X=0 X+5 X0 试编制程序,根据X的取值求出Y,并放回原单元。 分析 取出变量后进行取值范围的判断,对符号的判断可用位操作类指令,也可用逻辑运算类指令,本例用逻辑运算指令,程序框图及程序如下:,ORG 0000H MOV A, 30H JZ NEXT ;判断是否为零 ANL A, #80H ;判断符号位 JZ ED ;X0转ED MOV A, #05H ;X0完成X+5 ADD A, #30H MOV 30H, A SJMP ED NEXT: MOV 30H, #20H ;

6、X=0, Y=20H ED: SJNE $,例 用单片机加重力传感器作磅秤,秤出重量后算出行李运费价格,其秤出的重量以10kg为1个计价单位G , G已存入40H单元。 计价方法为50kg以内按3元, 50kg以上分段计价: 50kg按3元计价,超过部分 按2元计价。 由此列出算式:,3G因重复使用,先暂存在R2。流程见左, 程序如下:,ORG 0100H FRT: MOV A,40H ;取行李重量计价单位G MOV R3,A MOV B,#03H ;运费M=G3 MUL AB MOV R2,A ;暂存3G,MOV A,R3 ;取回G CJNE A,#05H,L1 ;G 5 ? SJMP WE

7、TC L1: JC WETC ;是,转至WETC SUBB A,#05H ;否则 M=3G+2(G-5) RLC A ADD A,R2 MOV R2 ,A WETC:MOV 41H,R2 ;存运费 M RET,1. 利用转移地址表实现转移 例3-7 根据R3的内容转向对应的程序,R3的内容为0n,处理程序的入口符号地址分别为PR0PRn (n128)。 分析:将PR0PRn入口地址列在表格中,每一项占两个单元,PRn在表中的偏移量为2n,因此将R3的内容乘2即得PRn在表中的偏移地址,从偏移地址2n和2n+1两个单元分别取出PRn的高八位地址和低八位地址送DPTR寄存器,用JMP A+DPTR

8、指令(A先清零)即转移到PRn入口执行。设PR0PRn入口地址分别为0110H,0220 H, 0330 H, 。程序如下:,ORG 0000H PR0 EQU 0110H PR1 EQU 0220 H PR2 EQU 0330 H ,MOV A,R3 ;R3A ADD A,ACC ;A*2 MOV DPTR,#TAB PUSH ACC MOVC A,A+DPTR ;取地址表中高字节 MOV B,A ;暂存于B INC DPL ;表地址加1 POP ACC MOVC A,A+DPTR ;取地址表中低字节 MOV DPL,A MOV DPH,B ;DPTR为表中地址 CLR A ;A=0 JMP

9、 A+DPTR ;转移 TAB:DW PR0,PR1,PR2,PRn ;转移地址表 END,TAB,TAB+2,DPH DPL,例如 R3=1的操作,02,20,2. 利用转移指令表实现转移 例3-8 设有五个按键 0、1、2、3、4其编码分别为3AH、47H、65H、70H、8BH,要求根据按下的键转向不同的处理程序,分别为PR0 、PR1 、PR2、PR3、PR4,设按键的编码已在B寄存器中,编出程序。,分析: 将键码排成表,将键码表中的值和B中的键编码比对,记下在键码表中和B中的键编码相等的序号,另安排一个转移表,安排AJMP指令(机器码),因每条AJMP指令占二字节,将刚才记下的序号乘

10、2即为转移表的偏移地址,利用JMP A+DPTR执行表内的AJMP指令,从而实现多分支转移,设转移表表头JPT的地址为001AH、PR0,入口地址为0110H、 ,参考2.4.2节,求AJMP PR0的机器码 0110H -0000 0001 0001 0000,a10 a0,机器码2110h,001 00001 0001 0000,AJMP PR0的机器码为2110H, PR1入口地址0220H , AJMP PR2的机器码为4120H, , 转移指令表JPT 的内容及键码表如下图所示,设B=65H, 键值为2 :,转移指令表JPT,键码表TAB,65H,A,B,A2=4,A=1,A=2,A

11、=0,65H,65H,001AH,001CH,DPTR=001AH, A=4,JMP A+DPTR =JMP 001CH, 而001CH单元中是指令JMP PR2,因而执行JMP PR2指令而转到PR2执行。,ORG 0000H MOV DPTR,#TAB ;置键码表首址 MOV A,#0 ;表的起始位的偏移量为0 NEXT: PUSH ACC MOVC A,A+DPTR ;取键码表的编码存于A CJNE A,B,AGAN ;将B中值和A中的键码比较,不等转移 POP ACC ;A=B,查到了B的键码恢复键码表的偏移量(序号) RL A ; 序号乘2得分支表内偏移量 MOV DPTR,#JPT

12、 ;置分支表首址 JMP A+DPTR ;如B=65H,该指令即为JMP 001CH AGAN: POP ACC ;不相等比较下一个 INC A ;序号加1 CJNE A,#5,NEXT SJMP $ ;键码查完还没有B中按键编码程序结束 JPT: AJMP PR0 ;分支转移表 AJMP PR1 AJMP PR2 AJMP PR3 AJMP PR4 TAB: DB 3AH,47H,65H DB 70H,8BH ;键码表,上面程序中如B=65H 执行JMP 001CH 而001CH单元中是指令JMP PR2因而执行JMP PR2指令若按的是其他键,也会自动转到相应的PRn执行。,当程序中的某些

13、指令需要反复执行多次时,采用循环程序的方式,这样会使程序缩短,节省存储单元(并不节省执行时间)。 循环次数的控制,有两种控制方式: 第一种方法 先判断再处理, 即先判断满不满足循环条件,如不满足,就不循环,多以循环条件控制。 第二种方法 先处理再判断,即循环执行一遍后,下一轮还需不需要进行,多以计循环次数控制。循环可以有单重循环和多重循环,在多重循环中,内、外循环不能交叉,也不允许外循环跳入内循环。下面通过几个实例说明循环程序的设计方法。,3.5 循 环 程 序 设 计,例 3-9 设计一个延时10ms的延时子程序,已知单片机使用的晶振为6MHz。 分析 延时时间与两个因素有关:晶振频率和循环

14、次数。由于晶振采用6MHz,一个机器周期是2s,用单循环可以实现1ms延时,外循环10次即可达10ms延时。 内循环如何实现1ms延时呢,程序中可先以未知数MT代替,从附录A查每条指令机器周期计算程序的执行时间。,ORG 0020H MOV R0,#0AH ;外循环10次 DL2: MOV R1,#MT ;内循环MT次 DL1: NOP NOP ;空操作指令 DJNZ R1,DL1 DJNZ R0,DL2 RET,1 1 1 1 2 2,内循环DL1到指令DJNZ R1,DL1的计算: (1+1+2)2SMT=1000S MT=125=7DH,将7DH代入上面程序的MT,计算总的延时时间: 1

15、+1+(1+1+2)125+28102S =10062S=10.062mS,若需要延时更长时间,可以采用多重循环。,机器周期数,内,外,例3-10 编写多字节数10程序。 内部RAM以20H为首址的一片单元中存放着一个多字节符号数,字节数存放在R7中,存放方式为低位字节在低地址,高位字节在高地址,要求乘10后的积仍存放在这一片单元中。 分析 用R1作该多字节的 地址指针,部分积的低位仍 存放于本单元,部分积的高 位存放于R2,以便和下一 位的部分积的低位相加。 以R7作字节数计数。 编程如下:,345 H * 0A H 32 H + 28 H 2B H + 1E H 20B H,ORG 000

16、0H CLR C ;清进位位C MOV R1,#20H ;R1指示地址 MOV R2,#00H ;存积的高八位寄存器R2清0 S10:MOV A, R1 ;取一字节送A MOV B,#0AH ;10送B PUSH PSW MUL AB ;字节乘10 POP PSW ADDC A,R2 ;上次积高八位加本次积低八位 MOV R1,A ;送原存储单元 MOV R2,B ;积的高八位送R2 INC R1 ;指向下一字节 DJNZ R7,S10 ;未乘完去SH10,否则向下执行 MOV R1,B ;存最高字节积的高位 SJMP $,分析:为了把10个单元中的数按从小到大排序,可从 30H单元开始,相邻

17、两数逐次进行比较,如果前面的数大于后面的数,两数交换,保存小数,取出大数, 且只要有地址单元内容的互换就置位标志。多次循环后,若两数比较不再出现有单元互换的情况,就说明从30H39H单元中的数已全部从小到大排列完毕。,例3-11 将片内RAM 30H-39H中的10个无符号 的无序数按从小到大的顺序排列到这一片单元中。,例如 12 23 65 09 89 比较大小,ORG 0000H START: CLR 00H ;00H位作交换标志位 CLR C MOV R7, #0AH ;比较次数 MOV R0, #30H ;地址 MOV A, R0 ;取数到A LOOP: INC R0 ;指向新的下一单

18、元 MOV R2, A ;R2 暂存大数 SUBB A, R0 ;比较,A中为差,谁大反映在C. MOV A, R2 ;还原成单元中的数 JC NEXT ;A中数小不交换 SETB 00H ; A中数大交换,置交换标志 XCH A, R0 ;交换, A中大数置于高地址单元 DEC R0 XCH A, R0 ;小数置于低地址单元 INC R0 ;指向已比较过的高地址单元 NEXT: MOV A, R0 ;取数 DJNZ R7, LOOP JB 00H, START ;交换标志位为1,重新进行下一轮比较 SJMP $,例3-18 设累加器A的各位ACC.0ACC.7分别记为X0X7,编制程序用软件

19、实现下式: Y=X0X1X2+X0 X1 X2+X0X1X2X3+X4 X5 X6X7,X0 BIT ACC.0 X1 BIT ACC.1 X2 BIT ACC.2 X3 BIT ACC.3 X4 BIT ACC.4 X5 BIT ACC.5 X6 BIT ACC.6 X7 BIT ACC.7,ORG 0000H MOV C,X0 ANL C,X1 ANL C,X2 MOV 00H,C ;X0X1X2 MOV C,X0 ANL C,/X1 MOV 01H,C ; X0X1 ANL C,/X2 ORL C,00H MOV 00H,C MOV C,X2 ANL C,01H,ANL C,X3 ; X

20、0X1X2X3 ORL C,/00H MOV 00H,C MOV C,X7 ANL C,/X6 ANL C,/X5 ANL C,/X4 ; X4 X5 X6 X7 ORL C,00H ; 最终结果 YC SJMP $,子程序是构成单片机应用程序必不可少的部分,通过ACALL和LCALL两条子程序调用指令,可以十分方便地用来调用任何地址处的子程序。 子程序节省占用的存储单元,使程序简短、清晰,善于灵活的使用子程序,是程序设计的重要技巧之一。 子程序必须以RET指令结尾. 在调用子程序时,有以下几点应注意:,3.7 子程序,当一段程序需多次应用,或为多人应用时,这段程序编为子程序.,1)保护现场。

21、 如果在调用前主程序已经使用了某些存储单元或寄存器,在调用时,这些寄存器和存储单元又有其他用途,就应先把这些单元或寄存器中的内容压入堆栈保护,调用完后再从堆栈中弹出以便加以恢复。如果有较多的寄存器要保护,应使主、子程序使用不同的寄存器组。 2)设置入口参数和出口参数。 用之前主程序要按子程序的要求设置好地址单元或存储器(称为入口参数),以便子程序从指定的地址单元或存储器获得输入数据; 子程序经运算或处理后的结果存放到指定的地址单元或寄存器(称为出口参数),主程序调用后从指定的地址单元或寄存器读取运算或处理后的结果,只有这样,才能完成子程序和主程序间的数据的正确传递。,3)子程序中可包括对另外子

22、程序的调用,称为子程序嵌套。,例3-1 用程序实现 c = a2 + b2,设a,b均小于10。a存放在31H单元,b存放在32H单元,把 c 存入34H和33H单元。(和要求为BCD码)。 解:因该算式两次用到平方值,所以在程序中采用把求平方编为子程序的方法。求平方采用查表法 , 主程序和子程序编写如下:,主程序: ORG 0000H MOV SP,#3FH MOV A,31H ;取a LCALL SQR ;求a方 MOV R1,A MOV A,32H ;取b LCALL SQR ; 求b方 ADD A,R1 ; 求和 DA A ;调整 MOV 33H,A MOV A,#0 ADDC A,0

23、,MOV 34H,A SJMP $ 子程序: ORG 0030H SQR:INC A MOVC A,A+PC RET TAB: DB 00H,01H,04H DB 09H 16H,25H, DB 36H,49H64H,81H END,求两个无符号数数据块中的最大值的乘积。 数据块的首地址分别为60H和70H,每个数据块的第一个字节都存放数据块长度,结果存入5FH和5EH单元中。 分析 本例可采用分别求出两个数据块的最大值然后求积的方法,求最大值的过程可采用子程序。子程序的入口参数是数据块首地址,存放在R1中;出口参数为最大值,存放在A中. 主程序: ORG 000H MOV R1, #60H

24、;置第一个数据块入口参数 ACALL QMAX ;调求最大值子程序 MOV B,A ;第一个数据块的最大值暂存于B中 MOV R1,#70H ;置第二个数据块入口参数 ACALL QMAX ;调求最大值子程序 MUL AB ;求积 MOV 5EH,A ;存积低位 MOV 5FH,B ;存积高位 SJMP $,子程序: ORG 0030H QMAX: MOV A,R1 ;取数据块长度 MOV R2, A ;设置计数值 CLR A ;设0为最大值 LP1:INC R1 ;修改地址指针 CLR C ;0-CY SUBB A,R1 ;两数相减,比较大小 JNC LP3 ;原数仍为最大值转LP3 MOV A,R1 ;否,用此数代替最大值 SJMP LP4 ;无条件转移 LP3:ADD A,R1 ;恢复原最大值(因用SUBB做比较指令) LP4:DJNZ R2,LP1 ;若没比较完,继续比较 RET ;比较完,返回 END,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1