51单片机学习笔记(三)——中断

中断系统

51的中断系统有5个中断源,2个优先级,可实现二级中断嵌套。

P3.2口可由IT0选择其为低电平有效还是下降沿有效。当CPU检测到P3.2引脚上出现有效的中断信号时,中断标志置1,向CPU申请中断。

P3.3口可由IT1选择其为低电平有效还是下降沿有效。当CPU检测到P3.3引脚上出现有效的中断信号时,中断标志置1,向CPU申请中断。

TF0,片内定时/计数器T0溢出中断请求标志。当定时/计数器T0发生溢出时,置位TF0,向CPU申请中断。

TF1,片内定时/计数器T1溢出中断请求标志。当定时/计数器T1发生溢出时,置位TF1,向CPU申请中断。

RI或TI,串行口中断请求标志。当串行口接收完一帧串行数据时置位RI或当串行口发送完一帧串行数据时置位TI,向CPU请求中断。

中断允许控制

CPU对中断系统所有中断以及某个中断源的开放与屏蔽是由中断允许寄存器IE控制的。

EX0(IE.0),外部中断0允许位

ET0(IE.1),定时/计数器T0中断允许位

EX1(IE.2),外部中断1允许位

ET1(IE.3),定时/计数器T1中断允许位

ES(IE.4),串行口中断允许位

EA(IE.7),CPU中断允许位(总允许位)

中断请求标志

TCON的中断标志

IT0(TCON.0),外部中断0触发方式控制位

IE0(TCON.1),外部中断0中断请求标志位

IT1(TCON.2),外部中断1触发方式控制位

IE1(TCON.3),外部中断1中断请求标志位

TF0(TCON.5),定时/计数器T0溢出中断请求标志位

TF1(TCON.7),定时/计数器T1溢出中断请求标志位

 

优先级(由高到低)      中断号

外部中断0                           0        

定时/计数器0                      1

外部中断1                           2

定时/计数器1                       3

串行口                                 4

 

中断响应条件(以下三条同时满足时CPU才有可能响应中断)

中断源有中断请求

此中断源的中断允许位为1

CPU开中断(即EA=1)

 

外部中断0

#include "reg52.h"

typedef unsigned int u16;
typedef unsigned char u8;

sbit led=P2^0;
sbit k3=P3^2;

void delay(u16 i)
{
    while(i--);
}

void Int0Init()
{
    IT0=1;    //设置外部中断的触发方式
    EX0=1;    //打开外部中断
    EA=1;    //打开中断总控制位    
}

void main()
{
    Int0Init();
    while(1);
}

void Int0() interrupt 0
{
    delay(1000);
    if(k3==0)
    {
        led=~led;
    }
}

 

外部中断1

#include "reg52.h"

typedef unsigned int u16;
typedef unsigned char u8;

sbit led=P2^0;
sbit k4=P3^3;

void delay(u16 i)
{
    while(i--);
}

void Int1Init()
{
    EA=1;
    IT1=1;
    EX1=1;
}

void main()
{
    Int1Init();
    while(1);
}

void Int1() interrupt 2
{
    delay(1000);
    if(k4==0)
    {
        led=~led;
    }
}

 

定时器与计数器

定时/计数器的工作是独立完成的,不需要单片机CPU的参与。定时/计数器是根据机器内部的时钟或外部的脉冲信号对寄存器中的数据加1 。有了定时/计数器之后,可以增加单片机的效率,一些简单的重复加1的工作可以交给定时/计数器完成,CPU转而处理更复杂的事情,同时可实现精确定时的作用。

定时/计数器的实质上是一个加1计数器(16位),由高8位和低8位两个寄存器THx和TLx组成,随着计数器的输入脉冲进行自加1,当加到计数器全为1时,再输入一个脉冲就使计数器回0,且计数器的溢出使相应的中断标志位置1 。向CPU发出中断请求。如果工作于定时模式,则表示定时时间已到;如果工作于计数模式则表示计数值已满。可知,由溢出时计数器的值-计数初值才是加1计数器的计数值。

TMOD是定时/计数器的工作方式寄存器,确定工作方式和功能;TCON是控制寄存器,控制T0、T1的启动和停止及设置溢出标志。

TMOD的低四位用于T0,高四位用于T1 。GATE=0时(GATE是门控位,第7位),只要使TCON中的TR0或TR1为1,就可以启动定时/计数器工作;GATE=1时,使TR0或TR1为1,同时外部中断引脚INT0/1也为高电平时,才能启动定时/计数器工作。

C/T(第6位):定时/计数模式选择位,为0时为定时模式,为1时为计数模式。

M1M0(第5,4位):工作方式设置位。定时/计数器有四种工作方式:

M1M0 工作方式 说明
00 方式0 13位定时/计数器
01 方式1 16位定时/计数器
10 方式2 8位自动重装定时/计数器
11 方式3

T0分成两个独立的8位定时/计数器,T1停止计数

 主要使用方式1

使用定时器

1.对TMOD赋值,以确定T0,T1的工作方式

2.计算初值,并将其写入TH0、TL0或TH1、TL1

3.对EA赋值,开放定时器中断

4.使TR0或TR1置位,启动定时/计数器定时或计数

 

定时器0中断

#include "reg52.h"

typedef unsigned int u16;
typedef unsigned char u8;

sbit led=P2^0;

void Time0Init()
{
    TMOD=TMOD||0x10;
    TH0=0xfc;    //高8位  定时1ms
    TL0=0x18;    //低8位
    ET0=1;       //打开定时器中断
    EA=1;        //打开总中断
    TR0=1;      //启动
}

void main()
{
    Time0Init();
    while(1);
}

void Time0() interrupt 1
{
    static u16 i;
    Th0=0xfc;
    TL0=0x18;  //重装
    i++;
    if(i=1000)   //1s
    { 
        i=0;
        led=~led;    //每秒进行翻转
    }
}

 

定时器1中断

可参考定时器0

修改TH1、TL1、ET1、TR1和中断位即可。

你可能感兴趣的:(51单片机)