外部中断和定时器中断

1.什么是中断

2.中断有什么用

3.双重功能的P3引脚

4.8051的 中断体系

5.中断特殊寄存器

6.中断的优先级

7.中断服务程序的编写

8.外部中断实现代码

9.定时器/计数器中断工作原理

10.定时器/计数器定时值的计算

11.定时器/计数器实现代码

1.什么是中断

中断就是指CPU正在执行一项任务A,然后突然停止任务A去执行任务B,执行完任务B再回来继续执行任务A的过程。

例如:你正在看电视,然后电话响了,你就停止看电视,跑去接电话,接完电话后由回来继续看电视。这个过程叫中断。


中断跟硬件有关。可以说是硬件来让单片机中断。

2.中断有什么用 

1.中断能让CPU同时执行多项任务,例如CPU在执行流水灯程序,就无法执行 按下按键时,蜂鸣器发声了。

2.当然上面的例子可以用软件轮询检擦案件是否按下来实现,但这样就消耗了CPU一部分资源来轮询检测 按键是否有按下了,所以中断的另一个优点就是

   节省CPU资源

3.双重功能的P3引脚

由最小系统板的原理图可知,P3.0~P3.7的引脚对应着RXD,TXD,INTO,INT1,T0,T1等,说明P3引脚既是 I/O口,由有别的功能,这个功能就是中断功能。

4.8051中断体系

8051的单片机有5个中断源,2个优先级

由上图可知,INT0是通过引脚P3.2,INI1时通过引脚P3.3,定时器T0和T1是分别通过引脚P3.4和P3.5的


中断源:INT0(外部中断0),INT1(外部中断1),T0(定时器0),T1(定时器1),RXD和TXD(同属串口中断)

中断相关的特殊寄存器:

(1)中断允许控制寄存器(IE)--------控制各中断的开放和屏蔽

(2)定时器/计数器控制寄存器(TCON)-------定时器和外部中断的控制

(3)串行口控制寄存器(SCON)-------串行中断的控制

(4)中断优先级控制寄存器(IP)-------设置各中断的优先级


各寄存器的控制范围如下图:

从上图可看出从中断源产生请求到请求进入CPU的过程:

以INT0为例,INT0产生中断源,经过TCON寄存器中的IT0为选择是下边沿触发的还是低电平触发的中断请求(当然IT0是程序人工设置的),当中断请求到达IE0的时候,

IE0会被硬件置1(当CPU响应此中断请求时,IE0被硬件置0),然后就到 IE寄存器的地方了,EX0是外部中断INT0的开关,而 EA 是所有中断的总开关,这都由 IE寄存器

控制,最后经过 IP寄存器 设置优先级,这个一般比较少用,默认的优先级为,INT0 > T0 > INT1 > T1 >串口中断。最后把中断请求传给CPU。

5.中断特寄存器

TCON寄存器

IE寄存器

EA:中断的总开关,EA=1才能允许中断传给CPU

ES:串行口中断开关

ET1:定时器1中断开关

EX1:外部中断1开关

ET0:定时器0中断开关

EX0:外部中断0开关

IP优先级寄存器(对应为设置成1说明优先级设置成高,8051只有高低两种优先级)

6.中断的优先级

8051只有高低两种优先级,默认下优先级从高到低:INT0 > T0 > INT1 > T1 > 串行中断。

1.高优先级的中断可以打断低优先级的中断。

2.正在响应的中断,不能被同级或者低级的中断打断。

3.同时发生几个中断,先响应优先级高的中断

7.中断服务程序的编写

中断服务程序就是中断发生后,CPU去执行的函数。

1.中断服务函数没有返回值

2.中断服务函数不能传入参数


例如:

void  函数名 (void)  interrupt  x  using  y

{

}

x 范围为0~4,分别代表5个中断源,例如外部中断INT0就是0,T0就是1,INT1就是2,T1就是3,串行中断就是4

y 的范围为0~3,分别表示4组工作寄存器,不写就用0. 不写也可以

8.外部中断实现代码

##includeinclude<reg52.h><reg52.h>
sbit LED=P1^sbit LED=P 0;
void main()
{
    IT0=0;  //中断触发方式为低电平触发,IT0=1则为下边沿触发
    EX0=1;  //打开外部中断0
    EA=1;    //打开中断总开关
    while(1)
    {
        LED=1;   //在没有中断发生时,LED关闭
    }
}
 
void INTERR(void) interrupt 0
{
    LED=0;//有中断发生时,LED亮起
}

把开发板的P3.2用杜邦线接到GND上,就会触发中断,发现LED亮起来了。(为什么是P3.2?因为由最上面的原理图可知道INT0的引脚是P3.2)

9.定时器/计数器中断工作原理

1.由最上面的最小系统原理图可以看出,定时器T0和T1分别对应的引脚是P3.4和P3.5

2.定时器/计数器 的计数脉冲来源可以有两个,一个是芯片内部晶振振荡器输出脉冲12分频后的脉冲,一个是从外部接入的外部脉冲


3.TLx和THx寄存器,x=0,1。

以TL0和TH0为例,TL0和TH0 都是8位寄存器(8051的寄存器都是8位),所以TL0和TH0形成高八位和低八位寄存器,用于计数,一共16位。

2^16=65536,所以 TL0和TH0加一起最大能计数的值是0~65536,一共65536.


4.定时器/计数器的两个寄存器:TCON和TMOD,其中TCON用于开启定时器/计数器中断,TMOD用于设置定时器/计数器的工作方式(TCON上面 已经说过了)

TMOD寄存器:

(由图:低八位为定时器T0,高八位为定时器T1)

GATE:门控制。

当GATE=1:INTx引脚为高电平且TRx 要同时为1,定时器Tx才启动。

当GATE=0:只要TRx =1,定时器Tx就启动,不用理会INTx引脚的电平高低。


C/T:决定是使用 定时功能,还是 计数功能

当C/T=0:定时功能。加1计数器对芯片晶振12分频的脉冲计数,一个脉冲过来,就加一,直到 TFx 加满了溢出。(TFx在TCON寄存器中)
当C/T=1:计数功能。加1计数器对来自输入引脚T0(P3.4)或T1(P3.5)的外部脉冲进行计数,一个脉冲加一,直到TFx加满溢出。

M1和M0:工作方式选择位


M0    M1    工作方式    功能说明
0    0    方式0    13位定时器/计数器,最大计数为2^13 = 8192
0    1    方式1    16位定时器/计数器,最大计数为2^16 = 65536
1    0    方式2    自动重载8位定时器/计数器,最大计数为 2^8 = 256
1    1    方式3    T0分为2个独立的8位独立计数器,T1停止工作

10.定时器/计数器定时数值的计算

例:我要定时10ms。晶振频率是12M,工作模式在方式1

f = 12M/12 =1M   (因为要12分频),也就是说 1秒 1000000个机器周期,10ms有10000个机器周期。

65536 - 10000 = 55536 ,意思是 计数器从65536 一直减到 55536 所用的时间就是10ms。

55536的十六进制是0xD8F0

所以设置 TH0 = 0XD8,TL0=0XF0

下面给出代码

或者直接下载一个C51定时器计算器:

11.定时器/计数器代码

#include<reg52.h>
sbit LED0=P1^0;
unsigned char i;
 
void main()
{
    TMOD=0X01;  //设置使用定时器0,16位的定时/计数寄存器
    TL0=0xD8;    //低八位赋初值
    TH0=0XF0;    //高八位赋初值
    ET0=1;          //开启定时器0中断
    TR0=1;         //运行定时器0
    EA=1;          //开启中断总开关
    while(1);
}
 
void Delay(void) interrupt 1 using 0
{
    i++;
    TR0=0;           //进入中断函数时,关闭定时器
    TL0=0XD8;    //重新赋初值
    TH0=0XF0;
    if(i==20)        //因为10ms一次处罚看不出明显结果,所以让20次触发才让灯变一次
    {
        LED0=~LED0;
    }
    TR0=1;     //重新开启定时器
}


 

  • 61
    点赞
  • 241
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 单片机的外部中断定时器中断是常见的中断方式。外部中断是指在单片机运行时,由外部设备或元件引起的中断,例如外部触发器、按键等。当外部设备引起中断时,单片机会暂停正在执行的程序,转而执行外部中断服务程序。定时器中断是指单片机内部的计时器到达设定的时间后,引起的中断。当定时器中断发生时,单片机会暂停正在执行的程序,转而执行定时器中断服务程序。 在单片机编程中,外部中断定时器中断常用于处理实时性要求较高的任务,例如按键检测、定时采样等。这些任务需要在单片机运行的同时,能够及时响应外部事件,并进行相应的处理。外部中断定时器中断的使用,能够大大提高单片机的实时性和处理能力,提高系统的稳定性和可靠性。 ### 回答2: 单片机外部中断是指当单片机外部发生特定事件时,通过外部信号触发中断,将CPU从正常运行状态切换到中断服务程序的一种机制。外部中断可以用于处理紧急事件或实时响应的需要。例如,当按下一个按钮时,可以通过配置单片机的外部中断来检测到按钮状态的改变并触发一个中断,进行相关的操作。 定时器中断是指通过定时器计数到达一个预设的值时,会触发中断请求,使CPU跳转到中断服务程序进行相应的操作。定时器中断用于实现时间精确控制、周期性任务的执行、定时触发事件等应用场景。例如,可以通过定时器中断来实现LED灯的闪烁,每隔一定时间切换LED的亮灭状态。 外部中断定时器中断在工作原理上有一些区别。外部中断需要监测外部引脚的电平变化,当检测到外部信号的变化时,触发中断。而定时器中断则需要设置定时器的初值和计数方式,当定时器计数到达预设值时,触发中断。 两者在应用上也分别有各自的优势。外部中断适用于对外部信号实时响应的场景,如按键检测、外部传感器触发等;而定时器中断适用于周期性任务的管理,如定时采样、定时触发等。在实际应用中,根据具体需求的不同,可以选择合适的中断方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值