51单片机中断
单片机的中断简介 52单片机一个有6个中断源,它们的符号,名称以及触发方式如下:
中断源 | 默认中断优先级 | 序号(C语言) | 入口地址(汇编) |
---|
外部中断0(INT0) | 最高 | 0 | 0003H | 定时器/计数器T0中断 | 第2 | 1 | 000BH | 外部中断1(INT1) | 第3 | 2 | 0013H | 定时器/计数器T1中断 | 第4 | 3 | 001BH | 串口中断 | 第5 | 4 | 0023H | 定时器/计数器T1中断 | 最低 | 5 | 002BH |
中断相关寄存器
IE寄存器
bit | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
---|
name | EA | - | ET2 | ES | ET1 | EX1 | ET0 | EX0 |
EA:CPU的总中断允许控制位,EA=1,CPU开放中断,EA=0,CPU屏蔽所有的中断申请。 (EA的作用是使中断允许形成两级控制。即各中断源首先受EA控制;其次还受各中断源自己的中断允许控制位控制) ET2:定时/计数器T2的溢出中断允许位。ET2=1,允许T2中断:ET2=0,禁止T2中断。 ES ∶串行口1中断允许位。ES=1,允许串行口1中断;ES=0,禁止串行口1中断。 ET1∶定时/计数器T1的溢出中断允许位。ET1=1,允许T1中断;ET1=0,禁止T1中断。 EX1:外部中断1中断允许位。EX1=1,允许外部中断1中断;EX1=0,禁止外部中断1中断。 ET0 :T0的溢出中断允许位。ET0=1,允许T0中断;ET0=0禁止T0中断。 EX0:外部中断0中断允许位。EX0=1,允许中断:EX0=0禁止中断。
IP寄存器
bit | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
---|
name | - | - | PT2 | PS | PT1 | PX1 | PT0 | PX0 |
PX0:外部中断0优先级设定位。PX0=1设置外部中断0为高优先级;PX0=0设置外部中断0为低优先级。
PT0:定时/计数器T0优先级设定位。PT0=1设置定时/计数器T0为高优先级;PT0=0设置定时/计数器T0为低优先级。
PX1:外部中断1优先级设定位。PX1=1设置外部中断1为高优先级;PX1=0设置外部中断1为低优先级。
PT1:定时/计数器T1优先级设定位。PT1=1设置定时/计数器T0为高优先级;PT1=0设置定时/计数器T1为低优先级。
PS :串行口优先级设定位。PS=1设置串行口为高优先级;PS=0设置串行口为低优先级。
PT2:定时/计数器T2优先级设定位。PT2=1设置定时/计数器T2为高优先级;PT2=0设置定时/计数器T2为低优先级。
TCON寄存器
bit | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
---|
name | TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
TF1:T1溢出中断标志。T1被允许计数以后,从初值开始加1计数。当产生溢出时由硬件置 “1”TF1,向CPU请求中断,一直保持到CPU响应中断时,才由硬件清“0”(也可由查询软件清“0”)。 TRl:定时器1的运行控制位。 TF0:T0溢出中断标志。T0被允许计数以后,从初值开始加1计数,当产生溢出时,由硬件置 “1”TF0,向CPU请求中断,一直保持CPU响应该中断时,才由硬件清0(也可由查询软什清0)。 TR0:定时器0的运行控制位。 IE1:外部中断1请求源(INT1/P3.3)标志。IE1=1,外部中断向CPU请求中断,当CPU响应该 中断时由硬件清“0”IE1。 IT1:外部中断1中断源类型选择位。IT1=0,,INT1/P3.3引脚上的低电平信号可触发外部中断 1。IT1=1,外部中断1为下降沿触发方式。 IE0:外部中断0请求源(INTO/P3.2)标志。IE0=1外部中断0向CPU请求中断,当CPU响应外 部中断时,由硬件清“0”IEO(边沿触发方式)。 IT0:外部中断0中断源类型选择位。IT0=0,INT0/P3.2引脚上的低电平可触发外部中断0。 IT0=1,外部中断0为下降沿触发方式。
定时器中断
51单片机内部有两个16位可编程的定时计数器,而52单片机有三个定时计数器相比于51单片机内部多了一个T2定时计数器。 单片机里面的定时器和计数器其实是同一个元器件,只是他们的脉冲来源不同,计数器记录的是单片机外部发生的事件(指外部事件触发时引起的外部脉冲),而定时器则时由单片机自身提供或外部焊接的晶振电路提供的一个频率非常稳定的脉冲;如:51单片机的晶振经过12分频之后共给单片机的只有1MHZ稳定脉冲;12MHZ/12=1MHZ=1000000次/秒=1000000条指令/秒=1000000次/1000000微秒=1次/微秒=1条指令/微秒;也就是说,晶振振荡一次,就会给单片机提供一个时钟脉冲,花费的时间是1微秒,此时,CPU会执行一条指令,经历一个机器周期;即:1个时钟脉冲=1个机器周期=1微秒=1条指令。
TMOD:定时计数器工作方式设置寄存器
由上图可知,TMOD的高四位是设置定时计数1的,低四位是设置定时计数0的。 GATE————门控制位。 GATE=0,定时器/计数器启动与停止仅受TCON寄存器中TRX (X=0,1)来控制。 GATE=1,定时器/计数器启动与停止由TCON寄存器中TRX (X=0,1)和外部中断引脚( INTO或INT1)上的电平状态来共同控制。 C/T————定时器模式和计数器模式选择位。 C/T=1,为计数器模式; C/T=0,为定时器模式。 M1M2————工作方式选择位
计算定时器初值
晶振 :12MHZ 时钟周期 :1/12MHZ(单位秒) 机器周期 : 51单片机经过12分频,12/12MHZ=1us 因为定时器是每个机器周期加1所以定时器加N次之后产生溢出中断的时间就是N微妙。 我们现在选择定时器的工作模式为方式1,16位定时计数器能设定的最大值位65536 初值 = 65536 - N (N为你想要定时的时间) 例如 : 需要定时的时间为50ms = 0.05s =50000us N的值就等于50000 65536-50000=15536=0x3CB0
TL0 = 0xB0; //设置定时初值
TH0 = 0x3C; //设置定时初值
除了手算我们还有更简单的方法比如用 stc-isp-15xx-v6.87F.exe软件里面可以自动生产定时器代码(提取码:zxcv) 链接:https://pan.baidu.com/s/1TrgDcdIowktFhDYOEhwEMw 提取码:zxcv :系统频率选择 12MHZ :时间长度 50ms :选择定时器0 :定时器模式选择16位(16位没有自动重载,因为不会自动重载所以在每次发生溢出中断后我们都要给TL0,TH0重新赋值) :定时器时钟选择12T :AUXR寄存器我们在51单片机中用不到直接注释就可以
中断服务程序写法
C51中断函数格式:
void 函数名()interrupt 中断号 using 工作组
{
中断服务程序内容
}
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit led = P0^0;
uchar num = 0;
void Timer0Init(void)
{
TMOD &= 0xF0;
TMOD |= 0x01;
TL0 = 0xB0;
TH0 = 0x3C;
TF0 = 0;
TR0 = 1;
EA = 1;
ET0 = 1;
}
void main()
{
Timer0Init();
while(1)
{
if (num >= 20)
{
num = 0;
led = ~led;
}
}
}
void T0_time() interrupt 1
{
TL0 = 0xB0;
TH0 = 0x3C;
num++;
}
|