4.定时器简单运用

发布日期:2020-12-26 09:10:08 来源:网络转载

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;
    }
}
关键词 :
网站违法和不良信息举报邮箱:23139485@qq.com
CopyRight@2020-2030 www.haoapp8.cn All Rights Reserved.C语言学习网版权所有 粤ICP备15061369号
免责声明:本站内容来源于用户自行提供或网络收集,其真实性、准确性和合法性,www.haoapp8.cn不提供任何保证,亦不承担任何法律责任.而产生的法律关系及法律纠纷,由您自行协商解决。