中断
TMOD:定时器/计数器工作方式寄存器
TCON:定时器/计数器控制寄存器
IE:中断允许控制寄存器
IP:中断优先级控制寄存器
外部中断0
外部0中断触发:(P3.2口触发;P3.2触发;P3.2触发)
若IT0=0,则为低电平触发
若IT0=1,则为下降沿触发
外部中断0初始化:
初始化方法一:
void Init_INT0()
{
IT0=1;//设置外部中断0;下降沿触发
EX0=1;//开启外部中断0;
EA=1;//开启中断总开关
}
初始
化方法二:
void Init_INT0()
{
TCON=TCON|0x01;//0000 0001->0x01相当IT0=1;设置下降沿触发中断
IE=0x81;//1000 0001->0X81;
//第一个1是EA=1;即中断总开关
//第二个1是EX0=1;即中断分支开关
}
外部0
中断子函数:
void RSI_INT0() interrupt 0
{
P0=~P0;//当触发中P0口的LED取反
}
主函数:
void main()
{
P0=0xff;//灯全熄灭
Init_INT0();//初始化外部中断0
while(1);
}
外部中断1:
外部1中断触发:(P3.3口触发;P3.3触发;P3.3触发
)
若IT1=0,则为低电平触发
若IT1=1,则为下降沿触发
外部中断1初始化:
方法一:
void Init_INT1()
{
IT1=1;//设置外部中断1;下降沿触发
EX1=1;//开启外部中断1;
EA=1;//开启中断总开关
}
方法二:
void Init_INT1()
{
// IT1=1;//设置下降沿触发
// EX1=1;//外部中断1的分支开关
// EA=1;//中断总开关
TCON=TCON|0x04;//0000 0100->0x04相当IT1=1;设置下降沿触发
IE=0x84;//IE=1000 0100->0x84
//第一个1相当EA=1;第二个1相当EX1=1
}
外部1
中断子函数:
void ISR_Int1() interrupt 2
{
P0=~P0;//取反
}
主函数:(P3.3给了下降沿,软件触发)
void main()
{
P0=0xff;//熄灭所有的灯
Init_INT1();//外部中断1初始化
while(1){
Int1=1;
Int1=0;//P3.3由1->0;下降沿触发
}
}
该主函数可进行Dobug,查看函数的走向。
例题:(中断嵌套)
利用外部中断0,进行3次流水灯;
利用外部中断1,进行3次闪耀;
且外部中断1的优先级高于外部中断1。
不进行中断时LED灯处于熄灭状态。
#include <reg51.h>
//延时程序
void delay()
{
int i,j;
for(i=0;i<10;i++)
for(j=0;j<3000;j++);
}
//外部中断0和1初始化
void Init_INT01()
{
TCON=TCON|0x05;//0000
0101->0x01相当IT0=1,IT1=1;设置下降沿触发中断
IE=0x85;//1000 0101->0X85;
//第一个1是EA=1;即中断总开关
//第二个1是EX1=1;即中断1分支开关
//第二个1是EX0=1;即中断0分支开关
IP=IP|0x04;//设置外部中断1优先级高于外部中断0
}
//LED右移程序
void lelf(unsigned int n)
{
unsigned int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<8;j++)
{
P0=~(0x80>>j);
delay();
}
}
P0=0xff;
}
//闪耀程序
void flash(unsigned int n)
{
unsigned int i;
for(i=0;i<n;i++)
{
P0=~P0;
delay();
}
}
void main()
{
Init_INT01();
while(1);
}
//外部中断0子程序
void out_INT0() interrupt 0
{
lelf(3);
}
//外部中断1子程序
void out_INT1() interrupt 2
{
flash(4);
}
定时器0中断:
中断触发:
定时/计数时间到触发中断
定时/计数原理:
脉冲下降沿,定时器/计数的值加 1
初始化程序:
//定时器/计数器0初始化
void tminer0_Init()
{
TMOD&=0XFC;//选择定时模式C/T=0;计数模式C/T=1;
TMOD|=0x01;//选择定时器0;工作模式1,16位定时/计数
TH0=0xFF; //装初值
TL0=0xFE; //定时1us
ET0=1; //定时器0开关
EA=1; //中断总开关
TR0=1; //启动定时器0
}
中断子程序:
//定时器中断0子程序
void time0() interrupt 1
{
TH0=0xFF;//重新装初值
TL0=0xFE;//定时1us
P0=~P0;
}
主程序:
void main()
{
tminer0_Init();
while(1);
}
定时器1中断:
#include
<reg51.h>
//定时器/计数器1初始化
void
tminer1_Init()
{
TMOD&=0XCF;//选择定时模式C/T=0;计数模式C/T=1;
TMOD|=0x10;//选择定时器1;工作模式1,16位定时/计数
TH1=0xFF;//装初值
TL1=0xFE;//定时1us
ET1=1;//定时器1开关
EA=1;//中断总开关
TR1=1;//启动定时器1
}
void
main()
{
tminer1_Init();
while(1);
}
//定时器中断1子程序
void
time0() interrupt 3
{
TH1=0xFF;//重新装初值
TL1=0xFE;//定时1us
P0=~P0;
}