中断概念
-
51单片机内部一共有5个中断源,即有5种情况发生时,会使单片机去处理中断程序
-
52单片机内部一共有6个中断源
INT0— 外部中断 0, 由 P3.2 端口线引入, 低电平或下降沿引起。 INT1— 外部中断 1, 由 P3.3 端口线引入, 低电平或下降沿引起。 T0一定时器/计数器 0 中断, 由T0 计数器计满回零引起。 T1一定时器/计数器 1 中断, 由 T1 计数器计满回零引起。 T2一定时器/计数器 2 中断, 由 T2 计数器计满回零引起。 TI/ RI—串行口中断, 串行端口完成一帧字符发送/接收后引起。
-
中断嵌套
-
若单片机正在处理一个中断程序时,又有另一个中断发生,单片机会停止当前的中断程序,而转去处理新的中断程序,新中断程序处理完后再回到刚刚停止的中断程序处继续执行,而后再返回主程序处继续执行
中断优先级 -
当同时有两个中断出现,单片机会先去处理中断优先级高的中断 52单片机中端级别
-
单片机的定时器中断
- 单片机51单片机内部共有两个16位可编程的定时器/计数器,即定时器T0和定时器T1。52单片机内部多一个T2定时器/计数器。它们既有定时功能又有计数功能,通过设置与它们相关的特殊功能寄存器可以选择启用定时功能或计数功能。需要注意的是,这个定时器系统是单片机内部一个独立的硬件部分,它与CPU和晶振通过内部某些控制线连接并相互作用,CPU一旦设置开启定时功能后,定时器便在晶振的作用下自动开始计时,当定时器的计数器计满后,会产生中断,即通知CPU该如何处理。
- 知识点:中断服务程序的写法 C51的中断函数格式如下:
void 函数名()interrupt 中断号 using 工作组 { 中断服务程序内容 } 中断函数不能返回任何值,所以最前面用void;后面紧跟函数名,名字可以随便起,但不要与C语言中的关键字相同;中断函数不带任何参数,所以函数名后面的小括号内为空;中断号是指单片机中几个中断源的序号。这个序号是编译器识别不同中断的唯一符号,因此在写中断服务程序时务必要写正确;最后面的"using工作组”是指这个中断函数使用单片机内存中4组工作寄存器中的哪一组,C51编译器在编译程序时会自动分配工作组,因此最后这句话我们通常省略不写,但大家以后若遇到这样的程序代码时要知道是什么意思。一个简单中断服务程序写法如下:
voidT1_time()interrupt3 { TH1=(65536-10000)/256; TL1=(65536-10000)%256; }
- 上面这个代码是一个定时器1的中断服务程序,定时器1的中断序号是3,因此我们要写成interrupt3,服务程序的内容是给两个初值寄存器装入新值。 在写单片机的定时器程序时,在程序开始处需要对定时器及中断寄存器做初始化设置,通常定时器初始化过程如下:
① 对TMOD赋值,以确定T0和T1的工作方式。
② 计算初值,并将初值写入TH0、TL0或TH1、TL1。
③ 中断方式时,则对IE赋值,开放中断。
④ 使TR0或TR1置位,启动定时器/计数器定时或计数。
定时中断
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit led1=P0^0;
uchar num;
void main(){
TMOD=0x01; //设置定时器0为工作方式1(M1M0为01)
TH0=(65536-45872)/256; //装初值11.0592M晶振定时50ms数为45872
TL0=(65536-45872)%256;
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
while(1);
}
void T0_time()interrupt 1{
TH0=(65536-45872)/256; //重装初值
TL0=(65536-45872)%256;
num++; //num每加1次判断一次是否到20次
if(num==8){ //若到了20次,说明1秒时间到
num=0; //将num清空
led1=~led1; //让发光二极管状态取反
}
}