蓝桥杯单片机03——中断定时器

1、中断

上图即为中断过程示意图,产生中断的请求源被称为中断源,中断源向CPU提出的处理请求被称为中断请求中断申请。CPU暂时中止当前的事件,转去处理中断请求所对应的事件称为CPU的中断响应过程,对事件的整个处理过程称为中断服务(中断处理)。处理完毕后,返回到原先被中止的地方称为中断返回

80C51中断系统结构:

80C51的终端系统有5个中断源(52有6个),两个优先级,可以实现二级中断嵌套。

2、51单片机的定时/计数器
    51单片机有两个定时/计数器T0和T1,为16位可编程计数器,定时器的实质是加1计数器(16位),由低8位和高8位两个寄存器组成,最大计数值为65535个计数脉冲。
该加1计数器的计数脉冲来源有2个:
    <1> 系统时钟振荡器输出的12分频。
    <2> T0或T1引脚输入的外部脉冲信号。
    每接收到一个计数脉冲,计数器就会加1,当计数值累计至全为1时(8位255,13位8191,16位65535),再输入一个计数脉冲,计数器便会溢出回零,并且计数器的溢出是TCON寄存器的TF0或TF1位置1,同时向内核提出中断请求。如果定时/计数器工作于定时模式,则表示间隔定时时间到,如果工作与计数模式,则表示计数值已满。
    假设单片机的外部晶振为12MHz,那么,经过12分频后输入计数器的计数脉冲为1MHz,即每个脉冲的周期为1us。因此定时器T0的16位工作模式最大的定时时间为65535us,65.5ms。如果要定时10ms的话,计数器就不能够从0开始计数了,必须给它一个计数初值。怎么计算这个初值呢?
    要定时10ms,则相当于计数10000个脉冲后计数器的值就到达65535了,那么开始计数的这个地方就是计数初值。
    65535 - 10000 = 55535 = 0xd8ef
    把这个计算得到的初值写入TH0和TL0寄存器即可:
    TH0 = 0xd8;或者 TH0 = (65535 - 10000) / 256;
    TL0 = 0xef;    或者 TL0 = (65535 - 10000) % 256;

3、定时/计数器相关的寄存器
    与定时/计数器相关的寄存器除了计数初值寄存器THx和TLx之外,就是TMOD寄存器和TCON寄存器,务必掌握。
    <1> TMOD模式控制寄存器,不能进行位寻址,只能字节操作。

扫描二维码关注公众号,回复: 5130241 查看本文章

    <2> TCON中断标志寄存器



4、定时/计数器的编程思路
    在定时/计数器的程序设计中,通常有两个函数:初始化函数中断服务函数
    在初始化函数中,一般需要进行以下几个配置:
    <1> 配置工作模式,即对TMOD寄存器编程。
    <2> 计算技术初值,即对THx和TLx寄存器进行赋值。
    <3> 使能定时/计数器中断,即ET0或ET1置1。
    <4> 打开总中断,即EA =1。
    <5> 启动定时器,即TR0或TR1置1。
    在中断服务函数中,一般需要进行以下的编程:
    <1> 如果不是自动重装模式,需要对THx和TLx重新赋值。
    <2> 进行间隔定时到达的逻辑处理(越少越好)。

 代码实现:

定时器0:

#define N 50000   //N代表计时器中断发生的时间,当N=50000时,中断每50ms发生一次

/*初始化函数*/
void Init()
{
      TMOD = 0x01;                   
      TH0 = (65536 - N) / 256;    
      TL0 = (65536 - N) % 256;

      EA = 1;                        
      ET0 = 1;                       
      TR0 = 1;                       
}

/*中断函数*/
void Timer_0() interrupt 1
{
      TH0 = (65536 - N) / 256;    
      TL0 = (65536 - N) % 256;


}

猜你喜欢

转载自www.cnblogs.com/happy2019/p/10320217.html