C51之外部中断

/*
名称:C51之外部中断实验
说明:关于什么是中断这里就不说了。说说计算机中使用中断有什么好处吧。
(1)、实时处理。在计算机控制系统中,环境、参数的突然变化,可能需要
CPU立即做出相应或处理。
(2)、异常处理。计算机系统运行过程中,经常会出现断电、程序出错等问
题,这时就需要CPU对故障源进行处理。(从某种程度上说,第二点和第一点
差不多)。
(3)、提高效率。由于外设和CPU的速度不同,采用中断技术可以大大提高C
PU的运行效率。

再来谈谈C51单片机的中断使用。对于C51来说,其中断的内容还是比较简单的,一般而言,C51单片机有5个中断源(2个外部中断、2个定时器中断和一个串口
中断)。对中断的配置操作,主要通过控制三个寄存器就可以(中断允许寄存器IE)、定时器控制寄存器(TCON)和中断优先级寄存器(IP)。有关这三个寄存器挺简单,就不说了。

还有中断服务函数,在CPU接收到中断后,会执行相应中断的中断服务函数。而C51的中断服务函数也很简单,和普通的函数很像(函数名括号后面加上interrupt 和标志号)。据我估计,这个标志号就是类似于高级芯片中的中断向量表。中断服务函数存储的位置,应该都是固定的(方便系统查找)。

再来说说程序:
本实验是外部中断实验。程序的主要部分执行数码管数字的循环显示(0-F),配置了两个外部中断,外部中断服务的功能是数码管重新开始显示。并且外部中断0可以抢占外部中断1。

*/

中断部分:

//中断初始化
void Interrupt_eint()
{


        EX0 = 1;        //开启外部中断0
        IT0 = 1;                //设置外部中断0触发模式:下降沿触发

        EX1 = 1;        //开启外部中断1
        IT1 = 1;            //设置外部中断1触发模式
//  
        EA = 1;             //开启总中断

        PX0 = 1;            //将外部中断的优先级提高
}

//外部0中断服务函数
void int0() interrupt 0
{
    uchar j = 0;

    for(j = 0;j<=3;++j)
    {
        DisplayNum(j);
        delay_ms(1000);
    }
}


//外部1中断服务函数
void int1() interrupt 2
{
     uchar j = 0;

    for(j = 0;j<=5;++j)
    {
        DisplayNum(j);              //数码管循环显示0-5
        delay_ms(1000);
    }
}

有关于数码管显示部分的代码就不说了,以前的博客中有的。

### C51单片机外部中断的配置及使用教程 #### 1. 外部中断的基本概念 C51单片机支持多种中断源,其中包括两个外部中断:INT0(P3.2引脚)和INT1(P3.3引脚)。外部中断可以通过设置特殊功能寄存器来实现边沿触发或电平触发模式。当外部信号满足触发条件时,会中断当前程序执行并跳转到对应的中断服务程序[^1]。 #### 2. 外部中断的相关寄存器 - **IE(中断允许寄存器)**:用于控制各个中断源的开启与关闭。 - EA位:总中断开关,EA=1表示允许中断。 - EX0和EX1位:分别控制外部中断0和外部中断1的允许状态。 - **TCON(定时器控制寄存器)**:用于设置外部中断的触发方式。 - IT0和IT1位:分别设置外部中断0和外部中断1的触发模式。ITx=0表示低电平触发,ITx=1表示下降沿触发[^2]。 #### 3. 配置外部中断的步骤 以下是配置外部中断的基本流程: - 初始化相关寄存器,设置触发模式。 - 编写中断服务程序,并指定中断号。 - 开启对应中断源及总中断开关。 #### 4. 示例代码 以下是一个完整的代码示例,展示如何使用外部中断0控制LED灯的亮灭。 ```c #include <reg51.h> sbit led = P1^0; // 定义LED连接在P1.0引脚 void int0_init() { IT0 = 1; // 设置外部中断0为下降沿触发 EX0 = 1; // 允许外部中断0 EA = 1; // 打开总中断开关 } void int0_isr() interrupt 0 { // 中断服务程序,中断号为0 led = !led; // 切换LED状态 } void main() { int0_init(); // 初始化外部中断 while (1); // 主循环中无需其他操作 } ``` #### 5. 代码说明 - **外部中断初始化**:通过`int0_init()`函数设置`IT0`为1(下降沿触发),`EX0`为1(允许外部中断0),以及`EA`为1(打开总中断开关)。 - **中断服务程序**:当外部中断0被触发时,执行`int0_isr()`函数,切换LED的状态[^2]。 - **主函数**:调用`int0_init()`完成初始化后,进入无限循环等待中断触发。 #### 6. 注意事项 - 确保外部中断引脚(如P3.2)连接了适当的硬件电路,例如按键和上拉电阻。 - 如果使用低电平触发模式,需注意信号的稳定性,避免因噪声导致误触发[^2]。 - 在实际应用中,可以加入去抖动处理以提高系统的可靠性。 ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值