2019-10-08定时器

作者: 嵌入式Linux小白 | 来源:发表于2019-10-09 08:23 被阅读0次

    1.定时器介绍

    1.1、什么是定时器

    (1)Soc(单片机)的一种内部外设
    (2)定时器就是CPU的“闹钟”

    1.2、什么是计数器

    (1)定时器就是用计数的原始实现的
    (2)计数器可以计算外部脉冲个数

    1.3、定时器如何工作

    (1)第1步:先设置好定时器的时钟源(如果需要的话)
    (2)第2步:初始化时钟相关寄存器
    (3)第3步:设置定时时间(计数个数)
    (4)第4步:设置中断处理程序
    (5)第5步:打开定时器
    (6)运行时:定时器计数到后产生中断,然后执行中断isr。

    2.软件控制硬件的关键——寄存器

    2.1、什么是寄存器

    (1)register
    (2)寄存器,寄存,内容可变,一般按位定义。也就是内容要么是1要么是0.
    (3)寄存器使用地址访问,编程上像内存一样

    2.2、寄存器的工作原理

    (1)寄存器和硬件之间有双向影响。寄存器位上的1/0可以控制LED亮灭,键盘的按下也可以改变寄存器位上的1/0。
    (2)软件可以读写寄存器
    (3)总结:寄存器时软件能够控制硬件的关键

    2.3、单片机学习的关键就是各种寄存器

    (1)单片机的学习主要包括2个:CPU和各种内部外设
    (2)各种内部外设的编程接口就是寄存器
    (3)熟悉一款单片机其实就是熟悉他的寄存器
    (4)寄存器会随着单片机的复杂化而变得复杂
    (5)学会用C语言操作寄存器的技巧

    3.51单片机的定时器简介

    看数据手册
    外部12MHZ晶振,单片机工作在12T模式下,则内部时钟频率是1MHZ,则时钟脉冲宽度为1us(1/1MHZ=1us)。外部12MHZ晶振,单片机工作在6T模式下,则内部时钟频率是2MHZ,则时钟脉冲宽度为1us(1/2MHZ=0.5us)。

    4.定时器的主要寄存器介绍

    4.1、TCON

    TCON

    (1)8个位,但是有4个名字:TF、TR、IE、IT,每个名字的符号都有2个,后面分别带0和1,对应T0和T1.
    (2)TF:timer flag,定时器(溢出)标志位,是只读(软件只是通过读取TF1来知道硬件的状态,而不用去写这一位来设置硬件的状态)的。timer定时时间到了后会做2件事情:第一个是把TF标志改为1,第二个是产生中断让CPU去中断处理;TF是硬件清零的(由1变0是自动的,不需要软件来干预。)有一些CPU的设计时需要软件去清零的(一般高级芯片),这时候用户的程序就一定要记得给标志位清零,不然就不能重复进入中断或者反复不停的重复进入中断。
    (3)TR就是timer run,就是定时器的启动计数的开关。当我们把整个定时器初始化好了以后,我们给TR位写1就可以开始计数了。TR位和GATE位有一定关联性。
    (4)GATE是TMOD寄存器中的,也有2个分别对应T0和T1。GATE位中文名叫门控位,工作方式是:当GATE=0时(相当于门是打开的,此时GATE位是可以忽略的),此时定时器开关就只受TR位影响。具体就是TR=1开启计数,TR=0结束计数。当timer用来计数时,很关键的就是什么条件下计数,什么条件下不计数。当GATE=0时计数条件只有TR1一个(TR1=1就计数,TR1=0就不计数),当GATE=1时是否计数不仅取决于TR1还取决于INT1引脚(P3.3),实际规则是:当TR1=1并且INT1引脚也为高电平时才会计数。
    1000 = 0x3E8 = 高0x3 低0xE8 => TL0 = 0xE8 TH0 = 0x3
    8888 = 0x22B8 = 高0x22 低0xB8 => TL0 = 0xB8 TH0 = 0x22

    4.2、IE&IT

    (1)IE也是个标志位,作用就是用来展示硬件的状态改变的。比如IE1对应外部中断1(INT1),平时不发生INT1时IE1=0,当INT1发生中断时,硬件自动IE1=1,当CPU处理了INT1时硬件会自动给IE1=0(硬件自动清零)。
    (2)IT是用来设置外部中断的中断触发方式的。所谓中断的触发方式,就是指硬件在某种条件下才会被判定为要产生中断,所以其实就是中断产生的条件。中断触发方式一般就是:边沿触发和电触发2种。边沿触发又分为上升沿触发、下降沿触发、双边沿触发;电平触发方式分为高电平触发、低电平触发2种。

    4.3、TMOD

    (1)GATE上面已经讲过了
    (2)C/T位,设置T0/T1工作在定时器模式还是计数器模式。1表示计数器,0表示定时器。
    (3)M1+M0,2个位一起来表示T0/T1处于哪种工作模式下,一般有4种:13位、16位、8位自动重载、双8位。


    5.定时器编程实践

    5.1、实验目的

    (1)使用定时器来完成LED闪烁
    (2)原来实现闪烁时中间的延迟是用delay函数实现的,在delay的过程中CPU要一直耗在这里不能去做别的事情。这是之前的缺点。
    (3)本节用定时器来定一个时间,在这个定时器定时时间内CPU还可以去做主任务,定时时间到产生中断,在中断处理程序isr中让LED闪烁即可。

    5.2、如何编程

    (1)定时(timer初始化)
    (2)主程序做事
    (3)中断处理程序
    (4)我们开发板的定时器最多能定多长时间?
    内部时钟频率是1MHZ,时钟周期是1us。最多能定65535(16位定时器),也就是说最大定时时间为65535*1us=65535us=65.535ms。
    如果要定比较长的时间(2s),定时器直接是不能够满足的,解决办法是多次定时后加起来构成一个长时间。
    (5)计算TL0和TH0:
    ①确定自己定时时间,定为50ms
    ②确定内部时钟周期,因为12T模式,外部晶振12MHZ,所以为:1us
    ③定时个数就是:50ms/1us=50000
    ④TL0 = 50000 % 256, TH0 = 50000 / 256(设置错误,下面有说)

    0xC3 0x50 => 195 80

    #include <reg51.h>
    
    unsigned char count;            // 10次,对应500ms
    sbit LED = P0^1;                // LED对应的GPIO定义
    
    #define CNT     20
    
    void timer0_isr(void) interrupt 1 using 1
    {
        TL0 = 50000 % 256;  
        TH0 = 50000 / 256;          // 手工重载计数值
    
        if (count-- == 0)
        {
            // 说明已经中断了10次了,500ms到了,干活了
            LED = !LED;             // LED取反
            count = CNT;
        }
    }
    
    
    void main(void)
    {
        TMOD = 0x01;        // T0设置工作在定时器模式下,16位定时器
        TL0 = 50000 % 256;  
        TH0 = 50000 / 256;
        TR0 = 1;            // 开启计数器,开始计数了
        ET0 = 1;            // 开启T0中断
        EA = 1;             // 开启中断总开关
    
        count = CNT;            // 10次,对应500ms
    
        while (1);          // 主任务
    }
    

    6.定时时间设置错误纠正

    6.1、加法定时器和减法定时器

    (1)定时器的原理就是计数器,加法定时器计数方法是从我们给定的值开始计数,直到溢出(比如16位定时器最大值为0xffff,也就是65535,计数值到达这个值就溢出了)。减法定时器是从我们给定的值开始减1,减到0就溢出了。
    (2)实例来看,比如16位定时器。我们设置的计数值为1000,则如果是减法定时器那么计数个数就是1000,如果是加法计数器则计数个数就是65535-1000=64535。
    (3)51单片机就是典型的加法定时器
    (4)现代的单片机或者嵌入式SoC,一般常用的都是减法定时器了。虽然加法定时器和减法定时器都能实现功能,但是明显减法定时器更加直观,因为不用去多加一步计算计数个数。

    6.2、51单片机定时器设置值计算

    计算TL0和TH0:
    ①确定自己定时时间,定为50ms
    ②确定内部时钟周期,因为12T模式,外部晶振12MHZ,所以为:1us
    ③定时个数就是:50ms/1us=50000
    ④计数个数是50000,那么写进去TL0和TH0里面的计数值应该是65535-50000=15535
    ⑤TL0 = 15535% 256, TH0 = 15535/ 256

    相关文章

      网友评论

        本文标题:2019-10-08定时器

        本文链接:https://www.haomeiwen.com/subject/dtkbpctx.html