中断
使单片机能对外部或者内部随机发生的事件实时处理。
分时操作,实时响应,可靠性高。
中断相应条件:①中断源有中断请求;②中断源的中断允许位为1;③CPU 开中断(EA=1)。
代码编写:主程序中需要包含:
EA=1;//总中断开关:打开
EX0=1;//外部中断0开关:打开。
IT0=0/1;//外部中断触发方式的选择。如下降沿触发,或低电平触发。
//如果要配置外部中断1,则改为EX1和IT1//中断服务函数
void int0() interrupt 0 using 1
{}
interrupt 是关键字,代表中断。0代表是外部中断,using 1 可省略。如果是外部中断1,interrupt后面是2.
外部中断实验
运行程序前,请摘下红外接收传感器。因为共用P3^2引脚,会干扰实验结果。
51单片机都有2个外部中断。STC89C5X系列有INT0~INT3四个。
对于三个参数的初始化,一般用一个init函数执行,在main的最开头。
本例中,我们用按键3作为外部中断源。按下按键3就会产生中断。中断执行的指令就是点亮或熄灭LED灯。
#include "reg52.h"
sbit LED=P2^0;
sbit KEY3=P3^2;
void delay(int ten_us)
{
while(ten_us--);
}
void interrupt_init(){EA=1;//总中断开关:打开EX0=1;//外部中断0开关:打开。IT0=1;//外部中断触发方式的选择。如下降沿触发,或低电平触发。
}void int0() interrupt 0{delay(1000);if(KEY3==0){LED=!LED;}
}void main(){interrupt_init();while(1){}
}
定时器中断实验
本章利用单片机自带的定时器来实现之前做过的操作:LED灯间歇闪烁。一直以来实现的方法都是借助while循环来拖延时间。
CPU时序的相关知识
振荡周期:为单片机提供信号的振荡源的周期(晶振周期)。
状态周期:两个振荡周期=1状态周期s(时钟周期)。
机器周期:6状态周期=1机器周期。
指令周期:完成一条指令所用的全部时间,以机器周期为单位。
定时器的相关知识
定时器又可以计数,也叫计数器。不需要CPU参与自己就能完成任务,根据脉冲信号对寄存器中数据+1。来一个脉冲定时器+1,加到全为1后输出一个脉冲并归0.同时,向CPU发出计时器中断信息。
因此比如之前的delay函数就交给定时器来就行,CPU可以腾出来处理其他。
开启定时器计数功能及总中断:
void time0_init(void)
{TMOD|=0X01;//选择为定时器 0 模式,工作方式 1TH0=0XFC; //给定时器赋初值,定时 1msTL0=0X18;ET0=1;//打开定时器 0 中断允许EA=1;//打开总中断TR0=1;//打开定时器
}
要使用定时器1,把0变成1就好。
LED灯间隔1s闪烁代码(以12M晶振为例):
#include "reg52.h"
sbit LED=P2^0;
void time0_init(void)
{TMOD|=0X01;//选择为定时器 0 模式,工作方式 1TH0=0XFC; //给定时器赋初值,定时 1msTL0=0X18;ET0=1;//打开定时器 0 中断允许EA=1;//打开总中断TR0=1;//打开定时器
}
void time0() interrupt 1{static int i;TH0=0XFC; //给定时器赋初值,定时 1msTL0=0X18;i++;if(i==1000){i=0;LED=!LED;}
}
void main(){time0_init();while(1){}
}