打印
[经验分享]

定时器程序应用

[复制链接]
1002|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
shashaa|  楼主 | 2016-1-25 19:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
了解了定时器相关的寄存器,那么我们下面就来做一个定时器的程序,巩固一下我们学到的内容。我们这节课的程序先使用定时器0,在使用定时器的时候,需要以下几个步骤:
第一步:设置特殊功能寄存器TMOD,配置好工作模式;
第二步:设置计数寄存器TH0和TL0的初值;
第三步:设置TCON,通过打开TR0位来让定时器开始计数。
第四步:判断TCON寄存器的TF0位,监测定时器溢出情况。
写程序之前,我们要先来学会计算如何用定时器定时时间。我们的晶振是11.0592M,时钟周期就是1/11059200,机器周期就是12/11059200,我们假如要定时20ms,就是0.02秒,要经过x个机器周期得到0.02秒,我们来算一下x*12/11059200=0.02,得到x= 18432。那么我们现在16位的定时器溢出值是65536,我们可以这样,先给TH0和TL0一个初值,让他们经过18432个机器周期后刚好溢出,溢出后我们可以通过检测TF0位得知,就刚好是0.02秒。这个初值y = 65536 - 18432 = 47104,转成16进制就是0xB800,那么就是TH0 = 0xB8,TL0 = 0x00。
那0.02秒我们已经定时出来了,细心的同学会发现,我们如果初值直接给一个0x0000,一直到65536溢出,定时器定时值最大也就是71ms左右,那么我们想定时更长时间怎么办呢?用你小学学过的逻辑,倍数关系就可以解决此问题。
那好了,我们下面就用程序来实现以下这个功能。
#include<reg52.h>               //包含寄存器的库文件                  
sbit  LED = P0^0;
sbit  ADDR0 = P1^0;
sbit  ADDR1 = P1^1;
sbit  ADDR2 = P1^2;
sbit  ADDR3 = P1^3;
sbit  ENLED = P1^4;
void main()   
{
    unsigned char counter = 0;
    ENLED = 0; ADDR0 = 0; ADDR1 = 1;
    ADDR2 = 1; ADDR3 = 1; LED = 1;  //74HC138和LED灯初始化部分
    TMOD = 0x01;   //设置定时器0为模式1
    TH0  = 0xB8;
    TL0  = 0x00;   //定时值初值
    TR0  = 1;      //打开定时器0
    while(1)
    {
        if(1 == TF0)            //判断定时器0是否溢出
        {
            TF0 = 0;
            TH0 = 0xB8;        //一旦溢出后,重新赋值
            TL0 = 0x00;
            counter++;
            if(50 == counter) //判断定时器0溢出是否达到50次
            {
                 counter = 0;  //counter清0,重新计数
                 LED = !LED;   //LED取反操作,0-->1,1-->0
            }                 
        }                       
    }
}   
程序都有注释,不难理解,这里要解释一个地方,就是两次if判断,细心的同学会发现,if(1 == TF0)这句,我把1写前边,这个地方我推荐新手按照我这样来写,因为如果我们写if(TF0 == 1),作为新手来说,不小心丢掉一个’=’号后,写成if(TF0 = 1),这样实际上在语法上是可以通过的,我们用的Keil4还会出一个警告说明一下,Keil以前的版本以及一些其他软件,可能根本不会出任何错误或者警告提示,但是这样产生的Hex文件下载到单片机里边,程序就错了,大家可以改改试试看。
本程序实现的结果是我们板子上最右边的小灯点亮持续一秒,熄灭持续一秒,也就是以0.5HZ的频率进行闪烁。
沙发
qiangweii| | 2016-1-25 19:49 | 只看该作者
学习了,了解了定时器相关的寄存器设置。。

使用特权

评论回复
板凳
litengg| | 2016-1-25 20:06 | 只看该作者
写个使用定时器来做流水灯的左右移动以及花样变化的跑马灯例子就掌握的不错了:lol。

使用特权

评论回复
地板
androidbus| | 2016-1-25 20:23 | 只看该作者
写程序之前,我们要先来学会计算如何用定时器定时时间。

使用特权

评论回复
5
feiqi1| | 2016-1-25 20:39 | 只看该作者
INT0引脚是P3.2,INT1引脚是P3.3,T0引脚是P3.4,T1引脚是P3.5。。datasheet上可以看出来。

使用特权

评论回复
6
rreedd00| | 2016-1-25 20:47 | 只看该作者
定时器有几种模式,还是有一定的研究价值的。。。

使用特权

评论回复
7
hfdy01| | 2016-1-25 21:11 | 只看该作者
定时器来做流水灯好像是我大学的时候做的第一个关于数码管的实验。。

使用特权

评论回复
8
zhouhuanの| | 2016-1-25 21:15 | 只看该作者
从某一个初值,经过计算确定的时间后溢出,这个过程就是其定时的含义。

使用特权

评论回复
9
handleMessage| | 2016-1-25 21:22 | 只看该作者
学习学习,datasheet中还找不到,不错。。。。。

使用特权

评论回复
10
sourceInsight| | 2016-1-25 21:29 | 只看该作者
4HC138同时一次只能让一个输出口为低电平,也就是在一个时刻内,我们只能让一个数码管显示。

使用特权

评论回复
11
bbapple| | 2016-1-25 21:41 | 只看该作者
一个16位的定时器的取值范围是0到65535。。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

142

主题

1494

帖子

6

粉丝