51之中断系统

中断系统是为了使CPU具有对外界紧急事件的实时处理能力而设置的。

由于C51 是单线程,如果在执行过程中需要去处理某些事情,则需要中断。

如果使用C语言编程,中断查询次序号就是中断号,例如:

void Int0_Routine(void) interrupt 0;

void Timer0_Rountine(void) interrupt 1;

void Int1_Routine(void) interrupt 2;

void Timer1_Rountine(void) interrupt 3;

void UART_Routine(void) interrupt 4;

void Timer2_Rountine(void) interrupt 5;

void Int2_Routine(void) interrupt 6;

void Int3_Routine(void) interrupt 7;

定时器中断方式控制

结合上图可以知道CPU能响应定时器 0 中断的条件:需要配置IE寄存器的bit1: ET0, bit7: EA

  1. ET0中断允许要置1 ET0 = 1

  1. EA总中断要置 1 EA = 1

中断控制LED

#include "reg52.h"

sbit led  = P3^6;
sbit led1 = P3^7;
int cnt = 0;

void Time0Init()
{
    // 1. 配置定时器0工作模式为16位计时
    TMOD = 0x01;
    // 2. 给初值,定一个10ms出来
    TL0 = 0x00; 
    TH0 = 0xDC;
    //3. 开始计时
    TR0 = 1;
    TF0 = 0;
    // 4. 打开定时器0中断
    ET0 = 1;
    // 5. 打开总中断EA
    EA = 1;
}

void Delay300ms()        //@11.0592MHz
{
    unsigned char i, j, k;

    //_nop_();
    i = 3;
    j = 26;
    k = 223;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}


void main()
{
    
    led = 1;
    
    Time0Init();
    
    //4. 爆表了,操作led吗,累计到1s再操作led
    while(1){
        led1 = 0;
        Delay300ms();
        led1 = 1;
        Delay300ms();
    }
}

void TimeOHandler() interrupt 1
{
    cnt++;
    // 重新赋初值
    TL0 = 0x00; 
    TH0 = 0xDC;
    if(cnt == 100){
        cnt = 0;
        led = !led;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值