单片机模板五:中断系统与外部中断

一、寄存器

        首先,我们需要了解寄存器。寄存器是特殊的RAM,特殊功能寄存器是控制单片机硬件的开关(例如IE)或者是指示单片机状态的信号(例如PSW),通过特殊寄存器你就可以方便的控制整个MCU,并且知道当前的MCU的工作状态。标准的51单片机中控制中断的寄存器有两个,一个是中断使能寄存器,一个是中断优先级寄存器。

1、中断使能寄存器IE:

EX0——EX0=1,允许外部中断0中断;EX0=0,禁止外部中断0中断。

ET0——ET0=1,允许T0中断;ET0=0,禁止T0中断。

EX1——EX1=1,允许外部中断1中断;EX1=0,禁止外部中断1中断。

ET1——ET1=1,允许T1中断;ET1=0,禁止T1中断。

ES——ES=1,允许串行口中断;ES=0,禁止串行口中断。

EA——EA=1,CPU开放中断;EA=0,CPU禁止所有的中断请求。

2、中断优先级寄存器IP

PS(串行口中断优先级控制位)——PS=1,串行口中断定义为高优先级中断。PS=0,串行口中断定义为低优先级中断。

PT1(定时器/计数器1中断优先级控制位)——
PT1=1,定时器/计数器1中断定义为高优先级中断。
PT1=0,定时器/计数器1中断定义为低优先级中断。

PX1(外部中断1中断优先级控制位)——PX1=1,外部中断1定义为高优先级中断。PX1=0,外部中断1定义为低优先级中断。

PT0(定时器/计数器0中断优先级控制位)——PT0=1,定时器/计数器0中断定义为高优先级中断。PT0=0,定时器/计数器0中断定义为低优先级中断。

PX0(外部中断0中断优先级控制位)——PX0=1,外部中断0定义为高优先级中断。PX0=0,外部中断0定义为低优先级中断。

中断优先级:外部中断0 > T0溢出中断 > 外部中断1 > T1溢出中断 > 串行口中断 > T2溢出中断

二、外部中断

L1一直闪烁,当按下S5时,L8亮。

寄存器配置:
    IT0 = 1;//选择外部中断0为电平触发方式
    EX0 = 1;//允许外部中断0
    EA = 1;    //总中断允许

方法一的代码(在L8亮或灭的状态下都可以控制L8):

#include <reg52.h>

sbit L1 = P0^0;
sbit L8 = P0^7;

void SelectHC573(unsigned char channel)
{
    switch(channel)
    {
        case 4:
        P2=(P2&0X0F)|0X80;
        break;
        case 5:
        P2=(P2&0X0F)|0Xa0;
        break;
        case 6:
        P2=(P2&0X0F)|0Xc0;
        break;
        case 7:
        P2=(P2&0X0F)|0Xe0;
        break;
    }
}

void Delay(unsigned int t)
{
    while(t--);
    while(t--);
}
void working()
{
    SelectHC573(4);
    L1 = 0;
    Delay(60000);
    L1 = 1;
    Delay(60000);
}

//=============================
void Init_INT0()  //中断函数初始化(外部中断0)
{
    IT0 = 1;//下降沿中断
    EX0 = 1;//外部中断0
    EA = 1;    //总中断
}


void Service_INT0() interrupt 0  //中断服务函数
{
    L8 = 0;
    Delay(60000);
    Delay(60000);
    Delay(60000);
    L8 = 1;
}

//================================

void InitSystem()
{
    SelectHC573(5);
    P0 = 0x00;
    SelectHC573(4);
    P0 = 0xff;
}    

void main()
{
    InitSystem();
    Init_INT0();
    while(1)
    {
        working();
    }
}

方法二的代码(方法二并没有实现符合要求的中断,中断仅仅对L8状态赋值,然而while中依旧遵循在执行完working后,才会执行控制L8的相关函数,即必须在L1灭的状态之后才能控制L8):

#include <reg52.h>

sbit L1 = P0^0;
sbit L8 = P0^7;

void SelectHC573(unsigned char channel)
{
    switch(channel)
    {
        case 4:
        P2=(P2&0X0F)|0X80;
        break;
        case 5:
        P2=(P2&0X0F)|0Xa0;
        break;
        case 6:
        P2=(P2&0X0F)|0Xc0;
        break;
        case 7:
        P2=(P2&0X0F)|0Xe0;
        break;
    }
}

void Delay(unsigned int t)
{
    while(t--);
    while(t--);
}
void working()
{
    SelectHC573(4);
    L1 = 0;
    Delay(60000);
    L1 = 1;
    Delay(60000);
}

//=============================
void Init_INT0()
{
    IT0 = 1;
    EX0 = 1;
    EA = 1;    
}

unsigned char stat = 0;
void Service_INT0() interrupt 0
{
    stat = 1;
}

void LEDINT()
{
    if(stat == 1)
    {
        L8 = 0;
        Delay(60000);
        Delay(60000);
        Delay(60000);
        Delay(60000);
        Delay(60000);
        Delay(60000);
        L8 = 1;
        stat = 0;
    }
}

//================================

void InitSystem()
{
    SelectHC573(5);
    P0 = 0x00;
    SelectHC573(4);
    P0 = 0xff;
}    

void main()
{
    InitSystem();
    Init_INT0();
    while(1)
    {
        working();
        LEDINT();
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值