第4章程序设计.ppt

上传人:少林足球 文档编号:4141244 上传时间:2019-10-22 格式:PPT 页数:62 大小:291KB
返回 下载 相关 举报
第4章程序设计.ppt_第1页
第1页 / 共62页
第4章程序设计.ppt_第2页
第2页 / 共62页
第4章程序设计.ppt_第3页
第3页 / 共62页
第4章程序设计.ppt_第4页
第4页 / 共62页
第4章程序设计.ppt_第5页
第5页 / 共62页
点击查看更多>>
资源描述

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

1、第章 程序设计,虽然单片机的每条指令能使计算机完成一种特定的操作。但要完成某一特定的任务还需要将这些指令按工作要求有序组合为一段完整的程序。程序实际上是一系列计算机指令的有序集合。我们把利用计算机的指令系统来合理地编写出解决某个问题的程序的过程,称之为程序设计。,4.1 简单汇编语言程序设计,编制程序的步骤,1.任务分析(硬件、软件系统分析) 2.确定算法和工作步骤; 3.程序总体设计和流程图绘制,关于流程图符号: 开始、结束-圆角矩形 工作任务-矩形 判断分支-菱形 程序流向- 程序连接-,开始,结束,4. 分配内存,确定程序与数据区存放地址; 5. 编写源程序; 6. 调试、修改,最终确定

2、程序。,方法技巧,1. 模块化设计(按功能分:显示、打印、输入、发送等) 2. 尽量采用循环及子程序结构(节省内存),汇编语言的规范,汇编语言源程序由以下两种指令构成 汇编语句(指令语句) 伪指令(指示性语句) 汇编语句的格式: 标号: 操作码 操作数 ;注释 数据表示形式: 二进制(B)、十六进制(H)、十进制(D或省略)、ASCII码(以单引号标识),3.伪指令:控制汇编用的特殊指令,这些指令不属 于指令系统,不产生机器代码。,4.1.1 分支程序,分支程序可根据要求无条件或条件地改变程序执行流向。编写分支程序主要在于正确使用转移指令。分支程序有:单分支结构、双分支结构、多分支结构(散转)

3、,分支程序,分支程序可根据要求无条件或条件地改变程序执行流向。编写分支程序主要在于正确使用转移指令。分支程序有:单分支结构、双分支结构、多分支结构(散转),1比较数的大小,入口条件:两个带符号数分别存在内部RAM 30H和31H单元中,试比较它们的大小,将较大的数存入32H单元中。,XY为正: OV0,则XY OV=1,则XY XY为负: OV0,则XY OV1,则XY,ORG 0100H MOV A,30H ;取初值 CLR C SUBB A,31H ;XY JZ DZ1 ;X=Y? JC EBB JB OV,EB1 ;XY0, OV=1,XY AJMP DZ1 ;XY0, OV=0,XY

4、EBB:JB OV,DZ1 ;XY0, OV=1,XY EB1:MOV A,31H ;XY AJMP JS0 DZ1:MOV A,30H ;XY JS0:MOV 32H,A END,例:设变量x以补码形式存放在片内RAM 30H单元中,变量y与x的关系是:,编程根据x的值求y值并放回原单元。,2函数运算,ORG 0000H START:MOV A,30H JZ NEXT ;x=0,转移 ANL A,#80H ;保留符号位 JZ ED ;x0,转移 MOV A,#05H ;x0,不转移 ADD A,30H MOV 30H,A SJMP ED NEXT:MOV 30H,#20H ED:SJMP $

5、,START:MOV DPTR,#TAB MOV A,R7 ADD A,R7 ;R72A MOV R3,A ;暂存R3 MOVC A,A+DPTR ;取高位地址 XCH A ,R3 INC A MOVC A,A+DPTR ;取低位地址 MOV DPL,A MOV DPH,R3 ;转移地址送入DPTR CLR A JMP A+DPTR TAB: DW P0 DW P1 DW PN,例:根据R7的内容,转至对应的分支程序。设R7的内容为0N,对应的处理程序地址分别为P0P7,4.3.3 循环程序,循环程序一般由: 初始化部分 循环体部分-处理部分、修改部分、控制部分 结束部分 其结构一般有两种:

6、先进入处理部分,再控制循环 至少执行一次循环体 先控制循环,再进入处理部分 循环体是否执行,取决于判断结果。,开始,设置循环初值,循环处理,循环修改,结束处理,结束,循环结束?,N,Y,Y,N,循环控制的一般方法: 循环次数已知 利用循环次数控制 循环次数未知 利用关键字控制 利用“逻辑尺” 根据“逻辑尺”的内容,进行控制。,例:统计数据块的长度,入口条件:内部RAM 30H开始的存储区有若干个数据,最后一个数据为字符FFH,结果存入40H单元。 ORG 0100H MAIN:MOV R1,#30H ;R1作为地址指针 CLR A ;累加器A作为计数器 LOOP:CJNE R1,#0FFH,N

7、EXT ;与数据FF比较,不等转移 SJMP JSH1 ;找到结束符号,结束循环 NEXT:INC A ;计数器加1 INC R1 ;指针加l SJMP L00P ;循环 JSHl:INC A ;再加入l个字符 MOV 40H,A ;存结果 END,4.1.3 延时程序,10.1s延时程序(晶振为12M) ORG 0100H MOV R2,#200 LOOP: MOV R3,#250 DJNZ R3,$ DJNZ R2,LOOP RET 由于采用12M晶振,机器周期为1s,DJNZ的指令周期为2,整个程序的执行时间为25020021s100000s0.1s,21s延时程序(晶振为12M),OR

8、G 0100H MOV R1,#10 LOOP1:MOV R2,#200 LOOP: MOV R3,#250 DJNZ R3,$ DJNZ R2,LOOP DJNZ R1,LOOP1 RET,例: 50ms延时子程序。设晶振频率为12MHz,则机器周期为1us。,DEL: MOV R7,#200 ;1MC DEL1:MOV R6,#123 ;1MC NOP ;1MC DJNZ R6,$ ;2MC DJNZ R7,DEL1 ;2MC RET ;2MC,延时时间:t=1+200(1+1+2*123)+2+2 50000us=50ms,4.2 MCS-51常用子程序,4.2.1 代码转换类程序设计

9、4.2.2 查表程序设计 4.2.3 定点数运算子程序 4.2.4 浮点数运算子程序,子程序问题,子程序设计时注意事项: 1. 给子程序赋一个名字。实际为入口地址代号。 2. 要能正确传递参数: 入口条件:子程序中要处理的数据如何给予。 出口条件:子程序处理结果如何存放。 (寄存器、存储器、堆栈方式) 3. 保护与恢复现场: 保护现场:压栈指令PUSH 恢复现场:弹出指令POP 4. 子程序可以嵌套,4.2.1 代码转换类程序设计,1单字节十六进制数转换成双字节ASCII码,表4-1 十六进制数与ASCII码之间的关系,入口条件:待转换的单字节十六进制数在寄存器R2中。 出口:高四位的ASCI

10、I码在A中,低四位的ASCII码在B中。,ORG 0100H MOV A,R2 MOV B,A ;暂存待转换的单字节十六进制数 LCALL MS1 ;转换低四位 XCH A,B ;存放低四位的ASCII码 SWAP A ;准备转换高四位 LCALL MS1 ;转换高四位 SJMP $ MS1: ANL A,#0FH ;将累加器的低四位转换成 ASCII 码 ADD A,#90H DA A ADDC A,#40H DA A RET,将多位十六进制数转换成ASCII码,设R0指向十六进制数低位, R2存放字节数,转换后R1指向ASCII码高位。,HTASC: MOV A,R0 ;取十六进制数 AN

11、L A,#0FH ;取低四位 ADD A,#15 ;偏移修正 MOVC A,A+PC ;查表得ASCII码 MOV R1,A ;保存 INC R1 MOV A,R0 ;取十六进制数高四位 SWAP A ; ANL A,#0F0H ADD A,#06H ;偏移修正 MOVC A,A+PC ;查表 MOV R1,A ;保存 INC R0 ;指向下一单元 INC R1 DJNZ R2,HTASC RET ASCTAB:DB 30H,31H,32H,33H,34H,35H,36H,37H DB 38H,39H,41H,42H,43H,44H,45H,46H,2.ASCII码转换成十六进制数,入口条件:

12、待转换的 ASCII 码在R2中。 出口:转换后的十六进制数在R3中。 ORG 0100H MOV A,R2 SUBB A,#30H CLR C JNB ACC.4,M1 SUBB A,#7 M1: MOV R3,A SJMP $ END,3.十六进制整数转换成单字节码整数,入口条件:待转换的单字节十六进制整数在R2中。 出口:转换后的码整数(十位和个位)在R5中,百位在R3中。 MOV A,R2 HBCD: MOV B,#100;分离出百位,存放在 R3中 DIV AB MOV R3,A MOV A,#10 ;余数继续分离十位和个位 XCH A,B DIV AB SWAP A ORL A,B

13、 ;将十位和个位拼装成码 MOV R5,A SJMP $ END,4双字节十六进制整数转换成双字节码整数,入口条件:待转换的双字节十六进制整数在R6、R7中。 出口:转换后的三字节码整数在R3、R4、R5中。 ORG 0100H HB2: CLR A ;码初始化 MOV R3,A MOV R4,A MOV R5,A MOV R2,#10H ;转换双字节十六进制整数 HB3:MOV A,R7 ;从高端移出待转换数的一位到 CY 中 RLC A MOV R7,A MOV A,R6 RLC A,MOV R6,A MOV A,R5 ;码带进位自身相加,相当于乘 ADDC A,R5 DA A ;十进制调

14、整 MOV R5,A MOV A,R4 ADDC A,R4 DA A MOV R4,A MOV A,R3 ADDC A,R3 MOV R3,A ;双字节十六进制数的万位数不超过,不用调整 DJNZ R2,HB3 ;判断16位处理完? SJMP $ END,5双字节码整数转换成双字节十六进制整数,入口条件:待转换的双字节码整数在R2、R3中。 出口:转换后的双字节十六进制整数仍在R2、R3中。 ORG 0100H BH2: MOV A,R3;将低字节转换成十六进制 LCALL BCD1 MOV R3,A MOV A,R2;将高字节转换成十六进制 LCALL BCD1 MOV B,#100;扩大一

15、百倍 MUL AB ADD A,R3;和低字节按十六进制相加 MOV R3,A CLR A,ADDC A,B MOV R2,A SJMP $ BCD1:MOV B,#10H;分离十位和个位 DIV AB MOV R4,B ;暂存个位 MOV B,#10;将十位转换成十六进制 MUL AB ADD A,R4 ;十六进制加上个位 RET END,4.2.2 查表程序设计,MOVC A,A+DPTR MOVC A,A+PC 1查表求ASCII码 入口条件:R0低四位有一个十六进制数(0F)。 出口:将查表找出的相应ASCII码并送回R0中。,ORG 0100H MOV A,R0 ANL A,#0FH

16、 ;屏蔽高4位 ADD A,#03H ;查表指令PC值与表格PC值相差3字节 MOVC A,A+PC ;查表 MOV R0,A ;存结果 SJMP $ ASCTAB:DB 0,1,2,3,4,5,6,7 DB 8,9,A,B,C,D,E,F,4.2.3 定点数运算子程序,1多字节码加法 入口条件:字节数在R7中,被加数在30H起始单元中,加数在40H起始单元中。 出口:和在30H起始单元中,最高位进位在CY中。 ORG 0100H MOV R7,#03H MOV R0,#30H MOV R1,#40H MOV A,R7 ;取字节数至 R2 中 MOV R2,A ADD A,R0 ;初始化数据指

17、针,MOV R0,A MOV A,R2 ADD A,R1 MOV R1,A CLR C BB1: DEC R0 ;调整数据指针 DEC R1 MOV A,R0 ADDC A,R1 ;按字节相加 DA A ;十进制调整 MOV R0,A ;和存回 R0 中 DJNZ R2,BB1 ;处理完所有字节 END,2多字节码减法,入口条件:字节数在 R7 中,被减数在R0 中,减数在 R1 中。 出口:差在 R0 中,最高位借位在CY中。 ORG 0100H BCDB:LCALL MN1 ;减数 R1 十进制取补 LCALL BCDA ;按多字节码加法处理 CPL C ;将补码加法的进位标志转换成借位标

18、志 MOV F0,C LCALL MN1 ;恢复减数 R1 的原始值 MOV C,F0 ;恢复借位标志 RET,MN1:MOV A,R0 ;R1 十进制取补子程序入口 XCH A,R1 ;交换指针 XCH A,R0 LCALL NEG ;通过 R0 实现 R1 取补 MOV A,R0 XCH A,R1 ;换回指针 XCH A,R0 RET BCDA:MOV A,R7 ;取字节数至 R2 中 MOV R2,A ADD A,R0 ;初始化数据指针 MOV R0,A MOV A,R2,ADD A,R1 MOV R1,A CLR C BCD1:DEC R0 ;调整数据指针 DEC R1 MOV A,R

19、0 ADDC A,R1 ;按字节相加 DA A ;十进制调整 MOV R0,A ;和存回 R0 中 DJNZ R2,BCD1 ;处理完所有字节 RET NEG:MOV A,R7 ;BCD码取补子程序 DEC A,MOV R2,A MOV A,R0 MOV R3,A NEG0: CLR C MOV A,#99H SUBB A,R0 ;按字节十进制取补 MOV R0,A ;存回 R0 中 INC R0 ;调整数据指针 DJNZ R2,NEG0 ;处理完( R2 )字节 MOV A,#9AH ;最低字节单独取补 SUBB A,R0 MOV R0,A MOV A,R3 ;恢复指针 MOV R0,A R

20、ET,4双字节二进制无符号数乘法子程序 入口条件:被乘数在R2、R3 中,乘数在R6、R7中。 出口:乘积在 R2 、 R3 、 R4 、 R5 中。 ORG 0100H MULD:MOV A,R3 ;计算 R3 乘 R7 MOV B,R7 MUL AB MOV R4,B ;暂存部分积 MOV R5,A MOV A,R3 ;计算 R3 乘 R6 MOV B,R6 MUL AB ADD A,R4 ;累加部分积 MOV R4,A,CLR A ADDC A,B MOV R3,A MOV A,R2 ;计算 R2 乘 R7 MOV B,R7 MUL AB ADD A,R4 ;累加部分积 MOV R4,A

21、 MOV A,R3 ADDC A,B MOV R3,A CLR A RLC A,XCH A,R2 ;计算 R2 乘 R6 MOV B,R6 MUL AB ADD A,R3 ;累加部分积 MOV R3,A MOV A,R2 ADDC A,B MOV R2,A RET,6双字节二进制无符号数除法子程序 入口条件:被除数在 R2 、 R3 、 R4 、 R5 中,除数在 R6 、 R7 中。 出口: OV=0 时,双字节商在 R2 、 R3 中, OV=1 时溢出。 ORG 0100H DIVD: CLR C ;比较被除数和除数 MOV A,R3 SUBB A,R7 MOV A,R2 SUBB A,

22、R6 JC DVD1 SETB OV ;溢出 RET,DVD1:MOV B,#10H ;计算双字节商 DVD2:CLR C ;部分商和余数同时左移一位 MOV A,R5 RLC A MOV R5,A MOV A,R4 RLC A MOV R4,A MOV A,R3 RLC A MOV R3,A XCH A,R2 RLC A,XCH A,R2 MOV F0,C ;保存溢出位 CLR C SUBB A,R7 ;计算( R2R3 R6R7 ) MOV R1,A MOV A,R2 SUBB A,R6 ANL C,/F0 ;结果判断 JC DVD3 MOV R2,A ;够减,存放新的余数 MOV A,R

23、1 MOV R3,A INC R5 ;商的低位置一,DVD3:DJNZ B,DVD2 ;计算完十六位商( R4R5 ) MOV A,R4 ;将商移到 R2R3 中 MOV R2,A MOV A,R5 MOV R3,A CLR OV ;设立成功标志 RET,4.2.4 浮点数运算子程序,1浮点数的表示 (1)二进制浮点操作数 用三个字节表示,第一个字节的最高位为数符,其余七位为阶码(补码形式),第二字节为尾数的高字节,第三字节为尾数的低字节,尾数用双字节纯小数(原码)来表示。当尾数的最高位为时,便称为规格化浮点数,简称操作数,(2)十进制浮点操作数 用三个字节表示,第一个字节的最高位为数符,用来

24、表示正负数(0表示正数,1表示负数)其余七位为阶码(二进制补码形式),第二字节为尾数的高字节,第三字节为尾数的低字节,尾数用双字节BCD码纯小数(原码)来表示。当十进制数的绝对值大于时,阶码就等于整数部分的位数。 例如:156.6 的阶码是03H,156.6 的阶码是 83H ; 当十进制数的绝对值小于 1 时,阶码就等于 80H 减去小数点后面零的个数。 例如 :0.00362的阶码是 7EH ,0.00362 的阶码是 0FEH 。 例如:有一个十进制浮点操作数存放在30H、31H、32H中,数值是0.07315,即0.7315 乘以10 的1 次方,则阶码为7FH,若加上数符(30H)=

25、0FFH,31H=73H,(32H)=15H 。,(3)运算精度 单次定点运算精度为结果最低位的当量值;单次二进制浮点算术运算的精度优于十万分之三;单次二进制浮点超越函数运算的精度优于万分之一;BCD码浮点数本身的精度比较低(万分之一到千分之一),不宜作为运算的操作数,仅用于输入或输出时的数制转换。不管那种数据格式,随着连续运算的次数增加,精度都会下降。,2浮点数加减法子程序 入口条件:被加数在 R0 中,加数在 R1 中。被减数在 R0 中,减数在 R1 中。 当F0=0时,程序作浮点数加法运算;当F0=1时,程序作浮点数减法运算。 出口: OV=0 时,和(差)仍在 R0 中, OV=1

26、时,溢出。,ORG 0100H FADD:CLR F0 ;设立加法标志 SJMP AS ;计算代数和 FSUB:SETB F0 ;设立减法标志 AS: LCALL MVR1 ;计算代数和。先将 R1 传送到第二工作区 MOV C,F0 ;用加减标志来校正第二操作数的有效符号 RRC A XRL A,R1 MOV C,ACC.7 ASN: MOV 1EH,C ;将第二操作数的有效符号存入位 1EH 中 XRL A,R0 ;与第一操作数的符号比较 RLC A MOV F0,C ;保存比较结果 LCALL MVR0 ;将 R0 传送到第一工作区中 LCALL AS1 ;在工作寄存器中完成代数运算 M

27、OV0: INC R0 ;将结果传回到 R0 中的子程序入口 INC R0,MOV A,R4 ;传回尾数的低字节 MOV R0,A DEC R0 MOV A,R3 ;传回尾数的高字节 MOV R0,A DEC R0 MOV A,R2 ;取结果的阶码 MOV C,1FH ;取结果的数符 MOV ACC.7,C ;拼入阶码中 MOV R0,A CLR ACC.7 ;不考虑数符 CLR OV ;清除溢出标志 CJNE A,#3FH,MV01 ;阶码是否上溢? SETB OV ;设立溢出标志 MV01:MOV A,R0 ;取出带数符的阶码 RET MVR0:MOV A,R0 ;将 R0 传送到第一工作

28、区中的子程序 MOV C,ACC.7 ;将数符保存在位 1FH 中 MOV 1FH,C,MOV C,ACC.6 ;将阶码扩充为补码 MOV ACC.7,C MOV R2,A ;存放在 R2 中 INC R0 MOV A,R0 ;将尾数高字节存放在 R3 中 MOV R3,A INC R0 MOV A,R0 ;将尾数低字节存放在 R4 中 MOV R4,A DEC R0 ;恢复数据指针 DEC R0 RET MVR1: MOV A,R1 ;将 R1 传送到第二工作区中的子程序 MOV C,ACC.7 ;将数符保存在位 1EH 中 MOV 1EH,C MOV C,ACC.6 ;将阶码扩充为补码 M

29、OV ACC.7,C MOV R5,A ;存放在 R5 中 INC R1,MOV A,R1 ;将尾数高字节存放在 R6 中 MOV R6,A INC R1 MOV A,R1 ;将尾数低字节存放在 R7 中 MOV R7,A DEC R1 ;恢复数据指针 DEC R1 RET AS1: MOV A,R6 ;读取第二操作数尾数高字节 ORL A,R7 JZ AS2 ;第二操作数为零,不必运算 MOV A,R3 ;读取第一操作数尾数高字节 ORL A,R4 JNZ EQ MOV A,R6 ;第一操作数为零,结果以第二操 作数为准,MOV R3,A MOV A,R7 MOVR4,A MOV A,R5

30、MOV R2,A MOV C,1EH MOV 1FH,C AS2: RET EQ: MOV A,R2 ;对阶,比较两个操作数的阶码 XRL A,R5 JZ AS4 ;阶码相同,对阶结束 JB ACC.7,EQ3 ;阶符互异 MOV A,R2 ;阶符相同,比较大小 CLR C SUBB A,R5 JC EQ4 EQ2: CLR C ;第二操作数右规一次 MOV A,R6 ;尾数缩小一半,RRC A MOV R6,A MOV A,R7 RRC A MOV R7,A INC R5 ;阶码加一 ORL A,R6 ;尾数为零否? JNZ EQ ;尾数不为零,继续对阶 MOV A,R2 ;尾数为零,提前结

31、束对阶 MOV R5,A SJMP AS4 EQ3: MOV A,R2 ;判断第一操作数阶符 JNB ACC.7,EQ2 ;如为正,右规第二操作数 EQ4: CLR C LCALL RR1 ;第一操作数右规一次 ORL A,R3 ;尾数为零否? JNZ EQ ;不为零,继续对阶 MOV A,R5 ;尾数为零,提前结束对阶 MOV R2,A,AS4: JB F0,AS5 ;尾数加减判断 MOV A,R4 ;尾数相加 ADD A,R7 MOV R4,A MOV A,R3 ADDC A,R6 MOV R3,A JNC AS2 LJMP RR1 ;有进位,右规一次 AS5: CLR C ;比较绝对值大

32、小 MOV A,R4 SUBB A,R7 MOV B,A MOV A,R3 SUBB A,R6 JC AS6 MOV R4,B ;第一尾数减第二尾数 MOV R3,A LJMP RLN ;结果规格化 AS6: CPL 1FH ;结果的符号与第一操作数相反,CLR C ;结果的绝对值为第二尾数减第一尾数 MOV A,R7 SUBB A,R4 MOV R4,A MOV A,R6 SUBB A,R3 MOV R3,A RLN: MOV A,R3 ;浮点数规格化 ORL A,R4 ;尾数为零否? JNZ RLN1 MOV R2,#0C1H ;阶码取最小值 RET RLN1: MOV A,R3 JB A

33、CC.7,RLN2 ;尾数最高位为一否? CLR C ;不为一,左规一次 LCALL RL1,SJMP RLN ;继续判断 RLN2: CLR OV ;规格化结束 RET RL1: MOV A,R4 ;第一操作数左规一次 RLC A ;尾数扩大一倍 MOV R4,A MOV A,R3 RLC A MOV R3,A DEC R2 ;阶码减一 CJNE R2,#0C0H,RL1E ;阶码下溢否? CLR A MOV R3,A ;阶码下溢,操作数以零计 MOV R4,A MOV R2,#0C1H RL1E: CLR OV RET RR1: MOV A,R3 ;第一操作数右规一次 RRC A ;尾数缩小一半,MOV R3,A MOV A,R4 RRC A MOV R4,A INC R2 ;阶码加一 CLR OV ;清溢出标志 CJNE R2,#40H,RR1E ;阶码上溢否? MOV R2,#3FH ;阶码溢出 SETB OV RR1E: RET,

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

当前位置:首页 > 其他


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