版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第四章MCS-51单片机的内部资源及其编程单片机技术与应用4-2、外部中断8051外部中断中断中断源中断优先级中断嵌套8051外部中断中断:当CPU正处理某项事务时,若外界或内部发生紧急事件,要求CPU暂停正在处理的工作转而去处理这个紧急事件,待处理完以后再回到原来被中断的地方,继续执行原来被中断了的程序,这样的过程称为中断。(堆栈)中断源:向CPU提出中断请求的源称为中断源外部跳变信号(下降延)外部低电平等(0)8051外部中断中断优先级:当几个中断源同时请求中断时,CPU应优先响应最需紧急处理的中断请求。为此,需要规定各个中断源的优先级。在优先级高的中断请求处理完了以后。再响应优先级低的中断请求。中断嵌套:当CPU正在处理一个优先级低的中断请求的时,如果发生另一个优先级比它高的中断请求,CPU能暂停当前处理的中断,转去处理优先级高的中断请求,待处理完以后,再回到原来正在处理的低级中断程序,这种高级中断源能中断低级中断源的中断处理称为中断嵌套。8051中断8051单片机有5个中断源2个中断优先级(2级中断嵌套),优先级可通过编程实现IE(中断允许寄存器):中断源的中断请求是否能得到响应,受IE的控制;IP(中断优先级寄存器):各个中断源的优先级可由IP的各位来确定;同一优先级中的各中断源同时请求中断时,由内部的查询逻辑来确定响应的次序。8051中断源8051五个中断源INT0中断(P3.2)T0中断(P3.4)INT1中断(P3.3)T1中断(P3.5)串行中断(P3.0、P3.1)8051中断入口(ROM)地址和优先级中断源中断号(n)中断入口地址(8n+3)中断优先级INT0中断00003H高低T0中断1000BHINT1中断20013HT1中断3001BH串行口中断40023HT2中断5002BH例1如图按下按钮,对输出灯取反查询方式中断方式8051INT0中断机理当INT0引脚输入如下信号:下降沿(IT0=1)或低电平(IT0=0)CPU自动(硬件)产生中断标志(IE0=1)此时若INT0中断允许(使能EX0=1,EA=1),则CPU立即停止当前程序,跳转到INT0对应的中断入口(ROM保留地址0x0003)执行中断服务程序(中断服务程序后CPU自动对中断标志清零:IE0=0),待INT0中断服务程序执行完毕后再回原执行程序处;若INT0中断未允许,则程序不能跳转到INT0中断入口,不执行中断服务程序(中断标志IE0不能自动清0)。问提:中断标志IE0的产生与中断使能是否有关?中断服务程序常见问题中断服务程序代码过长,占了过多的进程;定义全局标志变量:中断里设置标志,主程序根据标志执行程序,完成后清除该标志中断端口不够用(8051只有2个中断INT0、INT1);更换MPU会扩展INT0中断方式执行流程#include"reg51.h"unsignedchari=0;/**********int0中断服务程序**********/voidINT0_ISR(void)interrupt0{ delay(200); if((P3_2==0)
P1=++i; }/**********主函数*******************/voidmain(void){IT0=1;//下降延中断
EX0=1;//int0中断使能
EA=1;//总中断使能
while(1){;}//等待中断}主程序中断响应初始化中断等待中断中断服务程序返回中断自动清中断标志……INT0查询方式voidmain(void){IT0=1;//EX0=1;EA=1;while(1){//查询方式1:if(IE0==1){IE0=0;//手动清中断标志
//P1=++I;……}_------P2=LED_seg[buf[i]]P0=LED_bit[i]I++;If(I==6) I=0delay(500);}}voidmain(void){while(1){//查询方式2:while(IE0==0){ ;//等待INT0外部中断}IE0=0;//手动清中断标志//……}}8051中断系统与中断有关的SFR注:*表示可以位寻址SFRD7D6D5D4D3D2D1D0地址*IP--PT2PSPT1PX1PT0PX0B8H*IEEA-ET2ESET1EX1ET0EX0A8HTMODGATEC/T#M1M0GATEC/T#M1M089H*TCONTF1TR1TF0TR0IE1IT1IE0IT088HSCONSM0SM1SM2RENTB8RB8TIRI98HPCONSMOD-------87HTCON:定时/计数器控制寄存器TF1、TF0:T1、T0溢出标志TR1、TR0:T1、T0启动控制位(TR=1:启动定时器)IE1、IE0:INT1、INT0中断标志IT1、IT0:INT1、INT0触发方式控制位(IT=1:下降沿触发,IT=0:低电平触发)TF1、TF0、IE1、IE0都具有自动清零功能。D7D6D5D4D3D2D1D0TF1TR1TF0TR0IE1IT1IE0IT0SCON:串行口控制寄存器SM0SM1串行模式选择SM2多机通讯允许位:方式0时,此位应该为0;模式1时,当接收到停止位时,该位将置位;方式2或方式3时,当接收的第9位数据为1时,将置位REN串行接收允许位TB8在模式2和模式3中,将被发送数据的第9位RB8:在方式0中,该位不起作用;在方式1中该位为接收数据的停止位;在方式2和方式3中为接收数据的第9位TI串行发送结束标志,由软件清零RI串行接收结束标志,由软件清零D7D6D5D4D3D2D1D0SM0SM1SM2RENTB8RB8TIRIIE:中断允许寄存器EA:使能标志位。1:所有中断使能;0:禁止所有中断ET2:T2中断使能ES:串行通信中断使能ET1:T1中断使能EX1:INT1中断使能ET0:T0中断使能EX0:INT0中断使能D7D6D5D4D3D2D1D0EA-ET2ESET1EX1ET0EX0IP:中断优先级寄存器-保留-保留PT2:T2中断优先级PS:串行通信中断优先级PT1:T1中断优先级PX1:INT1优先级PT0:T0中断优先级PX0:INT0优先级D7D6D5D4D3D2D1D0--PT2PSPT1PX1PT0PX0与中断有关的各位PX0、PT0、PX1、PT1、PSEX0、ET0、EX1、ET1、ES、EAIT0、IT1TR0、TR1IE0、IE1、TF0、TF1、TI、RI以上各位可位寻址,且均为高电平有效8051外部中断编程示例#include"reg51.h"//C51中断程序框架/**********int0中断服务程序**********/voidINT0_ISR(void)interrupt0using0{//中断服务程序
//……}/**********主函数*******************/voidmain(void){IT0=1;EX0=1;EA=1;//打开中断源
while(1);//等待中断}中断服务函数与寄存器的定义为了满足在C语言源程序中直接编写中断服务程序的要求,C51编译器对函数的定义进行了扩展,增加了一个扩展关键字interrupt。它是函数定义时的一个选项,加上这个选项即可将一个函数定义成中断服务函数。定义格式为:
函数类型函数名(形式参数表)[interruptn][usingn]中断服务函数与寄存器的定义函数类型函数名(形式参数表)[interruptn][usingn]关键字interrupt后面的n是中断号,n的范围为0-31。编译器从8n+3处产生中断向向量,具体的中断号n和中断向量取决于8051单片机芯片型号,常用中断源和中断向量如表所示。中断号n中断源中断向量8n+30INT00003H1T0000BH2INT10013H3T1001BH4串行口0023H中断服务函数与寄存器的定义工作寄存器:8051片内RAM中有4个工作寄存器组,每个寄存器组中含8个工作寄存器(R0~R7)。C51编译器扩展了一个关键字using,专门用来选择8051单片机的工作寄存器组。在定义一个函数时,using后面的n是一个0-3的常数,分别表示4个功能完全一样的工作寄存器组。在定义一个函数时,using是一个选项,若缺省编译器自动分配一个寄存器组作绝对寄存器组访问。需要注意的是,关键字using和interrupt的后面都不允许跟带运算符的表达式。中断服务函数与寄存器的定义voidINT0_ISR(void)interrupt0{}voidTIMER0_ISR(void)interrupt1{}voidINT1_ISR(void)interrupt2{}voidTIMER1_ISR(void)interrupt3{}voidUART_ISR(void)interrupt4{}
中断服务函数与寄存器的定义_KeilC51命令DEFINEBUTTON(定义按钮)命令定义:DEFINEBUTTON“按钮名”,“命令”在Debug-FunctionEditor(OpenIniFile)中定义外中断按钮:
definebutton"INT0(P3.2)","PORT3=PORT3^0x04"definebutton"T0(P3.4)","PORT3=PORT3^0x10"definebutton"INT1(P3.3)","PORT3=PORT3^0x08"definebutton"T1(P3.5)","PORT3=PORT3^0x20"
每按钮一次对P3.2取反删除:KILLBUTTONn>definebutton“clr
drtr”,”dptr=0”>killbutton1中断服务函数与寄存器的定义_KeilC51命令EVAL>EVAL-(1/256)0x00>EVAL-(256/256)0xFF>PORT30xFF>ex0_isr_counter询问变量的值中断如何扩充1定时器中断作为外部中断使用
把8051的T1、T0用作对外部脉冲计数方式。每当P3.4(T0)或P3.3(T1)引脚上发生负跳变时,T1和T0的计数器加1。利用这个特性,可以把P3.4和P3.3引脚作为外部中断请求输入线,而定时器的溢出中断作为外部中断请求标志。
T0(P3.4)+Vcc中断如何扩充1定时器中断作为外部中断使用(软件)
定时器T1对外部计数/*TH1、TL1采用16进制赋值*/voidint0(void)interrupt3{
/*中断服务程序*/
}voidmain(void){TMOD=(TMOD&0x0f)|0x60;ET1=1;EA=1;TR1=1;TH1=0xFF;/*TH1=-1/256-1;*/TL1=0xFF;/*TL1=-1%256;*/while(1);}T1(P3.2)中断如何扩充2中断和查询结合的方式中断如何扩充2#include<reg51.h>sbitLED_A=P1^0;sbitLED_B=P1^1;sbitLED_C=P1^2;sbitIA=P1^3;sbitIB=P1^4;sbitIC=P1^5;中断如何扩充2voidmain(void){IT0=1; IT1=1; EX0=1; EX1=1; EA=1; LED_A=0;LED_B=0;LED_C=0; IA=1;IB=1;IC=1; while(1);}中断如何扩充2voidint0(void)interrupt0{LED_A=0;LED_B=0;LED_C=0; IE1=0; EX1=1;}voidint1(void)interrupt2{ EX1=0; if(IA==0)LED_A=1; elseif(IB==0)LED_B=1; elseif(IC==0)LED_C=1; }中断如何扩
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 车辆合伙购买合同书
- 进口材料采购协议书模板
- 涉外商务合同指南
- 烟酒批发购销协议
- 草坪代理合同
- 房屋买卖合同版合同示范文本
- 碎石桩分包工程合同范例
- 医疗器械安装合同补充协议
- 网站制作合同版示例
- 酒品购销合同
- 国开MySQL数据库应用期末复习题
- 超市管理系统-UML
- 马克思主义思想政治理论课实践教学调研报告总结汇报
- 抗肿瘤药物处方审核要点
- 放射科仪器设备维护保养记录表DR
- 《运筹学》试卷及答案002
- 【2023年部编高教版】中职历史 基础模块 中国历史 第十二课 明朝的兴亡课件
- 传热学(山东建筑大学)智慧树知到课后章节答案2023年下山东建筑大学
- 渗透测试基础教程介绍课件
- 教师如何“说课”专题讲座PPT
- 家政服务基本安全知识
评论
0/150
提交评论