所谓的中断就是:
做事:
在做A事情的时候,被打断去做B事情,回来后再返回继续做A事情。
程序:
在执行A程序的时候,打断转而执行B程序,完成后B程序后继续返回执行A程序。
简而言之,如下:
52单片机一共有6个中断源,他们的符号、名称及产生的条件分别解释如下:
6个中断源中,其默认的中断级别如下:
中断允许寄存器_IE
EA=1;开全局中断
ET2=1;打开T2中断(仅52有T2中断)
ES=1;打开串行口中断
ET1=1;打开T1中断
EX1=1;打开外部中断1中断
EX0=1;打开外部中断0中断
中断优先级寄存器_IP
PS=1;串行口中断定义为高优先级
PT1=1;定时器/计数器1中断定义为高优先级
PX1=1;外部中断1中断定义为高优先级
PT0=1;定时器/计数器0定义为高优先级中断
PX0=1;外部中断0中断定义为高优先级
注意:当以上值为零时,则自然被定义为低优先级中断。
定时器/计数器工作方式寄存器_TMOD
GATE:门控位
C/T:模式选择,计数器方式:C/T=1;定时器模式:C/T=0
M0M1:工作方式选择
每个定时器/计数器均有4种工作方式,其主要有M0M1确定:
定时器/计数器控制寄存器_TCON
TF1:定时器1溢出标志位
当定时器1计数满时,有硬件置位,并申请中断,进入中断后,由硬件自动清零。
备注:使用定时器中断,改为无需人工操作,如使用软件查询的时候,查询到改位为1,徐软件清零。
TR1=1;启动定时器1
TF0;定时器0溢出标志,同TF1。
TR0=1;启动定时器0
IE1;IT1=0时,电平触发,INT1脚为底时置1。IT1=1时,跳变沿触发,第一个机器周期采样INT1为低IE置1
IT1=0;电平触发方式,引脚INTI1上低电平有效
IT1=1;跳变沿触发方式,引脚INTI1上的电平从高到低的负跳变沿有效
IE0;外部中断0请求标志,同IE1
IT0:外部中断0触发方式选择位同IT1。
通常定时器初始化过程如下:
对TMOD赋值,以确定T0和T1的工作方式
计算初值,并将初值写入TH0、TL0和TH1、TL1
中断方式时,则对IE赋值,开放中断
使TR0或者TR1置位,启动定时器/计数器定时或者计数
程序对应如下:
//定时器0工作方式1
TMOD=0X01; //定时器0工作方式1(M1M0为01)
TH0=(65536-45872)/256; //装初值,11.0592MHz晶振定时50ms,数为45872
TL0=(65536-45872)%6;
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
while(1){}; //程序停止在此处等待中断发生
//定时器0工作方式0
TMOD=0X00; //定时器0工作方式0(M1M0为00)
TH0=(8192-4607)/32; //装初值
TL0=(8192-4607)2;
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
while(1){}; //程序停止在此处等待中断发生
备注:(8192-4607)/32对32求模是因为定时器方式0为13位计数器,
计数时只用了TL0的低五位。
五位最多装在32个数,再加1便会进位。与16为计数器装在256个数不同。因此此处对32求模。
//定时器0工作方式2
TMOD=0X02; //定时器0工作方式0(M1M0为02)
TH0=6; //装初值
TL0=6;
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
while(1){}; //程序停止在此处等待中断发生
//定时器0工作方式3
TMOD=0X03; //定时器0工作方式0(M1M0为03)
TH0=6; //装初值
TL0=6;
EA=1; //开总中断
ET0=1; //开定时器0中断
ET1=1; //开定时器1中断
TR0=1; //启动定时器0
TR1=1; //启动定时器1
while(1){}; //程序停止在此处等待中断发生
注:TL0占用定时器T1的中断请求标志,因此为了避免冲突,设计程序时,T0的方式3不可用在有中断的场合。
中断方式的写法:
void T0_time() interrupt 1//定时器0中断
{
}
void T1_time() interrupt 3 //定时器1中断
{
}
定时器T2的介绍
其为16位的定时器计数器。
通过设置特殊功能寄存器T2CON的C/T2位,可以将其设定为定时器或者计数器
通过T2CON中的工作模式选择位,可将定时器2设置为三种工作模式:捕获、自动重新装载、波特率发声器。
捕获:捕捉某一瞬间的值,通常用他来测量外部某个脉冲的宽度或周期,使用捕获功能可以非常准确的测试脉冲宽度和周期。
定时器2控制器存器_T2CON
TF2;定时器2溢出时置位,必须由软件清零,当RCLK=1或TCLK=1时,TF2 将不会置位。
EXF2;当EXEN2=1且T2EX(单片机P1.1口)的负跳变产生捕获或重装时,EXF2置位。
定时器2中断使能时,EXF2=1将是CPU进入定时器2的中断服务程序。
EXF2必须用软件清零。在递增(递减)计数模式(DCEN=1),EXF2不会引起中断
RCLK;接收时钟标志
RCLK=1时,定时器2的溢出脉冲作为串行口模式1或模式3的接收时钟,
RCLK=0时,将定时器1的溢出脉冲作为接收时钟。
TCLK;发送时钟标志
TCLK=1时,定时器2的溢出脉冲作为串行口模式1或模式3的发送时钟,
TCLK=0时,将定时器1的溢出脉冲作为发送时钟。
EXEN2;定时器2外部使能标志
EXEN2=1且定时器2未作为串行口时钟时,允许T2EX的负跳变产生捕获获重装,
EXEN2=0时,T2EX的跳变对定时器2无效
TR2;置1启动定时器,置零停止定时器2
C/T2;T2的定时器/计数器选择位
C/T2=1,外部事件计数器(下降沿触发)
C/T2=0,内部定时器
CP/RL2;捕获重装标志
CP/RL2=1且EXEN2=1,T2EX的负跳变产生捕获
CP/RL2=0且EXEN2=0,定时器2溢出或T2EX的负跳变都可是定时器自动重装,
当RCLK=1或TCLK=1时,该位无效且定时器强制为溢出时自动重装。
定时器/计数器2的三中工作模式
定时器2模式控制寄存器
设定自动重装模式为递增还是递减。
T2OE;定时器2使能输出位
DCEN;向下计数使能位
波特率发声器_T2定时器
寄存器T2CON的TCLK和RCLK允许从定时器1或定时器2获得串行口接收和发送的波特率
TCLK=0,定时器1作为串行口发送波特率发生器
TCLK=1,定时器2作为串行口发送波特率发生器
除了波特率发声器模式,T2CON不包含TR2位的设置,TR2为需要单独设置来启动定时器。