《第4章汇编语言程序设计》由会员分享,可在线阅读,更多相关《第4章汇编语言程序设计(87页珍藏版)》请在金锄头文库上搜索。
1、第4章汇编语言程序设计Stillwatersrundeep.流静水深流静水深,人静心深人静心深Wherethereislife,thereishope。有生命必有希望。有生命必有希望 4.1 概概 述述一、汇编语言和高级语言相比具有下列优点:一、汇编语言和高级语言相比具有下列优点:占用的内存单元和占用的内存单元和CPU资源少资源少执行速度快执行速度快有效的利用计算机的专有特性。有效的利用计算机的专有特性。适合实时控制适合实时控制上页上页下页下页回目录回目录二、汇编语言程序设计的步骤:二、汇编语言程序设计的步骤:建立数学模型建立数学模型确定算法确定算法制定流程图制定流程图确定数据结构确定数据结构
2、写出源程序写出源程序上机调试上机调试三、汇编语言程序的结构三、汇编语言程序的结构定义有关变量字符名定义有关变量字符名定义程序的起始地址定义程序的起始地址程序主体程序主体汇编结束标志汇编结束标志上页上页下页下页回目录回目录开始开始问题定义问题定义软件结构设计软件结构设计建立数学模型建立数学模型画出程序流程图画出程序流程图编写程序编写程序汇汇 编编在线仿真调试在线仿真调试程序错否?程序错否?修改程序修改程序结结 束束 始始固化固化NY图图10-8 10-8 单片机软件研制过程单片机软件研制过程软件任务分析软件任务分析1、软件任务分析和硬件电路设计结合进行、软件任务分析和硬件电路设计结合进行2、软件
3、任务分析:、软件任务分析: 执行软件执行软件: 监控软件监控软件:单片机应用系统程序设计是在系统裸机条件下开发单片机应用系统程序设计是在系统裸机条件下开发的,而且随应用系统的不同而不同。的,而且随应用系统的不同而不同。完成各种实质性功能,如测量、计算、完成各种实质性功能,如测量、计算、显示、打印、输出控制、通讯等;设计显示、打印、输出控制、通讯等;设计偏重算法效率。进行功能定义、接口定偏重算法效率。进行功能定义、接口定义、数据结构、数据类型等定义义、数据结构、数据类型等定义 。专门用来协调各执行模块和操作者的关专门用来协调各执行模块和操作者的关系。着眼全局,逻辑严密。根据系统功系。着眼全局,逻
4、辑严密。根据系统功能和键盘设置选择监控程序结构。能和键盘设置选择监控程序结构。数据类型和数据结构规划数据类型和数据结构规划数据类型:数据类型:逻辑型逻辑型数值型:数值型: 定点型定点型 浮点型浮点型数据结构:数据结构:数据存放格式问题。数据存放格式问题。大多采用线性结构。大多采用线性结构。资源划分资源划分系统资源主要包括系统资源主要包括ROM、RAM、T/C、中断源等。、中断源等。主要工作是进行主要工作是进行RAM资源的分配。资源的分配。 片外片外RAM:容量大,存放批量大的数据。:容量大,存放批量大的数据。 片内片内RAM:认真考虑:认真考虑。00H1FH:工作积存器区。主程序用:工作积存器
5、区。主程序用0区,中断、子程序用区,中断、子程序用1区、区、2区、区、3区。区。20H2FH:位寻址区,存放各种软件标:位寻址区,存放各种软件标志、逻辑变量、位输入信息、位输出信息志、逻辑变量、位输入信息、位输出信息副本、状态变量、逻辑运算中间结果等。副本、状态变量、逻辑运算中间结果等。保留保留12个字节备用,剩下作其它用途。个字节备用,剩下作其它用途。30H7FH(30HFFH):堆栈空间、数:堆栈空间、数据缓冲区、各种参数、指针、中间结果等。据缓冲区、各种参数、指针、中间结果等。列出列出RAM资资源详细源详细分配清分配清单,作单,作为编程为编程依据。依据。;字节定义区;字节定义区X EQU
6、30HY EQU31HZ EQU32H ;40H4FH,没有使用,没有使用 SIOBUF EQU 50H ;50H5FH, 串行通信缓冲区串行通信缓冲区16字节字节 ;0E0H0FFH 32字节堆栈空间字节堆栈空间;位变量、位标志变量定义;位变量、位标志变量定义TIMOUT BIT 00HOVER BIT01HKEYF BIT02H编程及调试编程及调试软件设计方法软件设计方法:自上而下自上而下自下而上自下而上基本过程:基本过程:用编辑软件编辑源程序、编译软件生成目标代码、程序用编辑软件编辑源程序、编译软件生成目标代码、程序测试、仿真运行、代码固化、样机试用、产品定型测试、仿真运行、代码固化、样
7、机试用、产品定型磨刀不误砍柴功磨刀不误砍柴功:前期调研细致、软硬件论证充分、指标吃准、数据格式前期调研细致、软硬件论证充分、指标吃准、数据格式定好、模块功能和接口条件落实、操作规范要和用户谈定好、模块功能和接口条件落实、操作规范要和用户谈妥、最后才开始设计程序设计、焊妥、最后才开始设计程序设计、焊PCB板、调试样机。板、调试样机。MCS-51单片机汇编程序一般格式内存变量定义ORG 0000HLJMP MAIN中断向量地址区 ORG 0030HMAIN:MOV SP,#XXH;设置堆栈CPU资源和内部变量初始化外部扩展功能部件初始化监控主程序(死循环程序)子程序区中断服务子程序区项表区(DB
8、XXH,XXH,END例例1:内部内部RAM从从DATA1单元有一数据块,存放若干无符号数,单元有一数据块,存放若干无符号数, 第一单元为数据块长度,求这些无符号数之和。第一单元为数据块长度,求这些无符号数之和。; 首址送首址送R0 ;长度送;长度送R1;检查长度是否为零;检查长度是否为零;为零则结束;为零则结束;不为零则开始运算;不为零则开始运算;加一个数;加一个数;长度减;长度减1不为零则转移不为零则转移;存和;存和起始地址起始地址程序主体程序主体汇编结束标志汇编结束标志标号标号注释注释上页上页下页下页回目录回目录MOV R1, DATA1 CJNE R1, #0 , NEXTORG 00
9、00H 0000H START:MOV R0,#DATA1HERE: SJMP $ NEXT: CLR ALOOP: INC R0 ADD A,R0 DJNE R1, LOOP MOV SUM , A SJMP HEREDATA1 DATA 20HSUM DATA 1FH END 上页上页下页下页回目录回目录四、评价程序质量的标准:四、评价程序质量的标准: 程序的执行时间程序的执行时间 程序所占用的内存字节数目程序所占用的内存字节数目 程序的逻辑性、可读性程序的逻辑性、可读性 程序的兼容性、可扩展性程序的兼容性、可扩展性 程序的可靠性程序的可靠性时时 间间空空 间间概概念念4.2 4.2 简单
10、程序简单程序简单程序简单程序简单程序的特点:简单程序的特点:简单程序的特点:简单程序的特点:既无分支,又无循环,按照顺序执行既无分支,又无循环,按照顺序执行既无分支,又无循环,按照顺序执行既无分支,又无循环,按照顺序执行例例例例4-24-2:将一个字节内的压缩将一个字节内的压缩BCD码拆开并变成码拆开并变成ASCII码,码, 存入两个存入两个RAM单元。单元。BCD码放在内部码放在内部RAM的的20H, 转换后高半字节放到转换后高半字节放到21H,低字节放,低字节放22H。 BCDH BCDLBCDH BCDL0011001100110011ROMROM21H21H22H22H20H20H方法
11、方法方法方法1 1:BCD码码09对应的对应的ASCII码为码为30H39H转换时,将转换时,将20H中的中的BCD码拆开,码拆开,高四位置为高四位置为“0011”即可。即可。BCDHBCDHBCDLBCDL上页上页下页下页回目录回目录可完成一定的基本功能,是编写复杂程序的基础可完成一定的基本功能,是编写复杂程序的基础可完成一定的基本功能,是编写复杂程序的基础可完成一定的基本功能,是编写复杂程序的基础ASCII码码附录附录1:ASCII码字符表码字符表程序:程序:程序:程序:0011 BCDH0011 BCDH0000 00000000 0000BCDH BCDLBCDH BCDLBCDLBC
12、DL0000000000110011BCDH BCDLBCDH BCDLROMROM21H21H22H22H20H20H00000000 BCDHBCDH00110011A上页上页下页下页回目录回目录ORG 0000HAJMP MAINORG 0030HMAIN:MOV A,20HANL A,#0FHORL A,#30HMOV 22H,AMOV A,20HSWAP AANL A,#0FHORL A,#30HMOV 21H,AHERE:SJMP HEREEND方法方法方法方法2 2:采用除采用除10H取余法将两个取余法将两个BCD数拆开数拆开BCDH BCDLBCDH BCDLA0001 000
13、00001 00000000 BCDH0000 BCDH0000 BCDL0000 BCDLBABDIV AB上页上页下页下页回目录回目录ORL , #30H AB0011 BCDH0011 BCDH0011 BCDL0011 BCDL 程序:程序:程序:程序: MOV A, 20H MOV B,#10H DIV AB ORL B, #30H MOV 22H, B ORL A, #30H ORG 0000H MOV 21H, A SJMP $ END;取取BCD码至码至A; 完成转换完成转换;存存ASCII码码;完成转换完成转换;存存ASCII码码;除除10H取余,使取余,使BCDH A 、B
14、CDL BBCDH BCDLBCDH BCDLA0001 00000001 00000000 BCDH0000 BCDH0000 BCDL0000 BCDLBABDIV AB0011001100110011BCDH BCDLBCDH BCDLROMROM21H21H22H22H20H20H上页上页下页下页回目录回目录方法方法方法方法2 2小结:小结:小结:小结: 以上程序用了以上程序用了7条指令,条指令, 16个内存字节,个内存字节, 执行时间为执行时间为13个机器周期。个机器周期。双字节求补双字节求补设:两个字节原码数存在设:两个字节原码数存在R1、R0中中求补后结果,存在求补后结果,存在R
15、3、R2中。中。例例例例4-34-3:方法:方法:方法:方法:求补采用求补采用“模模 - 原码原码”的方法的方法上页上页下页下页回目录回目录即用即用“0”去减去减“原码原码”R0R1原码原码-)R2R300H00H存在借位存在借位同样的功能,有不同的编程同样的功能,有不同的编程思路,出现不同的效果,影思路,出现不同的效果,影响程序的实时性及存储空间响程序的实时性及存储空间大小。大小。 程序:程序:程序:程序: CLR C CLR A SUBB A, R0 MOV R2, A CLR A SUBB A, R1 ORG 0000H MOV R3 , A SJMP $ END ;CY 0; A 0;
16、低字节求补低字节求补;送送R2;A清零清零;高字节求补高字节求补;送送R31111 11111111 1111R00000 00000000 00001111 11111111 1111R10000 00000000 0000R30000 00010000 0001R2CY 0 00000 00010000 0001 1 10000 00000000 0000 0 00000 00000000 0000A上页上页下页下页回目录回目录 将内部将内部RAM的的20H单元中的单元中的8位无符号二进制数,转换为位无符号二进制数,转换为3位位BCD码,并将结果存放在码,并将结果存放在BAI(百位)、(百
17、位)、SHI(十位)、(十位)、GE(个位)单元中。(个位)单元中。例例4-4:编程思路:编程思路: 可将被转换数除以可将被转换数除以100,得百位数;余数除以,得百位数;余数除以10得十位数;最后余数即为个位数。得十位数;最后余数即为个位数。编程如下:编程如下:例如例如:255(十进制)除以(十进制)除以100,得,得 2(百位数)(百位数) 余数除以余数除以10,得,得5(十位数)(十位数) 最后余数最后余数5即为个位数即为个位数上页上页下页下页回目录回目录 BCD EQU 20H BAI EQU 21H SHI EQU 22H GE EQU 23H ORG 0000H AJMP MAIN
18、 ORG 0030HMAIN: MOV SP,#60H MOV A,BCD MOV B,#100 DIV AB MOV BAI,A MOV A,B MOV B,#10 DIV AB MOV SHI,A MOV GE,B NOP LJMP $ END ;除;除100,得百位,得百位;余数除;余数除10,得十,得十位、个位位、个位码制转换程序:码制转换程序:HEX ASCII码;码;BIN ASCII码码4.3 分支程序分支程序 当执行完某一条指令时,为完成某些功能,根据某当执行完某一条指令时,为完成某些功能,根据某些条件判断,使程序或顺序执行,或转移到其它指令处些条件判断,使程序或顺序执行,或转
19、移到其它指令处执行,这就是分支程序。执行,这就是分支程序。编程编程编程编程思路思路思路思路这是一个这是一个简单分支程序简单分支程序,可以使两数相减,若,可以使两数相减,若CY=1,则被减数小于减数。用则被减数小于减数。用JC指令进行判断。指令进行判断。例例例例4-54-5 设内部设内部RAM30H,31H存放两个无符号数,试比较存放两个无符号数,试比较 两数的大小,较小的数存入两数的大小,较小的数存入30H单元,较大的数单元,较大的数 存入存入31H单元。单元。程序的流程图如下:程序的流程图如下:上页上页下页下页回目录回目录程序:程序:程序:程序:;做减法比较两数做减法比较两数CLR C MO
20、V A,30H SUBB A, 31H JC NEXT MOV A,30H XCH A,31HORG 0000H MOV 30H,A NEXT :NOPSJMP $END;CY 0;若(若(30H)小,则转移小,则转移;交换两数交换两数(30H)-(31H)CY=1?交换两数交换两数ENDSTART Y N流程图:流程图:上页上页下页下页回目录回目录多重分支程序举例多重分支程序举例例例例例4-74-7:设片内:设片内30H单元存放的是一元二次方程单元存放的是一元二次方程ax2+bx+c =0 根的判别式根的判别式= b2 4ac的值。的值。试根据试根据30H单元的值,编写程序,判断方程根的三种
21、情况,单元的值,编写程序,判断方程根的三种情况,存入片内存入片内31H内。内。在在31H中存放中存放“0”代表无实根,代表无实根, 存放存放“1”代表有相同的实根,代表有相同的实根, 存放存放“2”代表两个不同的实根。代表两个不同的实根。编程编程编程编程思路思路思路思路为有符号数,有三种情况,即小于零,等于零、大于为有符号数,有三种情况,即小于零,等于零、大于零。可以用两个条件转移指令来判断,零。可以用两个条件转移指令来判断, 首先判断符号位,用指令首先判断符号位,用指令JNB ACC.7, rel判断,判断, 若若ACC.7 = 1,则一定为负数;此时,则一定为负数;此时0 若若ACC.7
22、= 0,则,则0。此时再用指令。此时再用指令JNZ rel 判断判断 若若0,则,则 0,否则,否则= 0上页上页下页下页回目录回目录0= 0 0上页上页下页下页回目录回目录流程图:流程图:AACC.7=0?ENDSTART N Y(A)= 0?31H031H2 Y N31H1 0= 0 0程序:程序: ORG 0000HSTART:MOV A,30HJNB ACC.7,YESMOV 31H,#0SJMP FINISHYES: JNZ TOWMOV 31H,#1SJMP FINISHTOW: MOV 31H,#2FINISH:SJMP $END;值送值送A; 0 转转YES; 0转转 TOW;
23、有两个不同实根有两个不同实根上页上页下页下页回目录回目录4.3.3 N路分支程序路分支程序根据前面程序运行结果,可以有根据前面程序运行结果,可以有N种选择,并转向其种选择,并转向其中任一处程序。中任一处程序。例例4-10 128路分支程序:根据路分支程序:根据R3值转向值转向128个目的地址。个目的地址。编程方法:编程方法:顺序程序顺序程序 MOV A,R3 CJNE A,#00H,FZ1 AJMP FZ00FZ1: CJNE A,#01H,FZ2 AJMP FZ01 FZ2: CJNE A,#02H,FZ3 AJMP FZ02FZ3: . 烦琐,程序太长。烦琐,程序太长。如作如作10000个
24、分支个分支程序程序.使用使用 JMP A+DPTR指令实现指令实现:JMP128:MOV A,R3CLR CSUBB A,#128JNC ERRORMOV A ,R3MOV B,#3MUL ABMOV DPTR,#PRGTALADD A,DPLMOV DPL,AMOV A,DPHADDC A,BMOV DPH,ACLRAJMP A+DPTRPRGTAL:LJMP ROUT00LJMP ROUT01.LJMP ROUT127;入口条件检查入口条件检查 ;分支跳转分支跳转;LJMP指令占指令占3字节字节例例4-10:128分支程序分支程序JMP256JMP256:MOVMOVA A,R3R3;取;
25、取N N值值MOVMOVDPTRDPTR,#PRGTBL#PRGTBL;DPTRDPTR指向分支地址表首址指向分支地址表首址CLRCLRC C;RLCRLCA A;( (A A) ) 2 2JNCJNCLOW128LOW128;是前;是前128128个分支程序,则转移个分支程序,则转移INCINCDPHDPH;否基址加;否基址加256256LOW128LOW128:MOVMOVTEMPTEMP,A A;暂存;暂存A AINCINCA A;指向地址低;指向地址低8 8位位MOVCMOVCA A,A+DPTRA+DPTR;查表,读分支地址低;查表,读分支地址低8 8位位PUSHPUSHACCACC
26、;地址低;地址低8 8位入栈位入栈MOVMOVA A,TEMPTEMP;恢复;恢复A A,指向地址高,指向地址高8 8位位MOVCMOVCA A,A+DPTRA+DPTR;查表,读分支地址高;查表,读分支地址高8 8位位PUSHPUSHACCACC;地址高;地址高8 8位入栈位入栈RETRET;分支地址弹入;分支地址弹入PCPC实现转移实现转移PRGTBLPRGTBL:DWDWROUT00ROUT00; 256256个分支程序首地址个分支程序首地址DWDWROUT01ROUT01 ; 占用占用512512个单元个单元DWDWROUTFFROUTFF;例例4-11:256分支程序分支程序分支程序
27、应用场所:分支程序应用场所:1、键盘按键处理程序、键盘按键处理程序 根据所按功能键转到相应的功能子程序根据所按功能键转到相应的功能子程序2、通信协议处理程序、通信协议处理程序例:某键盘如下:例:某键盘如下:通通信信编号编号设置设置采样采样时间时间设置设置 + -确确认认 MOV A,B CLRC SUBB A,#3 JC FOUN RETFOUN:MOV A,B RL A ADD A,B MOV DPTR,#KEYF JMP A+DPTRKEYF:LJMP TONGXIN LJMP BIANHAO LJMP CAIYANG;键编号键编号4.4 循环程序循环程序循环程序:一些有规可循而又反复处理
28、的问题循环程序:一些有规可循而又反复处理的问题利用比较转移指令利用比较转移指令CJNE、减、减1不为不为“0”转移指令转移指令DJNZ等实现等实现例例4-13:在内部在内部RAM 30H4FH 连续连续32个单元中存放了个单元中存放了 单字节无符号数,求单字节无符号数,求32个无符号数之和,个无符号数之和, 并存入内部并存入内部RAM 51H,50H中。中。编程编程思路思路:这是重复相加问题,这是重复相加问题,要设置一些工作单元要设置一些工作单元 设:设:R0 做加数地址指针,做加数地址指针,R7 做循环次数计数器,做循环次数计数器,R3 做和数的高字节寄存器。做和数的高字节寄存器。A 做和数
29、的低字节寄存器做和数的低字节寄存器程序的流程图如下:程序的流程图如下:上页上页下页下页回目录回目录地址指针地址指针循环次数计数器循环次数计数器 流程图:流程图:31R7 #0R3(30H)A #31HR0CY=0?ENDSTART (R7)-1=0? 51H(R3)50H (A) Y N(A)+(R0)A(R0+1)R0(R3)+1R3上页上页下页下页回目录回目录NY 程序:程序:;R7作循环次数计数器作循环次数计数器;R3作和数高字节寄存器作和数高字节寄存器;取被加数取被加数;R0作加数地址指针作加数地址指针;CY=0,和,和256,则转则转;作加法作加法;CY=1,加到高字节,加到高字节;
30、修改修改R0指针指针;未完,重复加未完,重复加;存和数存和数初始化部分初始化部分循环体部分循环体部分结束部分结束部分 ORG 0000HSTART:MOV R7,#31MOV R3,#0MOV A,30HMOV R0,#31HLOOP:ADD A, R0JNC NEXTINC R3NEXT :INC R0DJNZ R7,LOOPMOV 51H,R3MOV 50H,ASJMP $END上页上页下页下页回目录回目录循环执行循环执行直到直到R7=0循环循环控制控制例例4-14:从从外部外部RAM BLOCK单元开始有一无符号数数据块,单元开始有一无符号数数据块,数据块长度存入数据块长度存入LEN单元
31、,单元,求出其中最大数存入求出其中最大数存入MAX单元。单元。为了方便进行比较,为了方便进行比较,我们使用我们使用CY标志来判断两数的大小,标志来判断两数的大小,使用使用B寄存器作比较与交换的寄存器,寄存器作比较与交换的寄存器,使用使用DPTR作外部作外部RAM地址指针地址指针。解:解:这是一个基本搜索问题这是一个基本搜索问题,采用两两比较法。取两者较采用两两比较法。取两者较 大的数再与下一个数进行比较,若数据块长度大的数再与下一个数进行比较,若数据块长度LEN=n则则应比较应比较n-1次,最后较大的数就是数据块中的最大数。次,最后较大的数就是数据块中的最大数。程序的流程图如下:程序的流程图如
32、下:上页上页下页下页回目录回目录流程图:流程图:DPTR#BLOCK LENLEN-1A(DPTR)CY=0?ENDSTART Y NLEN-1=0? MAX最大数最大数 Y NCY0 B(A) DPTR+1 A(DPTR) A(A)-(B)若(若(A)(B)则则A(B)+(A)上页上页下页下页回目录回目录A中中 的数较大的数较大较大数较大数交换至交换至A恢复恢复较大数较大数初始化初始化工作单元工作单元编程编程:;定义数据块首址定义数据块首址;定义最大数暂存单元定义最大数暂存单元;定义长度计数单元定义长度计数单元上页上页下页下页回目录回目录FMAX: MOV DPTR,#BLOCKORG 00
33、00HBLOCK DATA 0100HMAX DATA 31HLEN DATA 30HSJMP NEXT1NEXT: ADD A, BNEXT1: DJNZ LEN, LOOPMOV MAX, ASJMP $END DEC LENMOVX A,DPTRLOOP: CLR CMOV B, AINC DPTRMOVX A,DPTRSUBB A, BJNC NEXTMOV A, B;数据块首址送数据块首址送DPTR;长度减长度减1;取数至取数至A;0CY;修改指针修改指针;暂存于暂存于B;取下一数取下一数;大者送大者送A;若(若(A)(B)则恢复)则恢复A;未完继续比较未完继续比较;存最大数存最大数
34、;*若用若用RET指令结尾则指令结尾则 该程序可作子程序调用该程序可作子程序调用;作减法比较作减法比较RET例例4-15:从外部从外部RAM BLOCK单元开始有一数据块,单元开始有一数据块, 数据块长度存入数据块长度存入LEN单元,单元,试统计其中试统计其中正数正数、负数负数和和零零的个数的个数,分别存入分别存入PCOUNT、MCOUNT、ZCOUNT单元。单元。解:解:这是一个多重分支的单循环问题。数据块中是带符号数这是一个多重分支的单循环问题。数据块中是带符号数先用先用JB ACC.7,rel 指令判断符号位。指令判断符号位。程序的流程图如下:程序的流程图如下:若若ACC.7=1,则该数
35、一定是负数,则该数一定是负数,MCOUNT单元加单元加1;若若ACC.7=0,则该数可能是正数,也可能是零;,则该数可能是正数,也可能是零;用用JNZ rel 判断判断A是否为零是否为零若若A0,则一定是正数,则一定是正数,PCOUNT单元加单元加1;若既不为正也不为负,则一定是零,若既不为正也不为负,则一定是零,ZCOUNT单元加单元加1;上页上页下页下页回目录回目录流程图:流程图:DPTR#BLOCK PCOUNT0MCOUNT0 ZCOUNT0ACC.7=0?ENDSTART Y N(A)=0? DPTR+1 Y N A(DPTR)ZCOUNT+1MCOUNT+1LEN-1=0?PCOU
36、NT+1 Y N上页上页下页下页回目录回目录程序:程序:ORG 0200HBLOCK DATA 2000HLEN DATA 30HPCOUNT DATA 31HMCOUNT DATA 32HZCOUNT DATA 33H;定义数据块首址定义数据块首址;定义长度计数单元定义长度计数单元;定义正计数单元定义正计数单元;定义负计数单元定义负计数单元;定义零计数单元定义零计数单元上页上页下页下页回目录回目录;数据块首址送数据块首址送DPTR;计数单元清零计数单元清零;若若ACC.7=1 转负计数转负计数;取数取数;若(若(A)0,转正计数,转正计数;若(若(A)=0,则零的个数加,则零的个数加1;负计
37、数单元加负计数单元加1;正计数单元加正计数单元加1;修正指针修正指针;未完继续未完继续NEXT: INC DPTR DJNZ LEN,LOOPSJMP $ENDSTART:MOV DPTR,#BLOCK MOV PCOUNT,#0LOOP: MOVX A,DPTRJB ACC.7,MCONJNZ PCONINC ZCOUNTAJMP NEXTMCON: INC MCOUNT MOV MCOUNT,#0 MOV ZCOUNT,#0AJMP NEXTPCON:INC PCOUNT上页上页下页下页回目录回目录4.5 查表程序查表程序上页上页下页下页回目录回目录对于复杂参数的计算如对于复杂参数的计算如
38、:非线性参数非线性参数对数、指数、三角函数对数、指数、三角函数微分、积分等微分、积分等用汇编编程十分困难用汇编编程十分困难甚至无法建立数学模型甚至无法建立数学模型用用查表查表的方法简单容易的方法简单容易查表查表:把事先计算或测得的数据按一定顺序编制:把事先计算或测得的数据按一定顺序编制成表格,存放在程序存储器中。查表程序的任务成表格,存放在程序存储器中。查表程序的任务就是根据被测数据,查出最终所需要的结果。就是根据被测数据,查出最终所需要的结果。例例4-20:一个十六进制数放在一个十六进制数放在HEX单元的低四位单元的低四位, 将其转换成将其转换成ASCII码码 查表程序:查表程序:编程编程思
39、路思路十六进制十六进制 09 的的ASCII码为码为 30H39H, AF 的的ASCII码为码为 41H46H, 查表指令:查表指令: MOVC A,A+DPTRMOVC A,A+PC表格定义:用伪指令表格定义:用伪指令 DB 或或 DW 把表格的数据存把表格的数据存入入ROM上页上页下页下页回目录回目录来获得数据来获得数据ASCII码表格的首址为码表格的首址为ASCIITAB不连续的不连续的ASCTAB:DB 30H,31H,32H,33HDB 34H,35H,36H,37HDB 38H,39H,41H,42HDB 43H,44H,45H,46H END上页上页下页下页回目录回目录编程编程
40、1: 0 1 2 3 4 5 6 7 8 9 A B C D E FAJMP $ ORG 0000HHEX EQU 30HHEXASC: MOV A,HEXMOV DPTR,#ASCTABMOVC A,A+DPTRMOV HEX,AANL A,#0FH编程编程2: ORG 0000HHEX EQU 30HHEXASC: MOV A,HEXANL A,#0FHADD A,MOVC A,A+PCMOV HEX,AAJMP $ASCTAB:DB 30H,31H,32H,33HDB 34H,35H,36H,37HDB 38H,39H,41H,42HDB 43H,44H,45H,46HEND;变址调整变
41、址调整;2字节字节;2字节字节PCPC#4上页上页下页下页回目录回目录;变址调整变址调整4.6 子程序的设计及调用子程序的设计及调用一、子程序的概念一、子程序的概念把能完成某种基本操作并具有相同操作的程序段单独把能完成某种基本操作并具有相同操作的程序段单独 编成子程序。编成子程序。如:函数、如:函数、 运算、代码转换、延时等运算、代码转换、延时等子程序调用子程序调用 ACALL、LCALL子程序返回子程序返回 RET使用使用子程子程序的序的优点优点 不必重复书写同样的程序,提高编程效率不必重复书写同样的程序,提高编程效率 程序的逻辑结构简单,便于阅读程序的逻辑结构简单,便于阅读 缩短了源程序和
42、目标程序的长度,节省了存储器空间缩短了源程序和目标程序的长度,节省了存储器空间 使程序模块化、通用化、便于交流共享资源使程序模块化、通用化、便于交流共享资源 便于按某种功能调试便于按某种功能调试上页上页下页下页回目录回目录操作操作二、调用子程序的要点二、调用子程序的要点 子程序的子程序的名字:名字:子程序开头的标号段,也是其子程序开头的标号段,也是其入口地址入口地址, 供主程序调用。供主程序调用。例如:调用延时子程序例如:调用延时子程序主程序指令:主程序指令: LCALL DELAY 子程序返回子程序返回: 结尾必须使用一条从子程序返回指结尾必须使用一条从子程序返回指令令RET,它具有恢复断点
43、的功能,它具有恢复断点的功能RETRET; PC15 PC158 (SP) ,8 (SP) ,(SPSP) (SPSP) -1-1; PC7 PC70 (SP) ,0 (SP) ,(SPSP) (SPSP) -1-1主程序主程序LCALL断点断点子程序子程序RET1、子程序的结构、子程序的结构上页上页下页下页回目录回目录子程序:子程序: DELAY:MOV R7,#100DJNZ R7,$RET子程序名称子程序名称2、参数传递、参数传递子程序入口条件:子程序入口条件: 在调用一个子程序时,主程序应先把有关参数放到在调用一个子程序时,主程序应先把有关参数放到某些约定的位置,子程序运行时,可以从约
44、定的位置得某些约定的位置,子程序运行时,可以从约定的位置得到有关参数。到有关参数。子程序出口条件:子程序出口条件:子程序结束前,也应把处理结果送到约定位置子程序结束前,也应把处理结果送到约定位置参数传递的方法:参数传递的方法: 子程序无须传递参数子程序无须传递参数 这类子程序中所需要的参数是子程序赋予,这类子程序中所需要的参数是子程序赋予,不需要主程序给出不需要主程序给出上页上页下页下页回目录回目录主程序:主程序:.LCALL DELY.子程序:子程序:不需主程序提供入口参数,从子程序开始到子程序返回,不需主程序提供入口参数,从子程序开始到子程序返回,大约为大约为20ms例例4-23 调用延时
45、子程序调用延时子程序DELYDELY: MOV R7, #100DLY0: MOV R6, #98NOPDLY1: DJNZ R6, DLY1DJNZ R7, DLY0RET子程序开始的标号子程序开始的标号子程序返回指令子程序返回指令调用子程序调用子程序上页上页下页下页回目录回目录982=196s1s1s设:主频为设:主频为12MHZ2s(196+2+2) 100+3 =20003s = 20.003ms2s1s+3 用用累加器累加器和和工作寄存器工作寄存器传递参数传递参数入口参数:入口参数:放在累加器放在累加器A和工作寄存器中和工作寄存器中R0 R7中中出口参数:出口参数:放在累加器放在累加
46、器A和工作寄存器中和工作寄存器中R0 R7中中例例4-24 双字节求补子程序双字节求补子程序CPLD解:解:采用采用“取反加取反加1”的方法,十六位数取反加的方法,十六位数取反加1, 不仅低字节要加不仅低字节要加1,高字节要加低字节的进位。,高字节要加低字节的进位。 故采用故采用ADD指令,不采用指令,不采用INC指令。指令。 INC指令不影响指令不影响CY位位上页上页下页下页回目录回目录入口参数:(入口参数:(R7R6)=16位数位数出口参数:(出口参数:(R7R6)=求补后的求补后的16位数位数 CPLD: MOV A,R6CPL A ADD A,#1 MOV R6,A MOV A,R7
47、CPL A ADDC A,#0 MOV R7,A RET上页上页下页下页回目录回目录Cy+ Cy R0 R0 R0 通过操作数通过操作数地址地址传递参数传递参数入口参数:(入口参数:(R0)=求补数低字节指针求补数低字节指针,(R7)=n-1出口参数:(出口参数:(R0)=求补后高字节指针求补后高字节指针例例4-25 n字节求补子程序字节求补子程序CPLNCPLN: MOV A,R0CPL AADD A,#1MOV R0,AMOV A,R0CPL AADDC A,#0MOV R0,ARETNEXT: INC R0DJNZ R7, NEXT上页上页下页下页回目录回目录内部内部RAM字节字节1字节
48、字节2字节字节3字节字节n R0 R0地址 通过通过堆栈堆栈传递参数传递参数例例4-26 在在HEX单元存放两个十六进制数,将它们分别单元存放两个十六进制数,将它们分别 转换成转换成ASCII码并存入码并存入ASC和和ASC+1单元单元解:解: 由于要进行两次转换,故可调用查表子程序完成由于要进行两次转换,故可调用查表子程序完成MAIN:.PUSH HEX LCALL HASCPOP ASCMOV A, HEXSWAP APUSH ACCLCALL HASCPOP ASC+1.;转子转子;压入压入 被转换数被转换数;ASCLASC;取被转换数取被转换数;处理高四位处理高四位;压入压入;转子程序
49、转子程序;ASCASC+1主程序主程序*PCH*PCL HEXSPSP+1SP+2SP+3栈底栈底*PC 断点地址断点地址上页上页下页下页回目录回目录尽量少用尽量少用MOVC A,A+PC HASC: DEC SPDEC SPPOP ACCANL A,#0FHADD A,#5PUSH ACCINC SPINC SPRETASCTAB: DB 0 1 2 7 DB 8 9 A F;弹出弹出;修改修改SP指向指向HEX;屏蔽高四位屏蔽高四位;变址调整变址调整;查表查表;结果入栈结果入栈;修改修改SP指向断点位置指向断点位置;子程序子程序上页上页下页下页回目录回目录*PCH*PCL HEXSPSP+
50、1SP+2SP+3栈底栈底AHEXResultResultSP+1SP+2SP+3PC HEX SPSPSPSP .PUSH HEX LCALL HASCPOP ASCMOV A, HEXSWAP APUSH ACCLCALL HASCPOP ASC+1.MOVC A,A+PCHASC: DEC SPDEC SPPOP ACCANL A,#0FHADD A,#5PUSH ACCINC SPINC SPRETASCTAB: DB 0 1 2 7 DB 8 9 A F60H61H62H63H64H HEX *PCL *PCHPC断点断点SP0000 HEXL ASCAASCSPSPSPSP主程序主
51、程序子程序子程序上页上页下页下页回目录回目录3、现场保护、现场保护 现场保护现场保护现场保护现场保护: : 如果子程序使用的寄存器与主程序使用的寄存器如果子程序使用的寄存器与主程序使用的寄存器 有冲突,在转入子程序前,特别是进行中断服务有冲突,在转入子程序前,特别是进行中断服务 子程序时,要进行现场保护。子程序时,要进行现场保护。保护内容保护内容保护内容保护内容: : 内部内部 RAM 内容,内容, 各工作寄存器内容,各工作寄存器内容, 主程序正在使用主程序正在使用 累加器累加器 A 、B DPTR PSW 保护方式保护方式保护方式保护方式: : 将要保护的单元将要保护的单元压入堆栈压入堆栈。
52、 还可以用还可以用 RS1 RS0 来选择其他通来选择其他通 用寄存器组,以便保护主程序现场。用寄存器组,以便保护主程序现场。上页上页下页下页回目录回目录例如:某子程序的现场保护例如:某子程序的现场保护BCDCB: PUSH ACCPUSH PSWPUSH DPLPUSH DPH.POP DPHPOP DPLPOP PSWPOP ACCRET推入与弹出应按照推入与弹出应按照“先进后出先进后出”,或,或“后进先出后进先出”的顺的顺序序; 保护现场保护现场; 子程序功子程序功能语句能语句; 恢复现场恢复现场;上页上页下页下页回目录回目录三、子程序的调用及嵌套三、子程序的调用及嵌套1、子程序的调用、
53、子程序的调用上页上页下页下页回目录回目录2、子程序的嵌套、子程序的嵌套子程序的嵌套:子程序的嵌套:子程序的嵌套:子程序的嵌套: 子程序中可调用其他子程序子程序中可调用其他子程序汇编语言子程序,可否自己调用自己?汇编语言子程序,可否自己调用自己?常见常见MCS-51子程序:子程序:1、算术运算子程序、算术运算子程序多字节多字节BCD码加法、减法、求补、移位;双字节码加法、减法、求补、移位;双字节二进制无符号数乘法、平方、除法、开平方;平均值二进制无符号数乘法、平方、除法、开平方;平均值2、代码转换子程序、代码转换子程序单字节单字节HEX数转双字节数转双字节ASCII码、码、ASCII码转码转HE
54、X;单字节;单字节HEX数转数转BCD码等码等3、查找、查找单字节单字节HEX无(有)符号数据块极值;查表;排无(有)符号数据块极值;查表;排序;序;4.7 程序设计举例程序设计举例例例例例4-294-29 多字节无符号数减法子程序多字节无符号数减法子程序NSUB功能:功能:功能:功能:n n字节无符号数减法字节无符号数减法字节无符号数减法字节无符号数减法入口:入口:入口:入口:(R0)=被减数低字节指针(被减数低字节指针(R1)=减数低字节指针减数低字节指针(R7)= 字节数字节数n出口出口出口出口:(R0)=差数高字节地址指针差数高字节地址指针解解解解 : 的若被减数大于减数,则差为正数;
55、若被减数小于的若被减数大于减数,则差为正数;若被减数小于 减数,则差为补码数(负数),且差数为减数,则差为补码数(负数),且差数为n字节字节上页上页下页下页回目录回目录流程图:流程图:0CY (R0)-(R1)-CY(R0)RETNSUB(R7)-1=0?修改地址指针修改地址指针(R0)+1R0,R1+1R1 NNSUB: CLR CLOOP: MOV A,R0 MOV R0, ASUBB A, R1INC R0INC R1DJNZ R7, LOOPDEC R0RET程序:程序:上页上页下页下页回目录回目录例例例例4-304-30 双字节无符号数快速乘法子程序双字节无符号数快速乘法子程序MUL
56、D功能:功能:功能:功能: 双字节无符号数乘法,积为双字节无符号数乘法,积为双字节无符号数乘法,积为双字节无符号数乘法,积为3232位位位位入口:入口:入口:入口: (R7R6)= 被乘数被乘数ab(R5R4)= 乘数乘数cd(R0)= 有定义的内部有定义的内部RAM地址地址出口出口出口出口: (R0)= 乘积的高字节地址指针乘积的高字节地址指针解解解解 :于两个双字节无符号数相乘,用于两个双字节无符号数相乘,用8位乘法指令来完成位乘法指令来完成需要四次,每次的乘积为需要四次,每次的乘积为16位,会产生位,会产生4个部分积,共需个部分积,共需要要8个单元存放,然后再按个单元存放,然后再按“位权
57、位权”相加,和即为所求之相加,和即为所求之积。这样所占存储单元太多,应该采用边乘边加的方法。积。这样所占存储单元太多,应该采用边乘边加的方法。用用R3、R2、R1作暂存器或工作单元。作暂存器或工作单元。上页上页下页下页回目录回目录 R6 b b R7 a a R4 d d R5 c c编程思路与手乘法相似:编程思路与手乘法相似:被乘数被乘数乘数乘数上页上页下页下页回目录回目录 R6 b b R4 d dbdHbdHbdLbdL R7 a aadHadHadLadL R5 c cbcLbcLbcHbcHacLacLacHacHbdLbdLadHadHbdH+ adL+bcLbdH+ adL+bc
58、LadH+ bcH+acLadH+ bcH+acL相乘过程相乘过程上页上页下页下页回目录回目录MULD:MOV A, R6MOV B, R4MUL ABMOV R0, AMOV R3, BMOV A, R7MOV B, R4MUL ABADD A, R3MOV R3, AMOV A, BADDC A, #0MOV R2, AMOV A, R6MOV B, R5MUL ABADD A, R3 程序程序;bd;存积存积70, bdL(R0);adL+bdH;暂存,暂存,adL+bdHR3;ad; adHA;bcL+adL+cy; adH+cyA;bc;暂存,暂存, adH+cyR2;上页上页下页下
59、页回目录回目录INC R0MOV R0, AMOV R1, #0MOV A,R2ADDC A, BMOV R2, AJNC LASTINC R1LAST: MOV A, R7MOV B, R5MUL ABADD A, R2INC R0MOV R0, AMOV A, BADDC A, R1INC R0MOV R0, ARET;用用R1记录记录cy;bcH+adH+cy;存积存积158, bcL+ adL+bdH(R0+1);暂存,暂存, bcH+adH+cyR2;cy=0, 则转则转LAST;R0+1;cy=1,则(则(R1)=1; ac; acL+bcH+adH+cy ;(R0+3);R0+2
60、; acH+cy ;存积存积2316, acL+bcH+adH+cy (R0+2);存积存积3124, acH+cy (R0+3)上页上页下页下页回目录回目录例例例例4-334-33 多字节十进制加法子程序多字节十进制加法子程序BCDADD功能:功能:功能:功能:n n字节十进制加法字节十进制加法字节十进制加法字节十进制加法入口:入口:入口:入口:(R0)= 被加数低字节指针(被加数低字节指针(R1)= 加数低字节指针加数低字节指针(R7)= 字节数字节数n出口出口出口出口:(R0)= 和数高字节地址指针和数高字节地址指针解解解解 : 两数相加,和数为两数相加,和数为n+1字节。若字节。若cy
61、=0,则(,则(n+1)字节)字节 为为0;若;若cy=1,则(,则(n+1)字节为)字节为1上页上页下页下页回目录回目录BCDADD: CLR CADDL: MOV A, R0ADDC A, R1DA AMOV R0, AINC R0INC R1DJNZ R7, ADDLCLR AMOV ACC.0, CMOV R0, ARET程序:程序:上页上页回目录回目录过过 “9” 补补 “6”CY 例例例例4-64-6:空调机制冷时,若排出的空气温度比吸入的空气空调机制冷时,若排出的空气温度比吸入的空气 温度低温度低8则认为工作正常,否则便认为是故障,则认为工作正常,否则便认为是故障, 并设置故障标
62、志。并设置故障标志。解:解:解:解:为了可靠的监控空调机的工作情况,做两次减法:为了可靠的监控空调机的工作情况,做两次减法:第一次(第一次(40H)-(41H),若),若CY=1 ,则肯定有故障;,则肯定有故障;第二次两个温度的差值减去第二次两个温度的差值减去8 ,若,若CY=1 ,则肯定,则肯定有故障有故障程序的流程图如下:程序的流程图如下:上页上页下页下页回目录回目录首先定义一些工作单元首先定义一些工作单元内部内部RAM40H41H42H吸入温度值吸入温度值排出温度值排出温度值故障标志故障标志A(40H)-(41H)CY=1?(A)-8ENDSTART Y NCY=1?42HFFH42H0
63、 Y N流程图:流程图:上页上页下页下页回目录回目录故故 障障正常正常 ORG 1000HSTART:MOV A,40HCLR CSUBB A,41HJC ERRORMOV 42H,#0JC ERRORSUBB A,#8SJMP EXITERROR:MOV 42H,#0FFHEXIT: SJMP $END程序:程序:;吸入温度值送;吸入温度值送A; 0 CY; A(40H)-(41H);CY=1,则故障,则故障;是则故障是则故障;温度小于温度小于8?;工作正常标志工作正常标志;转出转出口口;设置故障标志设置故障标志若若CY1顺顺序执行序执行CY=1转转移移CY=1转转移移若若CY1顺顺序执行序
64、执行上页上页下页下页回目录回目录一般软件的容错设计一般软件的容错设计1、堆栈溢出的预防堆栈溢出的预防堆栈设置在片内堆栈设置在片内RAM区,片内资源有限,使堆栈区范围有限。区,片内资源有限,使堆栈区范围有限。堆栈溢出,将引起程序堆栈溢出,将引起程序“跑飞跑飞”,危害极大。,危害极大。减少系统对堆栈的需求量方法减少系统对堆栈的需求量方法:1、取消部分子程序、取消部分子程序2、尽量不用堆栈来传递参数和结果、尽量不用堆栈来传递参数和结果3、根据需要减少子程序现场保护量、根据需要减少子程序现场保护量系统对堆栈的极限需求量计算方法系统对堆栈的极限需求量计算方法: 主程序最大需量主程序最大需量+低级中断最大
65、需量低级中断最大需量+高级中断的最大需量高级中断的最大需量2、状态转移的条件审查、状态转移的条件审查一般情况下,程序自当前状态进入下一状态,往往取一般情况下,程序自当前状态进入下一状态,往往取决于一个特定的条件。决于一个特定的条件。对重要条件要进行审查对重要条件要进行审查,确保,确保安全进入下一个状态。安全进入下一个状态。如如:散转程序的入口条件;:散转程序的入口条件;如如:直线切削控制:当前状态为刀架快进,:直线切削控制:当前状态为刀架快进,快进量快进量完成后进入下一个状态,停止快进,开始切削。完成后进入下一个状态,停止快进,开始切削。可靠性设计中可靠性设计中,还要考虑:如冷却泵运转否?主轴
66、,还要考虑:如冷却泵运转否?主轴电机运转否?等其它条件。电机运转否?等其它条件。好处好处:防止软件设计错误对条件破坏、干扰的结果:防止软件设计错误对条件破坏、干扰的结果对条件的影响等对条件的影响等3、重要模块的安全性措施、重要模块的安全性措施某些重要模块的执行对系统有重大影响,如果错误执行某些重要模块的执行对系统有重大影响,如果错误执行将引起严重后果。系统受到干扰后,程序有可能弹飞到将引起严重后果。系统受到干扰后,程序有可能弹飞到该模块中引起非法执行,降低系统可靠性。该模块中引起非法执行,降低系统可靠性。1)、加强模块入口条件审查;、加强模块入口条件审查;2)、为执行模块配备、为执行模块配备“
67、密码密码”措施措施:入口入口例行条件检查例行条件检查满足否?满足否?操作准备操作准备返回返回密码检查密码检查符合否?符合否?清除密码清除密码实质性操作实质性操作出错处理出错处理返回返回NYNY4、软件算法的冗错设计、软件算法的冗错设计1)、逻辑运算的冗错设计)、逻辑运算的冗错设计思路思路:画卡诺图、逻辑化简、程序设计、出错处理:画卡诺图、逻辑化简、程序设计、出错处理注意必须作逻辑变量的全覆盖设计注意必须作逻辑变量的全覆盖设计2)、数值运算的容错设计)、数值运算的容错设计容错功能从两个方面考察:一是对入口条件的要求容错功能从两个方面考察:一是对入口条件的要求是否苛刻;二是出口信息中是否包括出错信
68、息是否苛刻;二是出口信息中是否包括出错信息、入口条件审查、入口条件审查如:双字节除单字节、商存单字节正整数如:双字节除单字节、商存单字节正整数的运算子程序的入口条件?的运算子程序的入口条件?考虑考虑:除数是否为:除数是否为0?商是否超出一个字?商是否超出一个字节的范围?节的范围?、必须对某些运算的中间结果和最终结果进行检、必须对某些运算的中间结果和最终结果进行检查,并对结果做出处理查,并对结果做出处理如:如:A=235+5B-6C ,已知:,已知:B200, C200,A是是1字节的整数。字节的整数。首先做入口条件检查:首先做入口条件检查:B200?C200?能否保证结能否保证结果正确果正确?
69、5B-6C0?B远大于远大于C,出现,出现A255情况情况(B=125, C=0, BC, A=235+25=260)、出错信息的设计和使用、出错信息的设计和使用出错信息要设计的丰富一些,便于人们了解出出错信息要设计的丰富一些,便于人们了解出错的详细情况,以便对症处理。错的详细情况,以便对症处理。、合理安排运算方案,减少舍入误差对最终结果的影响、合理安排运算方案,减少舍入误差对最终结果的影响。如计算:如计算:9/5*6方法方法1:MOV A,#9MOV B,#5DIVABMOV B,#6MUL AB方法方法2:MOV A,#9MOV B,#6MUL ABMOV B,#5DIVAB结果:结果:6
70、结果:结果:101、先进行无偏差或偏差小的运算;、先进行无偏差或偏差小的运算;2、尽量避免两数值相近的数过早相减;避免用绝对值、尽量避免两数值相近的数过早相减;避免用绝对值小的数作分母等小的数作分母等建议建议:、将复杂运算过程用查表来代替。、将复杂运算过程用查表来代替。CPU抗干扰技术抗干扰技术 当干扰作用到当干扰作用到CPU本身时,本身时,CPU有可能将操作数有可能将操作数当做操作码来执行,使其不能按正常状态执行程序,当做操作码来执行,使其不能按正常状态执行程序,从而引起混乱。从而引起混乱。 如何及时发现如何及时发现CPU受到干扰、如何拦截失去控制受到干扰、如何拦截失去控制的程序流向、如何使
71、系统的损失减小、如何尽可能地的程序流向、如何使系统的损失减小、如何尽可能地恢复系统正常状态,便是恢复系统正常状态,便是CPU抗干扰技术研究的课题。抗干扰技术研究的课题。1、睡眠抗干扰、睡眠抗干扰2、指令冗余;、指令冗余; 3、软件陷阱;、软件陷阱; 4、程序运行监视系统(、程序运行监视系统(WATCHDOG) CPU抗干扰技术抗干扰技术当干扰作用到当干扰作用到CPU本身时,本身时,CPU将不能按正常状态执行将不能按正常状态执行程序,从而引起混乱。程序,从而引起混乱。1、睡眠抗干扰、睡眠抗干扰CMOS型单片机通过执行型单片机通过执行ORL PCON,#1可以进入睡可以进入睡眠状态,只有定时眠状态
72、,只有定时/计数系统和中断系统处于值班状态。计数系统和中断系统处于值班状态。这时这时CPU对系统三总线上的出现的干扰不会作出什么反对系统三总线上的出现的干扰不会作出什么反应,从而大大降低系统对干扰的敏感程度。应,从而大大降低系统对干扰的敏感程度。软件设计:软件设计:主程序自检、初始化主程序自检、初始化LOOP:ORL PCON,#1LJMP LOOP中断唤醒中断唤醒CPUPC指针自动压栈指针自动压栈中断服务程序中断服务程序中断返回中断返回CPU睡眠睡眠PC指针位置指针位置回目录回目录2、指令冗余、指令冗余CPU受干扰后,往往将操作数当作操作码执行,造成程序混乱。受干扰后,往往将操作数当作操作码
73、执行,造成程序混乱。当程序弹飞到一单字节指令上时,便自动纳入正轨;当程序弹飞到一单字节指令上时,便自动纳入正轨;当程序弹飞到一双字节指令上时,有可能落到操作数上,当程序弹飞到一双字节指令上时,有可能落到操作数上,从从 而继续出错;而继续出错;当程序弹飞到一三字节指令上时,因其有两个操作当程序弹飞到一三字节指令上时,因其有两个操作数,从而继续出错机会更大数,从而继续出错机会更大 。 应多采用单字节指令,并在关键地方人为插入一些单字应多采用单字节指令,并在关键地方人为插入一些单字节指令,或将有效单字节指令重复书写,提高弹飞程序纳入节指令,或将有效单字节指令重复书写,提高弹飞程序纳入正轨的机会,这便
74、是指令冗余。正轨的机会,这便是指令冗余。实现方法实现方法:在一些对程序流向起决定作用的指令之前插入两条在一些对程序流向起决定作用的指令之前插入两条NOP指令,指令,以保证弹飞的程序迅速纳入正确的控制轨道。这些指令有:以保证弹飞的程序迅速纳入正确的控制轨道。这些指令有:RET、RETI、LCALL、LJMP、JZ/JNZ、JC/JNC、JB/JNB、JBC、CJNE、DJNZ等。等。下页下页如:利用减法比较两无符号数的大小程序(数放如:利用减法比较两无符号数的大小程序(数放A、B中):中):无指令冗余程序无指令冗余程序:CLRCSUBB A,BJCBBIGNOPBBIG:NOP.有指令冗余的情况
75、:有指令冗余的情况:CLRCSUBB A,BNOPNOPJCBBIGNOPBBIG:NOP.指令冗余缺点:指令冗余缺点:降低指令执行效率降低指令执行效率指令冗余特点指令冗余特点:1、降低正常程序执行的效率;降低正常程序执行的效率;2、可以减少程序弹飞的次数,使其很快纳入程序轨道,可以减少程序弹飞的次数,使其很快纳入程序轨道,使使CPU按按“操作码、操作数操作码、操作数”方式运行,但不能保证失控方式运行,但不能保证失控期间不干坏事,更不能保证程序纳入正常轨道后太平无事。期间不干坏事,更不能保证程序纳入正常轨道后太平无事。因为弹飞的程序已经偏离正常顺序,做了不该做的事。解因为弹飞的程序已经偏离正常
76、顺序,做了不该做的事。解决这个问题还要靠软件容错技术,减少或消灭程序误动作。决这个问题还要靠软件容错技术,减少或消灭程序误动作。3、指令冗余使弹飞程序安定下来是有条件的,首先弹指令冗余使弹飞程序安定下来是有条件的,首先弹飞的程序要落到程序区,其次必须执行到冗余的指令。飞的程序要落到程序区,其次必须执行到冗余的指令。当程序弹飞到非程序区时,或弹飞的程序碰到冗余指当程序弹飞到非程序区时,或弹飞的程序碰到冗余指令前已形成死循环,都会使冗余指令失去作用。令前已形成死循环,都会使冗余指令失去作用。3、软件陷阱、软件陷阱所谓软件陷阱所谓软件陷阱,就是一条引导指令,强行,就是一条引导指令,强行将扑获的程序引
77、向一个指定的地址,在那里将扑获的程序引向一个指定的地址,在那里有一段专门对程序出错进行处理的程序。有一段专门对程序出错进行处理的程序。软件陷阱由三条指令构成:软件陷阱由三条指令构成:NOPNOPLJMP ERR ;ERR错误处理程序入口错误处理程序入口软件陷阱安排在下列四种地方:软件陷阱安排在下列四种地方:1)、未使用的中断向量区)、未使用的中断向量区2)、未使用的大片)、未使用的大片ROM区区3)、表格区尾部)、表格区尾部下页下页4)、程序区)、程序区软件陷阱安排在程序的断裂点处软件陷阱安排在程序的断裂点处,这类指令有,这类指令有LJMP、SJMPAJMP、RET、RETI,正常执行的程序到
78、此便不会继续往下执行,如果还要顺序执行,必,正常执行的程序到此便不会继续往下执行,如果还要顺序执行,必然是出错了,就有必要设陷阱将其扑捉出来。然是出错了,就有必要设陷阱将其扑捉出来。如根据累加器如根据累加器A内容的正、负、零情况进行三分支的程序中,内容的正、负、零情况进行三分支的程序中,软件陷阱软件陷阱的安的安置如下:置如下: JNZ XYZ ;零处理零处理 LJMP ABC NOP NOP LJMP ERRXYZ: JB ACC.7,UVW ;正数处理;正数处理 LJMP ABC NOP NOP LJMP ERRUVW: ;负数处理;负数处理ABC: ;取结果;取结果RET NOP NOP
79、LJMP ERR回目录回目录4、程序运行监视系统(、程序运行监视系统(WATCHDOG)如果弹飞的程序弹飞到一个临时构成的死循环中,冗余指令如果弹飞的程序弹飞到一个临时构成的死循环中,冗余指令和软件陷阱就无能为力了。这时系统将完全瘫痪。和软件陷阱就无能为力了。这时系统将完全瘫痪。解决方法:解决方法:1)、手动复位;)、手动复位; 2)、)、采用程序运行监视系统采用程序运行监视系统WATCHDOG特性特性: 1)、本身是能独立工作的定时器,基本不依赖)、本身是能独立工作的定时器,基本不依赖CPU工作。工作。 2)、)、CPU在一个固定的时间间隔中和该系统打一次交道在一个固定的时间间隔中和该系统打
80、一次交道(喂一次狗),以表明系统(喂一次狗),以表明系统“目前正常目前正常”。 3)、当)、当CPU掉入死循环后,能及时发现并使系统复位。掉入死循环后,能及时发现并使系统复位。下页下页计数器型计数器型WATCHDOG电路电路 555振荡振荡电路电路 计数器计数器ABQAQDRESETCLR74LS931000pF5.1k10k0.1uF10K10uF1kP1.78031下页下页WATCHDOG电路构成电路构成1、计数器形式;、计数器形式;2、单稳态电路形式;、单稳态电路形式;3、集成集成WATCHDOG电路,电路,如如X5045、IMP813L、MAX705 等等。等等。以上措施只解决了如何发现系统被干扰,及如何扑捉失以上措施只解决了如何发现系统被干扰,及如何扑捉失控的程序,仅此是不够的。还要让计算机根据被破坏的控的程序,仅此是不够的。还要让计算机根据被破坏的现场中的现场中的残留信息自动恢复残留信息自动恢复到正常工作状态。到正常工作状态。结束结束