普中51 单片机中断
51 单片机一定有的5 个中断,序号为各自的中断号,按优先级从高到低排序依次为:
0----INT0:外部中断0;1---T0:定时/计数器0;2---INT1:外部中断1;3---T1:定时/计数器1;4---RXD 和TXD:串行口中断
IE寄存器:控制中断,IE寄存器有8位,IE={EX0,ET0,EX1,ET1,ES, , ,EA},其中每一位分别控制:
EX0---INT0(外部中断0);ET0---T0(定时/计数器T0);EX1---INT1(外部中断1);ET1---T1(定时/计数器T1);
ES---RXD\TXD(串行口中断);空;空;EA---总开关(当EA置1时,其他的才有效)
TCON寄存器:控制中断方式以及中断标志位,TCON={IT0,IE0,IT1,IE1,TR0,TF0,TR1,TF1},其中每一位分别表示:
IT0---IT0=0 时为电平触发,IT0=1 时为下降沿触发(一般选用1);eg:IT1同理
IE0---INT0(外部中断0)中断标志;eg:IE1同理
TR0---定时/计数器T0控制;eg:TR0同理
TF0----定时/计数器T0溢出中断标志;eg:TF1同理
INT0和INT1外部中断:
工作原理:出现中断信号时,中断标志置1,CPU 执行中断函数。
外部中断配置:INT0对应P3.2(INT1为P3.3),IT0选择触发方式(一般置1,选择下降沿触发),EX0置1允许CPU识别INT0中断,EA置1中断总开关打开。
当P3.2 出现中断信号时,中断标志IE0置1,CPU 执行中断函数:void 自定义函数名() interrupt 0(eg:interrupt 是关键字,后面的“0”是中断号)。
void Int0Init()
{
//初始化INT0
IT0=1;//跳变沿出发方式(下降沿)
EX0=1;//打开INT0 的中断允许。
EA=1;//打开总中断
}
void Int0() interrupt 0 //INT外部中断0的中断函数
{
//中断程序
}
void main()
{
Int0Init(); // INT外部中断0初始化函数
while(1);
}
定时/计数器中断:
工作原理:首先设置定时/计数器初始值,定时/计数器启动后每来一个脉冲,计数器就自动加1,当加到计数器为全1 时再输入一个脉冲就使计数器回零,且计数器的溢出使相应的中断标志位置1,向CPU 发出中断请求。
TMOD寄存器:设置定时/计数器的工作方式,TMOD={M0,M1,C/T,GATE,M0,M1,C/T,GATE},低四位用于T0,高
四位用于T1:
GATE---控制定时器的启动是否受外部中断源信号的影响。GATE=0,TR0/TR1 =1时,启动定时/计数器工作;
GATA=1,TR0/TR1 =1时,需外部中断引脚INT0/1 也为高电平才能启动定时/计数器工作。
C/T---0为定时模式;1为计数模式。
M1/M0---工作方式设置位。定时/计数器有四种工作方式: 00--方式0--13位定时/计数器,TL0 的低5 位(高3 位未用)和TH0 的8 位组成。 01--方式1--16位定时/计数器,TL0 的8 位和TH0 的8 位组成。 10--方式2--8位自动重装定时/计数器,TL0 的8 位满了后自动归零溢出。 11--方式3--只适用于定时/计数器T0,将T0 分成为两个独立的8 位计数器TL0 和TH0。 eg:这几种工作方式中应用较多的是方式1 和方式2。定时器中通常使用定时器方式1,串口通信中通常使用方式2。
定时/计数器中断配置:
1.对TMOD 赋值,确定T0 和T1 的工作方式。例如:TMOD|=0X01;//选择为定时器0 模式,工作方式1,仅用TR0 打开启动。
2.设置初值,写入TH0、TL0 或TH1、TL1。例如:定时1ms,机器周期=12/12M=1us,1ms/1us=1000,初值=65535-1000+1=64536=FC18H,所以初值即为THx=0XFC,TLx=0X18。
3.对IE寄存器赋值,开放定时器。例如:ET0=1,EA=1.
4.使TR0 或TR1 置位,启动定时/计数器定时或计数。
void Timer0Init()//初始化设置定时器
{
TMOD|=0X01;//选择为定时器0 模式,工作方式1,仅用TR0 打开启动。
TH0=0XFC; //给定时器赋初值,定时1ms
TL0=0X18;
ET0=1;//打开定时器0 中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
}
来源:https://blog.csdn.net/wu514430901/article/details/98884485