定时器简单运用

点击打开在线编译器,边学边练

1.细节

上一讲里,我们知道TH0和TL0合成的“16位的变量”的初值最小要为0,不能是负数,

所以我们要满足:65536-( x/(12/11059200) )>=0。

解得x<= 0.071111秒=71.111毫秒。

也就是用定时器的工作模式1最长的定时时间为71毫秒左右而已。

 

2.定时器开关

首先定时器也是有开关的,这个相当于我们的导管是否打开让水流进“试管”里。

因为我们用的是定时器0,TCON^4这个位就是控制定时器0是否打开或关闭,所以“TR0=1;”就是打开了定时器开始计时,“TR0=0;”是关闭了定时器计时功能。

只要打开了定时器,TH0和TL0合成的“16位的变量”就会每过(12/11059200)秒就自加1,直到定时器溢出。


3.溢出标志

我们的定时器0一旦溢出,TCON^5就会被置1(TF0==1),如果我们不使用中断函数也是可以在主函数里等待判断“if(TF0==1)”。TF0跟外部中断0的IE0一样,被置1了需要软件清零。


4.工作模式1的代码

这里我们用定时器0来实现间隔50ms的流水灯实验

#include <reg52.h> 
#include <function.h>//详见第六章第8讲

void main()
{   
    u8 i=0;
    LED_Init();   //初始化LED硬件模块 
    TMOD = 0x01;  //设置定时器0为工作模式1
    TH0  = 0x4C;  //设置定时时间为50ms
    TL0  = 0x00;
    TR0  = 1;     //启动定时器0
    
    while(1)
    {
        if (TF0 == 1)     //判断定时器0是否溢出,每隔50ms就可以进入一次这个if语句
        {
            TF0 = 0;      //定时器0溢出后,清0溢出标志
            TH0 = 0x4C;   //重新赋初值,保证下次溢出间隔时间还是50ms
            TL0 = 0x00;
            P0=~(0x01<<i);//每盏灯的点亮时间都保持着50ms
            i++;
        }   
        if(i>=8)i=0;
    }
}


5.定时器1的使用

如果我们用定时器1实现上处代码同样的功能,那么TMOD只要初始化为“TMOD=0x10;”

还有把TH0,TL0,TR0,TF0这些全部改为TH1,TL1,TR1,TF1即可,所以说这两个定时器的工作原理都是一样的。

#include <reg52.h> 
#include <function.h>//详见第六章第8讲

void main()
{   
    u8 i=0;
    LED_Init();   //初始化LED硬件模块 
    TMOD = 0x10;  //设置定时器1为工作模式1
    TH1  = 0x4C;  //设置定时时间为50ms
    TL1  = 0x00;
    TR1  = 1;     //启动定时器1
    
    while(1)
    {
        if (TF1 == 1)     //判断定时器1是否溢出,每隔50ms就可以进入一次这个if语句
        {
            TF1 = 0;      //定时器1溢出后,清0溢出标志
            TH1 = 0x4C;   //重新赋初值,保证下次溢出间隔时间还是50ms
            TL1 = 0x00;
            P0=~(0x01<<i);//每盏灯的点亮时间都保持着50ms
            i++;
        }   
        if(i>=8)i=0;
    }
}

本文固定URL:https://www.dotcpp.com/course/375

第一章 单片机入门
第二章 LED
第三章 蜂鸣器
第四章 数码管
第五章 独立按键
第六章 多文件编程
第七章 外部中断
第八章 定时器
第九章 舵机与超声波模块
第十章 串口通信
第十一章 1602液晶屏
第十二章 IIC通信
第十三章 红外遥控与温度传感器
第十四章 AD与DA
第十五章 混合例程
第十六章 完结
Dotcpp在线编译      (登录可减少运行等待时间)