0%

对51单片机中断的整理(非全部)

先整理记录外部中断和定时器中断(っ・Д・)っ。

单片机: STC89C52
开发板: HC6800-MS

相关的特殊功能寄存器

定时器控制寄存器TCON

符号 说明
0 IT0 外部中断0触发方式选择位。置0,则为低电平触发;置1,则为负跳变触发。
1 IE0 外部中断0请求标志位。
2 IT1 外部中断1触发方式选择位。置0,则为低电平触发;置1,则为负跳变触发。
3 IE1 外部中断1请求标志位。
4 TR0 定时器0运行控制位。软件置1来启动定时器;软件清零来停止定时器。
5 TF0 定时器0中断标志位。
6 TR1 定时器1运行控制位。软件置1来启动定时器;软件清零来停止定时器。
7 TF1 定时器1中断标志位。

中断允许寄存器IE

符号 说明
0 EX0 外部中断0允许位。
1 ET0 定时器中断0允许位。
2 EX1 外部中断1允许位。
3 ET1 定时器中断1允许位。
4 ES 串口中断允许位。
5 / /
6 / /
7 EA 中断总允许位。

定时器模式寄存器TMOD

TMOD的位分配

注:标有T1的符号表示控制定时器T1的位,标有T0的符号表示控制定时器T0的位。

符号 复位值
7 GATE(T1) 0
6 C/T(T1) 0
5 M1(T1) 0
4 M0(T1) 0
3 GATE(T0) 0
2 C/T(T0) 0
1 M1(T0) 0
0 M0(T0) 0

TMOD的位描述

符号 描述
GATE 门控位。当GATE=0时,只要TCON中的TR0或TR1为1,就能启动相应的定时器/计数器;当GATE=1时,只要TCON中的TR0或TR1为1,且外部中断引脚INT0或INT1为高电平时,才能启动相应的定时器/计数器。
C/T 定时器/计数器模式选择位。C/T=0为定时器模式;C/T=1为计数器模式。

TMOD的M1、M0和工作模式

M1 M0 工作模式 描述
0 0 0 兼容8048单片机的13位定时器。
0 1 1 THn和TLn组成一个16位的定时器。
1 0 2 8位自动重装载模式,定时器溢出后把THn重装载到TLn。
1 1 3 禁用定时器T1,定时器T0变成两个8位定时器。

外部中断

STC89C52有两个外部中断源——外部中断0和外部中断1,分别由引脚INT0(P3.2)INT1(P3.3)的低电平或负跳变触发。

用法

要使用外部中断,需要对IETCON这两个特殊功能寄存器进行初始化操作:

1. 开启中断总允许位EA
2. 开启外部中断允许位EX
3. 设置外部中断触发方式

举个栗子

#include<reg51.h>
sbit D8=P2^7;
sbit K5=P3^5;
sbit x=P3^2; //把触发外部中断0的引脚定义为x
void Delay10ms()
{
unsigned char i=20,j=113;
do
{
while(--j);
}
while(--i);
}

void Interrupt() //对相关的特殊功能寄存器进行初始化操作
{
EA=1; //开启中断总允许位EA
EX0=1; //开启外部中断0允许位EX0
IT0=1; //设置外部中断0的触发方式为负跳变触发
}
void Int0() interrupt 0 //定义外部中断0的中断函数Int0,“interrupt”后的“0”为中断号
{
D8=~D8;
}
void main()
{
Interrupt();
while(1)
{
if(K5==0)
{
Delay10ms();
if(K5==0)
{
x=1; //产生负跳变信号
x=0;
while(!K5); //按键松开检测
}
}
}
}

运行结果:初次按下独立按键K5,LEDD8亮;再次按下独立按键K5,LEDD8灭。

定时器中断

当定时器的计数值溢出时,就能够触发定时器中断。

用法

要使用定时器中断,需要对TCONIETMOD这三个特殊功能寄存器进行初始化操作:

1. 开启中断总允许位EA
2. 开启定时器中断允许位ET
3. 设置定时器的工作模式
4. 确定THn和TLn的初值
5. 开启定时器

举个栗子

#include<reg51.h>
sbit D8=P2^7;
void Time0() //对相关的特殊功能寄存器进行初始化操作
{
EA=1; //开启中断总允许位EA
ET0=1; //开启定时器中断允许位ET0
TMOD=1; //设置定时器T0的工作模式为1
TH0=0xB8; //对TH0和TL0赋初值
TL0=0x00;
TR0=1; //开启定时器T0
}
void Timeinterrupt0() interrupt 1 //定义触发定时器中断0的中断函数
{
int i;
TH0=0xB8;
TL0=0x00;
i++;
if(i==50)
{
D8=~D8;
i=0;
}
}
void main()
{
Time0();
while(1);
}

运行结果:开发板上编号为D8的LED以先点亮1秒后熄灭1秒的规律来循环亮灭。

附注

中断源 中断号
外部中断0 0
定时器中断0 1
外部中断1 2
定时器中断1 3
串口中断 4