STC89C51——中断系统

 前言

           本文介绍基于常见的51单片机,即如下图的芯片:

  • STC89C51具备5个中断源
    中断源优先级中断请求标志位中断允许控制位
    外部中断00IE0EX0
    定时器中断01TF0ET0
    外部中断12IE1EX1
    定时器中断13TF1ET1
    串口中断4RI / TI/

    优先级数字越低,越优先得到CPU处理。配置中断时,需要将对应中断允许控制位置1。

  • 使用任何中断,都需要打开总中断,即程序语句 EA = 1 ;

  • 与中断相关的寄存器:IE 、TCON、SCON(此处只介绍了常用的)


一、中断相关寄存器介绍

1.IE:中断允许寄存器(可位寻址)

D7D6D5D4D3D2D1D0
IEEA//ESET1EX1ET0EX0

对寄存器位功能介绍如下:

①EA :CPU总中断允许控制位。EA=1,允许总中断;EA=0,屏蔽所有中断请求。

②ES:串口中断允许位。用到串口中断时需要置 1

③ET1:定时器1中断允许位。用到定时器1中断时需要置 1

④EX1:外部中断1中断允许位。用到外部中断1中断时需要置 1

⑤ET0:定时器0中断允许位。用到定时器0中断时需要置 1

⑥EX0:外部中断0中断允许位。用到外部中断0中断时需要置 1

        实际应用中使用到中断的话,需根据对应中断将其中断允许位置 1,且EA也需置 1。

2.TCON:定时器/计数器控制寄存器(可位寻址)

D7D6D5D4D3D2D1D0
TCONTF1TR1TF0TR0IE1IT1IE0IT0

对寄存器位功能介绍如下:

①TF1: T1 溢出标志位。T1溢出后,硬件置1,硬件清0。
②TR1:T1 运行控制位。在 GATE=0时(此位在TMOD寄存器),只要TR1=1 , T1开始工作。
③TF0:T0 溢出标志位。T0溢出后,硬件置1,硬件清0。
④TR0:T0 运行控制位。在 GATE=0时(此位在TMOD寄存器),只要TR0=1 , T0开始工作。
⑤IE1:外部中断1请求标志位。硬件置1,硬件清0。
⑥IT1:外部中断1触发方式控制位。IT1=0,低电平触发;IT1=1,下降沿触发。
⑦IE0:外部中断0请求标志位。硬件置1,硬件清0。
⑧IT0:外部中断0触发方式控制位。IT0=0,低电平触发;IT0=1,下降沿触发。

        实际应用中,标志位不用配置,标志位是用来给CPU触发中断的;而控制位是在使用到任意中断时,需将对应的控制位置 1 。

3.SCON : 串行控制寄存器(可位寻址)

位地址9FH9EH9DH9CH9BH9AH99H98H
SCON//////T1R1

下面对寄存器控制位进行介绍:

①TI:发送中断请求标志位。

②RI:接收中断请求标志位。

        以上2个标志位,大多用于串口通信时,用于发送或接收到数据时的判断,由硬件置1,软件清0。实际应用中,可以配合2个标志位对数据进行处理。

二、程序

        以下程序为外部中断0和外部中断1参考程序。

#include <reg51.h>
 void INT0( ) interrupt 0   //如果是外部中断1,中断号为2(即interrupt 2)
{
	//Something to do ;
}

void main( )
{
	IT0=1;		//中断触发方式,1为下降沿触发,0为低电平触发(如果是外部中断1,则为IT1)
	EX0=1;		//使能外部中断0(如果是外部中断1,则为EX1)
	EA=1;		//允许总中断
	while(1);		//
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: stc89c51外部中断函数的实现方式很简单,首先需要在头文件中定义中断函数的原型,然后在程序中实现它。实现的步骤如下: 1、使用EA=1,打开外部中断; 2、使用EX0、EX1,设置外部中断0和外部中断1的触发方式; 3、设置中断向量; 4、在程序中实现中断函数。 ### 回答2: STC89C51是一种单片机,其中包含了两个外部中断引脚,分别是INT0和INT1。编写外部中断函数的主要目的是在这些引脚触发外部中断时,执行相应的操作。 下面是一个基本的STC89C51外部中断函数的示例: #include <reg52.h> // 外部中断0的中断服务函数 void ExternalInterrupt0() interrupt 0 { // 在此处编写中断发生时的代码 } // 外部中断1的中断服务函数 void ExternalInterrupt1() interrupt 2 { // 在此处编写中断发生时的代码 } void main() { // 初始化外部中断0和中断1 IT0 = 1; // 将INT0配置为边沿触发 IT1 = 0; // 将INT1配置为低电平触发 EX0 = 1; // 开启外部中断0 EX1 = 1; // 开启外部中断1 EA = 1; // 开启总中断使能 // 此处可以添加其他主程序代码 // ...... // 主循环 while(1) { // 在此处添加主循环代码 // ...... } } 以上代码演示了如何编写STC89C51的外部中断函数。在此示例中,我们定义了两个中断服务函数,分别用于处理外部中断0和外部中断1。在每个中断服务函数中,可以编写当相应的引脚触发外部中断时执行的代码。在主程序部分,我们初始化了中断的触发方式,开启外部中断,并开启总中断使能。最后,主程序进入一个无限循环,可以在其中添加其他需要执行的代码。 请注意,具体的中断触发方式和中断服务函数的编写,需要根据具体的应用场景和需求进行相应的调整和修改。 ### 回答3: STC89C51是一款常用的单片机芯片型号,具有内置的外部中断引脚INT0和INT1。以下是一个示例的STC89C51外部中断函数的编写过程: #include <reg51.h> //包含STC89C51的寄存器定义和头文件 sbit led = P1^0; //定义一个LED灯连接到P1.0口 sbit key = P3^2; //定义一个按键连接到P3.2口 void extInterruptInit() { IT0 = 1; //设置外部中断INT0为电平触发 EX0 = 1; //使能外部中断INT0 EA = 1; //使能全局中断 } void extInterrupt0()interrupt 0 { led = ~led; //当INT0触发时,反转LED的状态 } void main() { extInterruptInit(); //初始化外部中断 while(1) { //其他的主函数代码 } } 在上述代码中,首先定义了一个LED灯连接到P1.0口,并且定义一个按键连接到P3.2口。然后,在extInterruptInit()函数中,通过设置IT0为1,将外部中断INT0设置为电平触发模式。接着,通过将EX0设置为1使能INT0中断,并通过EA设置为1使能全局中断。 在外部中断函数extInterrupt0()中,使用了interrupt关键字声明该函数为中断函数,并将中断号设置为0,表示对应INT0中断。在该函数内,当外部中断0(INT0)触发时,通过led = ~led语句反转LED的状态。 最后,在main()函数中,首先调用extInterruptInit()函数进行外部中断的初始化设置,然后通过一个无限循环保持程序的执行。在循环中,可以添加其他的主函数代码。 以上是一个简单的STC89C51外部中断函数的示例,通过该函数,当INT0触发时,可以通过改变LED的状态来实现相应的功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式创客工坊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值