1.什么是中断:
CPU在执行主程序的过程中,外部设备向CPU发出请求信号,CPU暂时中断主程序去执行另一程序
2.中断系统的结构:
3.优先级:
- 51单片机有两个中断优先级:高优先级和低优先级
- 每个中断源都可以通过设置中断优先级寄存器IP确定为高优先级中断或低优先级中断,实现二级嵌套。同一优先级别的中断源可能不止一个,因此,也需要进行优先权排队。同一优先级别的中断源采用自然优先级。
- 中断优先级寄存器IP,用于锁存各中断源优先级控制为。IP中的每一位均可由软件来置1或清0,1表示高优先级,0表示低优先级。
4.中断处理过程:
中断响应是指CPU对中断源中断请求的响应。CPU并非任何时刻都能响应中断请求,而是在满足所有中断响应条件,且不存在任何一种中断阻断情况时才会响应。
CPU响应中断的条件有:
- 有中断源发出中断请求;
- 中断总允许位EA置1;
- 申请中断的中断源允许位置1.
CPU响应中断的阻断情况有:
- CPU正在响应同级或更高优先级的中断;
- 当前指令未执行完;
- 正在执行中断返回或访问寄存器IE和IP
中断响应过程就是自动调用并执行中断函数的过程。废话说完了!
常用的中断函数定义语法如下:
void 函数名() interrupt n
n为中断类型号
中断源 | n |
---|---|
外部中断0 | 0 |
定时/计数器0 | 1 |
外部中断1 | 2 |
定时/计数器1 | 3 |
串行口 | 4 |
下面请看实例: | |
定时/计数器1: |
unsigned char num=0;
unsigned char str[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};// 共阴0~9
void initcounter()
{
TMOD=0x60;//注释见下 若为计数器0则TMOD=0x06
TH1=256-1;
TL1=256-1;
ET1=1;//中断源开放
EA=1;//中断开放
TR1=1;//打开定时器 1
}
void display()
{
P2=str[num];
if(num==3)
{
num=0;
}
}
void main()
{
initcounter();
while(1)
{
display();
}
}
void counter_isr() interrupt 3//interrupt 后的数字根据中断源定,上面有表格参考
{
num++;
}
TMOD寄存器初始化
GATE为门控位,用于控制定时/计数器的启动是否受到外部中断请求的影响。置0或1。
C/T:置0为定时,置1为计数
M0,M1表格中有说明
此时我们选择的是定时器1,对应的应为 0 1 1 0 ,0 0 0 0 转换为十六进制则为0x60
最后:P3.2接外部中断0,P3.3接外部中断1,P3.4接定时/计数器0,P3.5接定时/计数器1.