《第七单元复位中断与程序控制》由会员分享,可在线阅读,更多相关《第七单元复位中断与程序控制(19页珍藏版)》请在金锄头文库上搜索。
1、第七单元 复位、中断与程序控制本单元学习要点1. 单片机为什么要复位?如何能可靠地复位?复位对单片机片内存储器的影响如何?2. 为何要有程序流向控制?怎样实现程序流向控制?有哪几种方法? 3. 程序为何要中断?中断过程如何?如何开放和响应中断?4. 改变程序流向的指令及其应用。5. 中断服务子程序与一般的子程序的异同点。如何编写中断服务子程序?如何编写一般的子程序?7.1 复位7.1.1 复位的意义单片机开始工作时,必须处于一种确定的状态,否则,不知哪里是第一条程序,如何开始运行程序?口线的电平和输入/输出状态的不确定,可能使外围设备的误动作,导致严重事故的发生;内部一些控制寄存器(专用寄存器
2、)的内容不确定,可能导致定时器溢出、程序尚未开始就要中断,串口胡乱向外外设数据。因此,任何单片机在开始工作前,都必须进行一次复位过程,使单片机处于一种确定的状态。单片机进入复位过程有三种途径:上电(开机)复位、手动复位和监控电路(看门狗或电源监控等)复位。顾名思义,上电复位就是开机给单片机系统加电时单片机进行复位操作。手动复位是人为地强行使单片机进行复位操作。而为了提高系统的可靠性,在单片机应用系统中专门设计了一些电路用以监控系统的电源(如电源电压过低可能导致单片机执行错误的指令与程序)和单片机的状态,如果出现异常,这些电路将强制单片机复位。7.1.2 复位电路HMOS型8051的复位结构见图
3、1-44。复位引脚RST(它还是掉电方式下内部RAM的供电端VPD)通过一个斯密特触发器与复位电路相连斯密特触发器用来抑制噪声,它的输出在每个机器周期的S5P2由复位电路采样一次89C52的内部复位结构见图7-1,此处复位引脚称为RST。RST斯密特触发器复位电路图7-1 89C52的内部复位结构上电复位电路见图7-2(a)。上电瞬间RST端的电位与VCC相同,随着充电电流的减小,RST的电位逐渐下降。按图中所示的电路参数(其中8.2k是斯密特触发器输入端的一个下拉电阻),时间常数为秒82毫秒,只要VCC的上升时间不超过1毫秒,振荡器建立时间不超过10毫秒,这个时间常数足以保证完成复位操作。上
4、电复位所需的最短时间是振荡器建立时间加上2个机器周期,在这段时间内RST端的电平应维持高于斯密特触发器的下阈值。图7-2(b)和(c)示出外部复位电路的可能方案。(a)图中的第一方案由外部提供一个复位脉冲,此复位脉冲应保持宽于个机器周期。复位脉冲过后,由内部下拉电阻保证RST端为低电平。(b)图中的第二方案是上电复位与手动复位相结合的方案。上电复位的工作过程与图7-2(a)的相似。手动复位时,按下复位按钮,电容C通过电阻R!迅速放电,使RST迅速变为高电平,复位按钮松开后,电容通过R2和内部下拉电阻充电,逐渐使RST端恢复低电平。图7-2 外部复位电路7.1.3 单片机复位后的状态在振荡器正在
5、运行的情况下,复位是靠在RST引脚处至少保持2个机器周期(24个振荡器周期)的高电平而实现的。在RST端出现高电平后的第2个周期,执行内部复位,以后每个周期重复一次,直至RST端变低。复位后,各内部寄存器的状态如表7-1所列。表7-1 89C52复位后各内部寄存器的状态寄存器内容PC0000HACC00HB00HPSW00HSP07HDPTR0000HP0P30FFHIP(XX)IE(0X)TMOD00HTCON00HT2CON00HTH000HTL000HTH100HTL100HTH200HTL200HRLDH00HRLDL00HSCON00HSBUF不定PCON(0XXX0000)复位时还
6、把ALE和(它们是准双向口结构的)配置为输入状态,即ALE和。内部RAM不受复位的影响。VCC通电时,RAM内容是不定的,除非RAM是由低功耗操作方式下返回的。7.2 程序控制单片机的工作原则绝对地是“一心一意”,只能按照程序的流向一步步地执行下去。为了使单片机具有“智能”,也就是使单片机根据所检测到的外接状况、或人们给它的命令,以及某种运算、判断的结果来改变程序的流向。可以说,单片机能处理上述情况的种类越多和作出的改变越复杂,说明单片机的“智能”越高。控制程序流向的方式有两大类:硬件和软件。硬件的方式有复位和中断等,对于89C52来说,硬件使程序流向固定的入口地址。如复位的入口地址是0000
7、H,各个中断都有各自固定的入口地址。软件的方式是调用(CALL)指令、跳转(JMP)指令、判断跳转(条件转移,J、CJ和DJ)、布尔量判断跳转(条件转移,J)和子程序返回(RET、RETI)指令。程序的流向不是固定的:子程序返回(RET、RETI)由堆栈中保存的返回地址来确定,而其它则由指令中的操作数来指定。 软件的方式又可以分为两类:转移类和调用子程序类。转移类又分为条件转移和无条件转移两类。表7-2列出程序流向控制的分类。表7-2 程序流向控制的分类硬 件软件(指令)调用子程序转 移条 件无条件复位,中断LCALL,ACALLRET,RETIJB,JNB,CJNE,DJNZ,JZ,JNZ,
8、JC,JNCLJMP,AJMP7.3 程序流向控制的指令控制程序转移类指令共有17条,布尔变量控制程序转移的指令有5条,总共22条。其中有全存贮空间的长调用、长转移和按2KB分块的程序空间内的绝对调用和绝对转移;全空间和长相对转移及一页范围的短相对转移;还有不少条件转移指令。这类指令用到的助记符有ACALL、AJMP、LCALL、LJMP、SJMP、JMP、JZ、JNZ、CJNE、DJNZ、JC、JNC、JB、JNB和JBC。1. 绝对调用 a10a9a810001格式:ACALL addr 11代码:a7a6a5a4a3a2a1a0操作:(PC)(PC)+2(SP)(SP)+1(SP)(PC
9、70)(SP)(SP)+1(SP)(PC158)(PC100)指令中的2KB区内地址a100说明:指令的操作码与被调用子程序的入口地址的页号有关。每一种操作码可分别对应32个页号。见表7-3。指令中指定的a100为区内地址。表7-3 ACALL和AJMP指令操作码与页面的关系子程序入口转移地址页面号操作码ACALL AJMP00 08 10 18 20 28 30 38 40 48 50 58 60 68 70 7880 88 90 98 A0 A8 B0 B8 C0 C8 D0 D8 E0 E8 F0 F8110101 09 11 19 21 29 31 39 41 49 51 59 61
10、69 71 7981 89 91 99 A1 A9 B1 B9 C1 C9 D1 D9 E1 E8 F1 F9312102 0A 12 1A 22 2A 32 3A 42 4A 52 5A 62 6A 72 7A82 8A 92 9A A2 AA B2 BA C2 CA D2 DA E2 EA F2 FA514103 0B 13 1B 23 2B 33 3B 43 4B 53 5B 63 6B 73 7B83 8B 93 9B A3 AB B3 BB C3 CB D3 DB E3 EB F3 FB716104 0C 14 1C 24 2C 34 3C 44 4C 54 5C 64 6C 74
11、7C84 8C 94 9C A4 AC B4 BC C4 CC D4 DC E4 EC F4 FC918105 0D 15 1D 25 2D 35 3D 45 4D 55 5D 65 6D 75 7D85 8D 95 9D A5 AD B5 BD C5 CD D5 DD E5 ED F5 FDB1A106 0E 16 1E 26 2E 36 3E 46 4E 66 6E 66 6E 76 7E86 8E 96 9E A6 AE B6 BE C6 CE E6 EE E6 EE F6 FED1C107 0F 17 1F 27 2F 37 3F 47 4F 77 7F 67 6F 77 7F87 8
12、F 97 9F A7 AF B7 BF C7 CF F7 FF E7 EF F7 FFF1E1例如,当调用入口地址为0475H或0AC75H的一个子程序时,操作码都为91H。被调用的子程序入口地址必须与庙用指令ACALL后一条指令的第一个字节在相同的KB存贮器区之内。ACALL把MCS-51子程序存贮空间划分为32个区,每个区为2KB字节,调用指令ACALL的下一条指令第一个字节与子程序的入口地址必须在同一区内,否则将引起程序转移混乱。如果ACALL指令正好落在区底的两个单元内,如07FEH和07FFH单元或0AFFEH和0AFFFH单元,程序就转移到下一个区中去了。因为在执行调用操作之前PC
13、先加了2。指令的执行不影响标志。2. 绝对转移a10a9a810001格式:AJMP addr 11代码:a7a6a5a4a3a2a1a0操作:(PC)(PC)+2 (PC)指令中的a100说明:指令的操作码与转移目标地址所在页号有关,每一种操作码可分别对应32个页号,见表2-5。指令中的a100为区内地址。转移目标地址必须与AJMP下一休指令的第一个字节在同一个2KB存贮器区内。很明显这条指令与ACALL指令相类似,是为了与MCS-48中的JMP指令兼容而设计的,同样,当ALMP指令正好放在区底时,转移目标将移至下一区中。因为在执行转移操作之前PC先加了2。指令的执行不影响标志。3.长调用0
14、0010010格式:LCALL addr 16代码: 12HAddr158Addr70操作:(PC)(PC)+3(SP)(SP)+1(SP)(PC70)(SP)(SP)+1(SP)(PC158)(PC)指令中的addr150说明:这条调用指令允许子程序放在64KB空间的任何地方。指令的执行不影响标志。4. 长转移00000010格式:LJMP addr 16代码: 02HAddr158Addr70操作:(PC)指令中的addr150说明:这条指令允许转移的目标地址在64KB空间的任意单元。指令的执行不影响标志。5. 短转移10000000格式:SJMP rel代码: 80H相对地址操作:(PC)(PC)+2 (PC)(PC)+ 相对地址说明:指令中的相对 地址是一个带符号(2的补码)的偏移字节数,其范围为128+127。负数表示向后转移,正数表示向前转移。CPU根据偏移字节数计算出转移的目的地址。例如,在0100H单元有一条SJMP指令,若其相对地址为21H(正数)则将转移到0102H+21H0123H地址上。若相对地址为F0H(负数),则将转移到0102H+FFF0H00F2H地址上。在用汇编语言编写程序时,rel往往是