51中断
中断源
名称 | 中断 | 优先级 |
---|---|---|
INT0:外部中断0 | 中断请求IE0 | interrupt 0 |
INT1:外部中断1 | 中断请求IE1 | interrupt 2 |
T0:定时器中断0 | TF0 | interrupt 1 |
T1:定时器中断1 | TF1 | interrupt 3 |
RXD/TXD:串口中断 | TI/RI | interrupt 4 |
中断有关的特殊功能寄存器
- 中断允许控制寄存器(IE)
- 中断优先级控制寄存器(IP)
中断允许控制寄存器(IE)
IE是控制中断的开关,通过对IE的清0和置1操作来控制中断的屏蔽和开放。
EA:总中断允许控制位。当EA=0时,不允许任何中断请求。
ES:串行口中断控制位。当ES=0时,不允许串行口中断;当EA=1且ES=1时,允许串行口中断。
ET1:定时/计数器1中断允许控制位。当ET1=0时,屏蔽T1的溢出中断;当EA=1且ET1=1时,允许T1溢出中断
ET0:定时/计数器0中断允许控制位。功能与ET1相同。
EX1:外部中断1的中断允许控制位。当EX1=0时,屏蔽外部中断1的中断请求;当EA=1且EX1=1时,允许外部中断1的中断请求
EX0:外部中断0的中断允许控制位。功能与EX1相同
中断优先级控制寄存器(IP)
PS:串行口中断优先级控制位。PS=1,串行口中断为高优先级;PS=0,为低优先级。
PT1:定时/计数器1中断优先级控制位。当PT1=0时,T1溢出中断为低优先级;当PT1=1时,T1溢出中断为高优先级。
PT0:定时/计数器0中断优先级控制位。当PT0=0时,T0溢出中断为低优先级;当PT0=1时,T0溢出中断为高优先级。
PX1:外部中断1的中断优先级控制位。当PX1=0时,外部中断1为低优先级;当PX1=1时,外部中断1为高优先级。
PX0:外部中断0的中断优先级控制位。当PX0=0时,外部中断0为低优先级;当PX0=1时,外部中断0为高优先级。
同级内第二优先级的次序:
外部中断0 > T0溢出中断 > 外部中断1 > T1溢出中断 > 串行口中断
外部中断
触发方式有两种电平触发:
第一种是低电平触发:IT0 = 0
第二种是跳变触发(下降沿触发):IT0 = 1
可以通过定时/计数器控制寄存器TCON编程选择。
//初始化一个外部中断0
void Int0Init(){
EA=1;//打开中断总开关
EX0=1;//允许中断0开启
IT0=1;//触发方式为下降沿
}
//外部中断处理函数
void Int0_Routine(void) interrupt 0{
//触发中断之后要做的事情
}
定时器中断
定时器控制寄存器TCON
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
---|---|---|---|---|---|---|---|
TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
TR0:定时器0的控制位,TR0=1,表示开启。TR0=0,表示关闭。
TR1:定时器1的控制位,TR1=1,表示开启。TR1=0,表示关闭。
TF0:定时器0溢出标志位,
TF1:定时器1溢出标志位,
IE0、IE1,外部中断标志位
定时器模式寄存器TMOD
控制使用定时器的模式,高四位是定时器1,低四位是定时器0。
TH0和TL0:设置定时器0的初始值
初始化定时器
void Timer0Init(){
EA=1;//总中断允许控制位
ET0=1;//定时器T0中断控制位
TF0=0;//定时器0溢出标志位
TR0=1;//开启定时器0
TMOD &= 0xF0;//设置定时器模式
TMOD |= 0x01;//设置定时器模式
//定时器初始值
TL0=0x66;
TH0=0xFC;
}
//定时器中断程序
void Timer0_Routine() interrupt 1{
// T0count 控制时间
static unsigned int T0count;
TL0=0x66;
TH0=0xFC;
T0count++;
if(T0count>1000){
T0count=0;
//要做的事情
}
}
串口中断
串行口控制寄存器(SCON)
串行口的接收发送数据中断请求标志位(RI和TI)
TI:串行口发送中断请求标志位。CPU每发送一帧数据,硬件置位1(TI=1),但是中断被响应时,需要在中断服务程序中通过软件对TI清零
RI:串行口接受中断请求标志位。每接收一帧数据,硬件置位1(TI=1),但是中断被响应时,一样需要在中断服务程序中通过软件对TI清零
串行口中断不能由硬件自动清除中断请求标志位,需要用户通过软件进行控制清零。
出口初始化
void UartInit(void) //4800bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x20; //设置定时器模式
TL1 = 0xFA; //设置定时初始值
TH1 = 0xFA; //设置定时重载值
ET1 = 0; //禁止定时器中断
TR1 = 1; //定时器1开始计时
EA=1;
ES=1;
}
//发送一个字节数据
void UART_SendByte(unsigned char Byte){
SBUF=Byte;
//检测发送是否完成
while(TI==0);
TI=0;//TI复位
}
//发送字符串
void SendString(unsigned char *p)
{
while(*p)
{
UART_SendByte(*p);
p++;
}
}
//接收数据
void UART_Routine() interrupt 4
{
//接收中断
if(RI==1){
P2=SBUF;//显示LED
UART_SendByte(SBUF);//将数据发回电脑
RI=0;//复位
}
}