目录
1. TCON (Timer control) 定时器/计数器控制寄存器
2. IE (Interrupt Enable) 中断允许寄存器
3. IP (Interrupt Priority) 中断优先级控制寄存器
4. TMOD (Timer Mode) 定时器/计数器工作方式寄存器(图中未展示)
一、相关寄存器介绍
中断系统示意图
上图中关键符号含义(从左到右):INT0 : 外部中断0、T0 : 定时器0、INT1 : 外部中断1、T1 : 定时器1、RX : 串口接收(P3.0)、TX : 串口发送(P3.1)、TCON : 定时器/计数器控制寄存器、IE : 中断允许寄存器、IP : 中断优先级控制寄存器
1. TCON (Timer control) 定时器/计数器控制寄存器
注意:下文统一用"T"表示"Timer/Counter",即定时器或计数器,用INTx表示外部中断
功能 | 定时/记数 | |||
---|---|---|---|---|
位序号 | 7 | 6 | 5 | 4 |
位符号 | TF1(Timer Flag1) | TR1(Timer Control1) | TF0 | TR0 |
含义 | T1溢出标志位 | T1控制位 | T0溢出标志位 | T0控制位 |
状态 | TF1=1: T1产生中断 (由硬件控制) | TR1=1: T1开始运行 | TF0=1: T0产生中断 (由硬件控制) | TR0=1: T0开始运行 |
功能 | 外部中断 | |||
位序号 | 3 | 2 | 1 | 0 |
位符号 | IE1 (Interrupt Enable 1) | IT1(Timer interrupt Type control) | IE0 | IT0 |
含义 | 外部中断INT1请求中断标志位 | INT1触发方式控制位 | INT0请求中断标志位 | INT0触发方式控制位 |
状态 | IE1=1: INT1有中断产生 (由硬件控制) | IT1=1: INT1为下降沿触发方式 IT1 = 0: 电平触发方式,INT1为低电平时有效 | IE0=1: INT0有中断产生 (由硬件控制) | IT0=1: INT0为跳变沿触发方式 |
2. IE (Interrupt Enable) 中断允许寄存器
位序号 | 7 | 6 | 5 | 4 |
---|---|---|---|---|
位符号 | EA (Enable All) | - | - | ES (Enable serial) |
含义 | 总允许位 | - | - | 串行口总允许位 |
状态 | EA=1: CPU开放中断 | - | - | ES=1: 允许串口中断 |
位序号 | 3 | 2 | 1 | 0 |
位符号 | ET1 (Enable Timer 1) | EX1 (Enable exterior) | ET0 | EX0 |
含义 | T1溢出中断允许位 | INT1允许位 | T0溢出中断允许位 | INT0允许位 |
状态 | ET1=1: 允许T1中断 | EX1=1: 允许INT1中断 | ET0=1: 允许T0中断 | EX0=1: 允许INT0中断 |
由上表看到:IE寄存器的每个位寄存器都是高电平允许中断
3. IP (Interrupt Priority) 中断优先级控制寄存器
位序号 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
位符号 | - | - | PT2 | PS | PT1 | PX1 | PT0 | PX0 |
由中断系统结构图:置1时优先级高(如配置为:IP=0x01,此时INT0的中断优先级最高)
4. TMOD (Timer Mode) 定时器/计数器工作方式寄存器(图中未展示)
控制对象 | T1 | |||
---|---|---|---|---|
位序号 | 7 | 6 | 5 | 4 |
位符号 | GATE | C/T | M1 | M0 |
含义 | 门控制 | 记数模式或计时模式 | 工作方式配置位1 | 工作方式配置位0 |
状态 | 若GATE=0,则: TR1=1时允许T1开始计数 TR1=0时禁止T1计数。 若GATE=1,则: TR1=1且INT1=1时,允许T1计数。 | C/T=1 : 计数器模式: 对来自输入引脚T0(P3.4)和T1(P3.5)的外信号脉冲进行计数 C/T=0 : 定时器模式: 对内脉冲f进行计数 | 常用工作模式1(16位计时计数器),即配置: M1=0,M0=1 | |
控制对象 | T0 | |||
位序号 | 3 | 2 | 1 | 0 |
位符号 | GATE | C/T | M1 | M0 |
其中,工作方式配置位M1、M0具体规则如下:
在实际使用中,还需要注意:
TCON、IP是可“位寻址”寄存器,可以独立地、分别对包含的位寄存器进行赋值(同上文的寄存器P2)
(如配置 :"IT0=1;")
而TMOD是不可位寻址寄存器,进行配置时,只能视作整体来赋值
(如配置:"TMOD=0x01; //0000 0001" 即:按顺序(高位→低位)分别配置了8个位寄存器)
二、代码实例
1. 定时器配置函数
//配置示例1
void Timer0_Init()
{
TMOD = 0x01; //0000 0001 配置为16位计时器(工作方式1)
TF = 0; //清空溢出标志位(一般也会默认0)
TR0 = 1; //允许T1开始记数
TH0 = 64535/256; //取高8位
TL0 = 64535%256; //取低8位
//记数的范围是65535,每隔1us记数+1,故总时间为65535us,这里设定时间1ms
ET0 = 1; //允许定时器0中断
EA = 1; //允许总中断
PT0 = 0; // 配置优先级(一般也会默认0)
}
上述代码中语句'TMOD = 0x01;' ,为了避免定义定时器0时将定时器1的状态覆写,还可改写为:
TMOD & = 0xF0; //把TMOD低4位清零,高4位保持不变
TMOD | = 0x01; //把TMOD第0位置1,高4位保持不变
在软件STC-LSP中,可自动生成定时器配置代码,要注意:
- 注意参数配置!包括系统频率、定时器、定时器模式、定时器时钟(6T模式在左侧菜单“硬件选项”)
- 另外,对于89C52,还要把“ AUXR&=0x7F; ” 语句也删除,否则报错(此版本头文件中没有定义)
- 此外,还要追加对中断允许寄存器IE的配置(若中断层数较高,还有中断优先级控制寄存器IP),如加入“ET0=1; EA=1; PT0=0"
2. 中断函数(在定时结束时执行中断操作)
//中断效果:每1s对引脚P2.0取反
void Timer0_Routine() interrupt 1
{
static unsigned int count;
TL0 = 0x18;
TH0 = 0XFC;
count++;
if(count >= 1000)
{
count = 0;
P2_0 = ~P2_0; //对引脚P2.0取反
}
}
程序执行流程:
- 定时器配置,计数器开始记数
- 计数器数据溢出,跳转到中断程序
- 中断程序开始执行,首先重新设定了定时初值,用变量count记数+1,同时定时器从定时初值开始计时,直到下一次溢出跳转到中断程序,重新设定定时初值,变量count记数+1……循环至变量count记数=1000(若定时器定时1ms,则达到时间1s时执行if语句)
- 将变量count重置(重新开始计时1s),引脚P2.0状态变化
注: “ 变量T0Count ” 定义时使用的语句是“static unsigned int T0Count ”
表示将其定义为“局域静态变量”,局域相对于全局(在函数内即局域,外则全局),仅在调用该函数时进行定义,但若只是定义为“局域变量”,在执行完该函数后就会被抹除,再次定义时就会被重置,不能行使该代码段想要的记数作用
此外,对于局部变量,一定要在定义后进行赋值,因为局部变量只定义不赋值时可能为任意值,而对于全局变量,定义时默认为0
3. 中断号
上文中的 "interrupt 1" 是“中断号”,加了中断号就表明该函数是对应类型的中断函数
中断号与中断类型一一对应,如:0和2是外部中断的中断号、1和3是定时器、4是串口
(函数名可自由命名)
另外,定时器的配置可以进行模块化,此时对应的中断函数可以直接注释掉,需要调用时再复制到主函数使用
因为一般在中断函数中执行的操作还需要调用其他模块的函数,那就要声明相应函数的头文件;但是,相比于在定时器模块内添加对应的头文件,在主函数内添加更加稳定、简易、不容易出错。 如下图:
注意:中断函数中停留的时间不要太久,以免影响计时精度