【51】中断系统与定时器,配置理论和c51代码

本文详细介绍了单片机中TCON、IE、IP和TMOD等定时器/计数器寄存器的功能及配置,提供了定时器配置函数和中断函数的实例,强调了中断优先级和中断号在编程中的重要性。
摘要由CSDN通过智能技术生成

目录

一、相关寄存器介绍

1. TCON (Timer control) 定时器/计数器控制寄存器

2. IE (Interrupt Enable) 中断允许寄存器

3. IP (Interrupt Priority) 中断优先级控制寄存器

4. TMOD (Timer Mode) 定时器/计数器工作方式寄存器(图中未展示)

二、配置代码实例

1. 定时器配置函数

2. 中断函数(在定时结束时执行中断操作)

3. 中断号


一、相关寄存器介绍

e9a9a1f0ed5e49b0aaf1b7c446632cfd.png

 中断系统示意图

上图中关键符号含义(从左到右):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表示外部中断

功能定时/记数
位序号7654
位符号TF1(Timer Flag1)TR1(Timer Control1)TF0TR0

含义

T1溢出标志位T1控制位T0溢出标志位T0控制位

状态

TF1=1:

T1产生中断

(由硬件控制)

TR1=1:

T1开始运行

TF0=1:

T0产生中断

(由硬件控制)

TR0=1:

T0开始运行

功能外部中断
位序号3210
位符号

IE1 (Interrupt Enable 1)

IT1(Timer interrupt Type control)IE0IT0
含义外部中断INT1请求中断标志位INT1触发方式控制位INT0请求中断标志位INT0触发方式控制位
状态

IE1=1:

INT1有中断产生

(由硬件控制)

IT1=1:

INT1为下降沿触发方式

IT1 = 0:

电平触发方式,INT1为低电平时有效

IE0=1:

INT0有中断产生

(由硬件控制)

IT0=1:

INT0为跳变沿触发方式

2. IE (Interrupt Enable) 中断允许寄存器

位序号7654
位符号EA (Enable All)--ES (Enable serial)

含义

总允许位--串行口总允许位

状态

EA=1:

CPU开放中断

--

ES=1:

允许串口中断

位序号3210
位符号ET1 (Enable Timer 1)EX1 (Enable exterior)ET0EX0
含义T1溢出中断允许位INT1允许位T0溢出中断允许位INT0允许位
状态

ET1=1:

允许T1中断

EX1=1:

允许INT1中断

ET0=1:

允许T0中断

EX0=1:

允许INT0中断

由上表看到:IE寄存器的每个位寄存器都是高电平允许中断

3. IP (Interrupt Priority) 中断优先级控制寄存器

 

位序号76543210
位符号--PT2PSPT1PX1PT0PX0

由中断系统结构图:置1时优先级高(如配置为:IP=0x01,此时INT0的中断优先级最高)

4. TMOD (Timer Mode) 定时器/计数器工作方式寄存器(图中未展示)

 

控制对象T1
位序号7654
位符号GATEC/TM1M0

含义

门控制记数模式或计时模式工作方式配置位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
位序号3210
位符号GATEC/TM1M0

其中,工作方式配置位M1、M0具体规则如下:

9ef2133e98db4bf89876f3cc030e079d.png

在实际使用中,还需要注意:

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"

a7f032309f94449d9694377e0f021c23.png

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取反
    }
}

程序执行流程:

  1. 定时器配置,计数器开始记数
  2. 计数器数据溢出,跳转到中断程序
  3. 中断程序开始执行,首先重新设定了定时初值,用变量count记数+1,同时定时器从定时初值开始计时,直到下一次溢出跳转到中断程序,重新设定定时初值,变量count记数+1……循环至变量count记数=1000(若定时器定时1ms,则达到时间1s时执行if语句)
  4. 变量count重置(重新开始计时1s),引脚P2.0状态变化

注: “ 变量T0Count ”  定义时使用的语句是“static unsigned int T0Count ”

表示将其定义为“局域静态变量”,局域相对于全局(在函数内即局域,外则全局),仅在调用该函数时进行定义,但若只是定义为“局域变量”,在执行完该函数后就会被抹除,再次定义时就会被重置,不能行使该代码段想要的记数作用

        此外,对于局部变量,一定要在定义后进行赋值,因为局部变量只定义不赋值时可能为任意值,而对于全局变量,定义时默认为0

3. 中断号

上文中的 "interrupt 1" 是“中断号”,加了中断号就表明该函数是对应类型的中断函数

中断号与中断类型一一对应,如:0和2是外部中断的中断号、1和3是定时器、4是串口

(函数名可自由命名)

78cae0b91fd247c8ac330a4e67acb2f1.png

另外,定时器的配置可以进行模块化,此时对应的中断函数可以直接注释掉,需要调用时再复制到主函数使用

因为一般在中断函数中执行的操作还需要调用其他模块的函数,那就要声明相应函数的头文件;但是,相比于在定时器模块内添加对应的头文件,在主函数内添加更加稳定、简易、不容易出错。 如下图:

5ca9d6b47ec04228b6aee0e7b165d8dc.png

注意:中断函数中停留的时间不要太久,以免影响计时精度

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zosea231

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值