89C51/52的中断系统有5个中断源 ,2个优先级,可实现二级中断嵌套 。
( P3.2)可由IT0(TCON.0)选择其为低电平有效还是下降沿有效。当CPU检测到P3.2引脚上出现有效的中断信号时,中断标志IE0(TCON.1)置1,向CPU申请中断。
(P3.3)可由IT1(TCON.2)选择其为低电平有效还是下降沿有效。当CPU检测到P3.3引脚上出现有效的中断信号时,中断标志IE1(TCON.3)置1,向CPU申请中断。
TF0(TCON.5),片内定时/计数器T0溢出中断请求标志。当定时/计数器T0发生溢出时,置位TF0,并向CPU申请中断。
TF1(TCON.7),片内定时/计数器T1溢出中断请求标志。当定时/计数器T1发生溢出时,置位TF1,并向CPU申请中断。
RI(SCON.0)或TI(SCON.1),串行口中断请求标志。当串行口接收完一帧串行数据时置位RI或当串行口发送完一帧串行数据时置位TI,向CPU申请中断。
中断的优先级别及中断函数编号
TMOD寄存器 (定时/计时)
中断源符号及中断号
中断响应条件
- 中断源有中断请求;
- 此中断源的中断允许位为1;
- CPU开中断(即EA=1)。
#include <STC89C5xRC.H>
typedef unsigned int u16;
typedef unsigned char u8;
sbit LED1 = P2^0;
sbit KEY3 = P3^2;
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
//外部中断0使能函数
void exti0_init()
{
INT0 = 1;
EX0 = 1;
EA = 1;
}
//中断0服务程序
void exti0() interrupt 0
{
delay_10us(100);
if(KEY3==0)
LED1 = ~LED1;
}
void main()
{
exti0_init();
}
//写入单片机后,按KEY3存在“触摸不灵”的感觉,时而有效时而无效。
K3开关电机 K4电机停5s,转5s K4只需按一次,K3产生中断
#include <STC89C5xRC.H>
typedef unsigned int u16;
typedef unsigned char u8;
sbit LED1 = P2^0;
sbit LED2 = P2^1;
sbit KEY3 = P3^2;
sbit KEY4 = P3^3;
sbit DC_Motor = P1^3;
void delay_ms(u16 ms)
{
u16 i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
//外部中断0使能函数
void exti0_init()
{
INT0 = 1;
EX0 = 1;
EA = 1;
}
//外部中断2使能函数
void exti2_init()
{
INT1 = 1;
EX1 = 1;
EA = 1;
}
//外部中断0服务程序
void exti0() interrupt 0
{
if(DC_Motor==1)
{
DC_Motor=0;
EX1 = 0;
}
else
{
DC_Motor=1;
EX1 = 1;
}
}
//外部中断2服务程序
void exti2() interrupt 2
{
DC_Motor = 0;
delay_ms(5000);
DC_Motor = 1;
delay_ms(5000);
KEY4 = 0;
}
void main()
{
exti0_init();
exti2_init();
while(1);
}
//使用外部中断0、1与定时器0实现:key3(外部中断0)开/关机,key4(外部中断1)使能定时器0;实现电机停2s,转2s
电机接在J47的1、5接口
#include <STC89C5xRC.H>
typedef unsigned int u16;
typedef unsigned char u8;
sbit LED1 = P2^0;
sbit LED2 = P2^1;
sbit KEY3 = P3^2;
sbit KEY4 = P3^3;
sbit DC_Motor = P1^3;
void delay_ms(u16 ms)
{
u16 i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
//
void time0_init(void)
{
TMOD|=0X01;//选择为定时器0模式,工作方式1
TH0=0XFC; //给定时器赋初值,定时1ms
TL0=0X18;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
}
//
void time0() interrupt 1 //定时器0中断函数
{
static u16 i;//定义静态变量i
TH0=0XFC; //给定时器赋初值,定时1ms
TL0=0X18;
i++;
if(i==2000)
{
i=0;
DC_Motor = ~DC_Motor;
}
}
//外部中断0使能函数
void exti0_init()
{
INT0 = 1;
EX0 = 1;
EA = 1;
}
//外部中断2使能函数
void exti2_init()
{
INT1 = 1;
EX1 = 1;
EA = 1;
}
//外部中断0服务程序
void exti0() interrupt 0
{
if(DC_Motor==1)
{
DC_Motor=0;
EX1 = 0;
//
TR0 = 0;
}
else
{
DC_Motor=1;
EX1 = 1;
}
}
//外部中断2服务程序
void exti2() interrupt 2
{
// DC_Motor = 0;
// delay_ms(5000);
// DC_Motor = 1;
// delay_ms(5000);
// KEY4 = 0;
time0_init();
}
void main()
{
exti0_init();
exti2_init();
while(1);
}
succ!