Web introduction

This is about Heisenberg's little story

C51中断

@

中断相关缩写全称(初学容易记)

Abbreviation Full name Mean
TCON timer control 定时器控制寄存器
TF1 (TCON.7) Timer1 flag T1 中断标志位
TR1 (TCON.6) Timer1 Run T1 运行控制位
TF0 (TCON.5) Timer0 flag T0 中断标志位
TR0 (TCON.4) Timer0 Run T0 运行控制位
IE1 (TCON.3) Interrupt1 exterior 外部中断1中断标志位
IT1 (TCON.2)Interrupt1 touch 外部中断1 触发方式选择位
IE0 (TCON.1)Interrupt0 exterior 外部中断0中断标志位
IT0 (TCON.0)Interrupt0 touch 0-电平触发 1-下降沿触发
-- -- --
IE (A8H) interrupt enable 中断允许寄存器
EA (IE.7) enable all interrupt 中断总允许位
ES (IE.4) enable serial 串行口中断允许位
ET1 (IE.3) enable timer 1 T1 中断允许位
EX1 (IE.2) enable exterior 1 外部中断1中断允许位
ET0 (IE.1) enable timer 0 T0中断允许位
EX0 (IE.0) enable exterior 0 外部中断0中断允许位
-- -- --
IP (B8H) interrupt priority 中断优先级寄存器
PS (IP.4) priority serial 串口优先级标志位
PT1 (IP.3) priority timer 1 定时器1优先级标志位
PX1 (IP.2) priority exterior 1 外部中断1优先级标志位
PT0 (IP.1) priority timer 0 定时器0优先级标志位
PX0 (IP.0) priority exterior 0 外部中断0优先级标志位

电路图

中断过程



中断源

外部中断
INT0  :外部中断0请求,低电平有效   (中断标志位IE0)
INT1  : 外部中断1请求,低电平有效  (中断标志位IE1)

内部中断
T0   : 定时/计数器0溢出中断请求    (中断标志位TF0)
T1   : 定时/计数器1溢出中断请求    (中断标志位TF1)
TXD/RXD   : 串口中断请求,串口发送/接受完一帧数据时请求中断 ( 中断标志位RT or TI )

优先级

优先级左至右(高到低) INT0 T0 INT1 T1 TXD/RXD

TCON寄存器

D7 D6 D5 D4 D3 D2 D1 D0
addr:88H TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
T1 T0 INT1 INT1 INT0 INT0
  • IT0和IT1是设置外部中断的触发方式
    当其为0时,为低电平触发方式
    当其为1时,为负跳变触发方式
  • IE0和IE1是外部中断标志位
  • 下面是定时/计数器的控制
    TF0和TF1是定时器的中断标志
    TR1和TR0是打开相应的定时器

IE寄存器

D7 D6 D5 D4 D3 D2 D1 D0
addr:A8H EA ES ET1 EX1 ET0 EX0
中断源 T1 INT1 T0 INT0
  • EX0外部中断0允许位;
  • ET0定时/计数器T0中断允许位;
  • EX1 外部中断0允许位;
  • ET1 定时/计数器T1中断允许位;
  • ES 串行口中断允许位;
  • EA CPU中断允许(总允许)位。

中断优先级寄存器(IP)

D7 D6 D5 D4 D3 D2 D1 D0
addr:B8H PT2 PS PT1 PX1 PT0 PX0
中断源 T1 INT1 T0 INT0

PX0 : 外部中断0优先级设定位
PT0 : 定时/计数器T0优先级设定位
PX1 : 外部中断1优先级设定位
PT1 : 定时/计数器T1优先级设定位
PS  :  串行口优先级设定位;
PT2 : 定时/计数器T2优先级设定位

CPU处理中断三原则

  • CPU同时接收到几个中断时,首先响应优先级别最高的中断请求
  • 正在进行的中断过程不能被新的同级或低优先级的中断请求所中断
  • 正在进行的低优先级中断服务,能被高优先级中断请求所中断

中断响应条件

  • 中断源有中断请求
  • 此中断源的中断允许位为1
  • CPU开中断(即EA=1)

中断服务函数

void 函数名 ()  interrupt 中断号
{
do anything that you want
}
中断编号 0 1 2 3 4 5
中断源编号 INTI0 T0 INIT1 T1 T2

例子

#include<reg52.h>

//(低电平触发)给P3.2低电平触发中断,让led灯,在触发前后四位状态调换
void zhongduan_1()//电平触发
{
	P1 = 0x0f;                     // 0000 1111 下面四个灯亮 上面四个灯灭
	EX0 = 1;                       //INT0中断允许
	EA = 1;                        //全局中断打开
	IT0 = 0;                       //触发方式为低电平触发	
	while(1);
}

void low() interrupt 0             //外部中断编号
{
	P1 = ~P1;                      //led亮灭反转
}

//(下降沿触发)按下按键触发P3.3下降沿,让led灯,在触发前后四位状态调换
void zhongduan_2()                 //下降沿触发
{
	P1 = 0x0f;                     // 0000 1111 下面四个灯亮 上面四个灯灭
	EX1 = 1;                       //INT1中断允许
	EA = 1;                        //全局中断打开
	IT1 = 1;                       //触发方式为下降沿触发
	while(1);
}

void jump_low()	 interrupt 2       //外部中断编号
{
	P1 = ~P1;                      //led亮灭反转
}

...Thank you for reading...

posted @ 2021-03-12 16:07  Heisenberg_Poppings  阅读(522)  评论(0)    收藏  举报