《第七单元复位中断与程序控制(共19页).doc》由会员分享,可在线阅读,更多相关《第七单元复位中断与程序控制(共19页).doc(19页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上第七单元 复位、中断与程序控制本单元学习要点1. 单片机为什么要复位?如何能可靠地复位?复位对单片机片内存储器的影响如何?2. 为何要有程序流向控制?怎样实现程序流向控制?有哪几种方法? 3. 程序为何要中断?中断过程如何?如何开放和响应中断?4. 改变程序流向的指令及其应用。5. 中断服务子程序与一般的子程序的异同点。如何编写中断服务子程序?如何编写一般的子程序?7.1 复位7.1.1 复位的意义单片机开始工作时,必须处于一种确定的状态,否则,不知哪里是第一条程序,如何开始运行程序?口线的电平和输入/输出状态的不确定,可能使外围设备的误动作,导致严重事故的发生;内部
2、一些控制寄存器(专用寄存器)的内容不确定,可能导致定时器溢出、程序尚未开始就要中断,串口胡乱向外外设数据。因此,任何单片机在开始工作前,都必须进行一次复位过程,使单片机处于一种确定的状态。单片机进入复位过程有三种途径:上电(开机)复位、手动复位和监控电路(看门狗或电源监控等)复位。顾名思义,上电复位就是开机给单片机系统加电时单片机进行复位操作。手动复位是人为地强行使单片机进行复位操作。而为了提高系统的可靠性,在单片机应用系统中专门设计了一些电路用以监控系统的电源(如电源电压过低可能导致单片机执行错误的指令与程序)和单片机的状态,如果出现异常,这些电路将强制单片机复位。7.1.2 复位电路HMO
3、S型8051的复位结构见图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(
6、0XXX0000)复位时还把ALE和(它们是准双向口结构的)配置为输入状态,即ALE和。内部RAM不受复位的影响。VCC通电时,RAM内容是不定的,除非RAM是由低功耗操作方式下返回的。7.2 程序控制单片机的工作原则绝对地是“一心一意”,只能按照程序的流向一步步地执行下去。为了使单片机具有“智能”,也就是使单片机根据所检测到的外接状况、或人们给它的命令,以及某种运算、判断的结果来改变程序的流向。可以说,单片机能处理上述情况的种类越多和作出的改变越复杂,说明单片机的“智能”越高。控制程序流向的方式有两大类:硬件和软件。硬件的方式有复位和中断等,对于89C52来说,硬件使程序流向固定的入口地址。
7、如复位的入口地址是0000H,各个中断都有各自固定的入口地址。软件的方式是调用(CALL)指令、跳转(JMP)指令、判断跳转(条件转移,J、CJ和DJ)、布尔量判断跳转(条件转移,J)和子程序返回(RET、RETI)指令。程序的流向不是固定的:子程序返回(RET、RETI)由堆栈中保存的返回地址来确定,而其它则由指令中的操作数来指定。 软件的方式又可以分为两类:转移类和调用子程序类。转移类又分为条件转移和无条件转移两类。表7-2列出程序流向控制的分类。表7-2 程序流向控制的分类硬 件软件(指令)调用子程序转 移条 件无条件复位,中断LCALL,ACALLRET,RETIJB,JNB,CJNE
8、,DJNZ,JZ,JNZ,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)
9、(SP)+1(SP)(PC70)(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
10、 49 51 59 61 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
11、 5C 64 6C 74 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
12、 6F 77 7F87 8F 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单元,程序就转移到下一个区中去了。
13、因为在执行调用操作之前PC先加了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。指令的执
14、行不影响标志。3.长调用00010010格式: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代码:
15、80H相对地址操作:(PC)(PC)+2 (PC)(PC)+ 相对地址说明:指令中的相对 地址是一个带符号(2的补码)的偏移字节数,其范围为128+127。负数表示向后转移,正数表示向前转移。CPU根据偏移字节数计算出转移的目的地址。例如,在0100H单元有一条SJMP指令,若其相对地址为21H(正数)则将转移到0102H+21H0123H地址上。若相对地址为F0H(负数),则将转移到0102H+FFF0H00F2H地址上。在用汇编语言编写程序时,rel往往是一个标号,由汇编程序在汇编过程中自动计算偏移字节数,并填入指令代码中。不手工汇编时,则根据该标号的地址按上述方法进行计算。以后的指令中有
16、关rdl不再重复说明。当偏移字节数为FEH时,SJMP指令将实现原地转圈的运行状态。如例16所示在60H地址处有SJMP指令,标号HERE相当于60H。根据偏移字节数计算得转移目的地址为0062H+FFFEH0060H。故代码为80H、0FEH的短相对转移指令执行原地转圈操作。6. 间接长转移01110011格式:JMP A+DPTR代码: 73H操作:(PC)(A)+(DPTR)说明:转移地址由数据指针DPTR和累加器A的内容相加形成。16位的模216加法运算既不修改A也不修改DPTR,而是把加的结果直接送PC寄存器。指令的执行不影响标志。实验7-1 根据累加器的数值设计散转表程序程序清单如
17、下: MOV DPTR, #TABLE; 散转表入口地址送DPTR JMP A+DPTR; 散转到A中数据所确定的程序TABLE: AJMP RORT0; 散转到RORT0 AJMP RORT1; 散转到RORT1 AJMP RORT2; 散转到RORT2 当A为0时,散转到ROUT0,A为2时散转到ROUT1由于AJMP是双字节指令,所以A中必须是偶数。7. 子程序返回00100010格式:RET代码: 22H操作:(PC158)(SP)(SP)(SP)1(PC70)(SP)(SP)(SP)1说明:子程序返回指令把栈顶的内容送到PC寄存器中。不影响标志。通常用在由ACALL或LCALL调用的
18、子程序末尾。8. 中断返回格式:RETI00110010代码: 32H操作:(PC158)(SP)(SP)(SP)1(PC70)(SP)(SP)(SP)1说明:中断返回指令把栈顶的内容送到PC寄存器中,同时释放中断逻辑使之能接受同级的另一个中断请求。PSW并不自动地恢复到中断前的状态。如果在执行RETI指令的时候,有一个较低级的或同级的中断已挂起,则CPU在至少执行了中断返回后的一条指令之后才去响应被挂起的中断。9. 累加器为零转移01100000格式:JZ rel代码: 60H相对地址说明:若(A)0,则(PC)(PC)+2; 若(A)0,则(PC)(PC)+2+相对地址。不影响标志。10.
19、 累加器为非零转移01110000格式:JNZ rel代码: 70H相对地址说明:若(A)0,则(PC)(PC)+2; 若(A)0,则(PC)(PC)+2+相对地址。11. 累加器内容与立即数不等转移10110100格式:CJNE A,data,rel代码: 12H立即数相对地址操作:若data(A),则(PC)(PC)+3,(C)0若data(A),则(PC)(PC)+3+相对地址,(C)0若data(A),则(PC)(PC)+3+相对地址,(C)1说明:这是3字节3操作数指令。指令首生对前2个无符号操作数进行比较,根据比较的结果设置进位标志C,并确定是否按第3个操作数转移。MCS-54虽没
20、有单独的比较指令,但设计了多条比较转移指令,既有比较功能,又能根据比较结果使程序转移,是很有用的一类指令。12. 累加器内容与内部RAM或专用寄存器内容不等转移10110101格式:CJNE A,direct,rel代码: B5H直接地址相对地址操作:若(direct)(A),则(PC)(PC)+3,(C)0若(direct)(A),则(PC)(PC)+3+rel,(C)0若(direct)(A),则(PC)(PC)+3+ rel,(C)113. 寄存器内容与立即数不等转移1011011i格式:CJNE Ri,#rel代码: B6HB7H立即数相对地址操作:若data(Ri),则(PC)(PC
21、)+3,(C)0若data(Ri),则(PC)(PC)+3+rel,(C)0若data(Ri),则(PC)(PC)+3+ rel,(C)115. 寄存器内容减1不为零转移10111rrr格式:DJNE Rn,rel代码: D8HDFH相对地址操作:(Rn)(Rn)1若Rn0,则(PC)(PC)+2若Rn0,则(PC)(PC)+2+rel,16. 内容RAM或专用寄存器内容减1不为零转移11010101格式:CJNZ direct,rel代码: D5H直接地址相对地址操作:若(direct)(direct)1若(direct)0,则(PC)(PC)+2若(direct)0,则(PC)(PC)+2
22、+ rel。说明:当direct为端口地址P0P3时,这是一条“读修改写”指令。17. 空操作00000000格式:NOP代码: 00H操作:(PC)(PC)+1说明:空操作是对CPU的控制指令,并没有使程序转移的功能,但仅此一条指令,故不单分类,在此节中一并介绍。18. 进位标志值转移01000000格式:JC rel代码: 40H相对地址操作:若(C)1,则(PC)(PC)+2+rel 若(C)0,则(PC)(PC)+2实验7-2 内部RAM单元中的两个数据比较比较内部RAM NUMB-1,NUMB-2中的两个无符号数的大小,大数存入单元M,小数存入单元N,若两数相等使内部RAM的位127
23、置1。程序以子程序方式给出。COMP: MOV A, NUMB-1 CJNE A, NUMB-2, BIC SETB 127 ; 两数相等 RETBIG: JC LESS ; 若C置位则NUMB-1小 MOV M, A MOV N, NUMB-2 RETLESS: MOV N, A MOV M, NUMB-2 RET19. 进位标志为零转移01010000格式:JNC rel代码: 50H相对地址操作:若(C)0,则(PC)(PC)+2+rel 若(C)1,则(PC)(PC)+220. 直接寻址位置位转移00100000格式:JB bit,rel代码: 20H位地址相对地址操作:若(bit)1
24、,则(PC)(PC)+3+rel 若(bit)0,则(PC)(PC)+3说明:被测试的直接寻址位在执行了该指令后,内容不改变。21. 直接寻址位为零转移00110000格式:JNB bit,rel代码: 30H位地址相对地址操作:若(bit)0,则(PC)(PC)+3+rel 若(bit)1,则(PC)(PC)+322. 直接寻址位置位转移并将该位复位00010000格式:JBC bit,rel代码: 10H位地址相对地址操作:若(bit)0,则(PC)(PC)+3 若(bit)1,则(PC)(PC)+3+rel,(bit)0说明:若直接寻址位为输出端口对片内定时器计数器的溢出标志TF0TF2
25、进行检测以控制程序流向时,采用JBCTFX,rel比采用JBCTFX更为合适。因为JBC指令不仅能完成对TF0TF2状态的检测,同时当满足转移条件(即TFX1)时,能自动将其复位,而用JB指令,就要另用1条CLR TFX指令来复位,文中X02。7.4 中断请设想下面三个场景:场景之一:第二天凌晨要去赶火车,但你没有闹钟,只有一个挂钟,估摸到了半夜你已经醒来,但你担心误车,只能不时地看挂钟,这一夜你肯定没能睡好,到点后疲惫不堪地起床,背起行囊去赶火车。场景之二:第二天凌晨要去赶火车,你有精确、可靠的闹钟,你只需设定好闹钟,放心、安稳地睡觉,第二天凌晨,温柔的钟声唤醒了你,你精神饱满地起床,背起行
26、囊去赶火车。场景之三:当你在读书时,可能电话铃声响了,你 “中断”正在读的书,将正在读的这一页书折一个角,拿起电话与你的亲友通话,通完话后,又津津有味地从已折好角的那书接着读下去。在场景之一,由于你只能“一心一意”、“一心一用”,结果,要看钟就不能睡觉,要睡觉就不能看钟,时间利用效果很差,你(作为CPU)只能不断地去看(查询)钟,在场景之二,你也只能“一心一意”、“一心一用”,但有闹钟帮助你“看”时间,到时候闹钟自动地“中断”你的正常工作睡觉,结果你休息好了,也不会误车。在场景之三,你仍然是“一心一意”、“一心一用”,但电话铃声“中断”你的正常工作(主程序)读书,你折好这页书角(保护现场),去
27、接电话(响应中断,执行中断子程序),接完电话,“返回”正常工作读书(主程序),接着“中断”的地方继续读书。这三个场景与单片机的工作十分类似,第一个场景相当于单片机采用查询方式,第二个场景采用了中断方式,第三个场景不仅采用了中断,还有中断现场保护。显然,第二个场景效率比第一个高,而第三个场景效率最高,工作有条理。与上述举例一样,现在几乎所有的单片机都具备中断系统和功能,而且中断功能的强弱、中断源的多少,也是单片机性能强弱的重要指标。89C52有个中断源,可分为2个优先级,其中每一个中断源的优先级都可以由程序排定。7.4.1中断源89C52提供6个中断源如图7-3所示。图7-3 89C52的6个中
28、断源外部中断INT0和INT1可根据寄存器TCON中的IT0和IT1位状态分别设置为电平或者边沿触发。实际产生的中断标志是TCON中的位IE0和IE1,当产生外部中断时,如果是边沿触发,进入中断服务程序后由硬件清除中断标志位;如果中断是电平触发,由外部请求源(而不是由片内硬件)控制请求标志。定时器0和定时器1中断由TF0和TF1(分别由各自的定时/计数寄存器控制,定时器0工作在模式3时除外)产生。当产生定时器中断进入中断服务程序后,由片内硬件清除标志位。串口中断由RI和TI的逻辑或产生。进入中断服务程序后,这些标志均不能被硬件清除。实际上,中断服务程序通常需要确定是由RI还是TI产生的中断,然
29、后由软件清除中断标志,所以这些产生中断的位都可通过软件置位或清零,与通过硬件置位或清零的效果相同,简而言之中断可由软件产生推迟或取消。7.4.2 中断控制寄存器1中断使能寄存器IE每个中断源可通过置位或清零中断控制寄存器IE(图7-4)中的相应位分别使能或禁止IE中还包含一个全局禁止位EA可以立即禁止所有的中断。EA(IE.7) 全局中断禁止位。如果EA0,所有的中断都被禁止;EA1,所有的中断都可通过设置/清零各自的使能位单独使能或禁止。(IE.6) 无效位。保留将来之用。ET2(IE.5) 定时器2中断使能位。如果ET20,禁止定时器2中断;ET21,允许定时器2中断。ES(IE.4) 串
30、口中断使能位。如果ES0,禁止串口中断;ES1,允许串口中断。ET1(IE.3) 定时器1中断使能位。如果ET10,禁止定时器1中断;ET11,允许定时器1中断。EX1(IE.2) 外部中断1使能位。如果EX10,禁止外部中断1中断;EX11,允许外部中断1中断。ET0(IE.1) 定时器0中断使能位。如果ET00,禁止定时器0中断;ET01,允许定时器0中断。EX0(IE.0) 外部中断0使能位。如果EX00,禁止外部中断0中断;EX01,允许外部中断0中断。IE寄存器中包含了一个无效位,由于这位可能用于其它80C51系列产品中,用户软件不应将这些位写入1。(MSB) (LSB)EAET2E
31、SET1EX1ET0EX0图7-4 中断控制寄存器IE2中断优先级寄存器IP每个中断源可通过置位或清零中断优先级寄存器IP(图7-5)中的相应位设置中断优先级。(IP.7) 无效位。保留将来之用。(IP.6) 无效位。保留将来之用。PT2(IP.5) 定时器2中断优先级位。如果PT20,设置定时器2中断为低优先级;PT21,设置定时器2中断为高优先级。PS(IP.4) 串口中断使能位。如果PS0,设置串口中断为低优先级;ES1,设置串口中断为高优先级。PT1(IP.3) 定时器1中断优先级位。如果PT10,设置定时器1中断为低优先级;PT11,设置定时器1中断为高优先级。PX1(IP.2) 外
32、部中断1优先级位。如果PX10,设置外部中断1为低优先级;PX11,设置外部中断1为高优先级。PT0(IP.1) 定时器0中断优先级位。如果PT00,设置定时器0中断为低优先级;PT01,设置定时器0中断为高优先级。PX0(IP.0) 外部中断0优先级位。如果PX00,设置外部中断0为低优先级;PX01,设置外部中断0为高优先级。IP寄存器中包含了一些无效位,由于这些位可能用于其它80C51系列产品中,用户软件不应将这些位写入1。(MSB) (LSB)PT2PSPT1PX1PT0PX0图7-5 中断优先级寄存器IP3中断优先级寄存器IPH有的89C52品种的单片机具有4个优先级,每个中断源可通
33、过置位或清零中断优先级寄存器IP和中断优先级高位寄存器IPH(图7-6)中的相应位设置4级中断优先级之一(见表7-3)。(IPH.7) 无效位。保留将来之用。(IPH.6) 无效位。保留将来之用。PT2H(IPH.5) 定时器2中断优先级位。如果PT2H0,设置定时器2中断为低优先级;PT2H1,设置定时器2中断为高优先级。PSH(IPH.4) 串口中断使能位。如果PSH0,设置串口中断为低优先级;ESH1,设置串口中断为高优先级。PT1H(IPH.3) 定时器1中断优先级位。如果PT1H0,设置定时器1中断为低优先级;PT1H1,设置定时器1中断为高优先级。PX1H(IPH.2) 外部中断1
34、优先级位。如果PX1H0,设置外部中断1为低优先级;PX1H1,设置外部中断1为高优先级。PT0H(IPH.1) 定时器0中断优先级位。如果PT0H0,设置定时器0中断为低优先级;PT0H1,设置定时器0中断为高优先级。PX0H(IPH.0) 外部中断0优先级位。如果PX0H0,设置外部中断0为低优先级;PX0H1,设置外部中断0为高优先级。IPH寄存器中包含了一些无效位,由于这些位可能用于其它80C51系列产品中,用户软件不应将这些位写入1。(MSB) (LSB)PT2HPSHPT1HPX1HPT0HPX0H图7-6 中断优先级高位寄存器IPH表7-3 中断的优先级优先级位中断优先级IPH.
35、xIP.x000(最低优先级)011102113(最高优先级)7.4.3 中断优先级结构每个中断源都可通过编程中断优先级寄存器IP(图7-5)单独设置优先级。一个中断服务程序可响应更高级的中断,但不能响应同优先级或低级中断。最高级中断服务程序不响应其它任何中断。如果两个不同中断优先级的中断源同时申请中断时,响应较高优先级的中断申请。如果2个同优先级的中断源同时申请中断,内部查询顺序将确定首先响应哪一个中断。请求查询顺序如表7-4所示。表7-4 中断源同级优先级序号中 断 源同级优先级1IE0(外部中断0)最高2TF0(定时器0)3IE1(外部中断1)4TF1(定时器1)5RI+TI(UART)
36、6TF2,EXF2(定时器2 )最低注:同级优先级只用来处理相同优先级别中断源同时申请中断的情况。实验7-3:电子钟下面是一个显示时、分、秒的电子钟程序。 ORG 8000H; 实验板开始执行的第一条指令所处的地址LJMP MAIN; 跳转到主程序ORG 800BH; 定时器0中断入口地址LJMP TINT0; 跳转到定时器0中断服务子程序 ORG 8200H; 主程序开始的地址;避开中断入口地址MAIN:MOV SP, #0D0H ; 设置堆栈起始地址 LCALL INT8255; 初始化CPU,注意用不同的子程序完成一定的功能,这是模块化 ; 编程技术之一,方便程序的开发、管理和维护MOV
37、 R3, #00H ; 时计数存储单元MOV 3FH, #50; 装入中断次数 MOV 40H, #00H ; 秒低位存储单元 MOV 41H, #00H ; 秒高位存储单元 MOV 42H, #0FFH ; 分、秒间显示符号MOV 43H, #00H ; 分低位 MOV 44H, #00H ; 分高低位 MOV 45H, #0FFH ; 时、分间显示符号-MOV 46H, #00H ; 时低位 MOV 47H, #00H ; 时高位 SETB ET0 ; T0开中断SETB EA ; CPU开中断 ORL TMOD, #01H; 设置定时器0工作在模式1 MOV TH0, #0B8H; 设定
38、定时器初值,定时时间为20ms。赋TH0初值为0B8H MOV TL0, #00H; 赋TL0初值为00H SETB TR0 ; 启动T0L1: LCALL LED ; 调LED子程序LJMP L1 INT8255:MOV P2, #58H ; 使89C52P2指向8255PA的控制寄存器接口结构,89C52P0口地址应与低8位无关MOV A, #82H ; 8255A的控制字(82H),8255PC口输出PB口输入,PA口输出 MOVX R0, A; 送8255A控制字 RET TINT0: MOV TH0, #0B8H; 重赋定时器初值 MOV TL0, #00H PUSH PSW ; 保
39、护现场 PUSH ACC DJNZ 3FH, RETURN ; 1S未到返回MOV 3FH, #50 ; 重置中断次数INC 40H ; 秒低位加1MOV A, 40H CJNE A, #0AH, RETURN; 未满10S返回MOV 40H, #00H ; 计满10S,秒低位清0INC 41H ; 秒高位加1MOV A, 41H CJNE A, #06H, RETURN ; 未满60S返回 MOV 41H, #00H ; 计满60S,秒高位清0 INC 43H ; 分低位加1 MOV A, 43H CJNE A, #0AH, RETURN; 未满10分返回MOV 43H, #00H ; 计满
40、10分,分低位清0INC 44H ; 分高位加1MOV A, 44H CJNE A, #06H, RETURN; 未满60分返回 MOV 44H, #00H ; 计满60分,分高位清0INC 46HINC R3CJNE R3, #24, H1 ; 未满24小时跳转MOV 47H, #00H MOV 46H, #00H LJMP RETURN ; 满24小时,时高低位均清0H1:MOV A, 46H CJNE A, #0AH, RETURN ; 未满10小时返回MOV 46H, #00H ; 计满10小时,时低位清0 INC 47H ; 时高位加1RETURN: POP ACC ; 恢复现场 POP PSW