定时器程序应用

来源:本站
导读:目前正在解读《定时器程序应用》的相关信息,《定时器程序应用》是由用户自行发布的知识型内容!下面请观看由(电工学习网 - www.9pbb.com)用户发布《定时器程序应用》的详细说明。

  了解了定时器相关的寄存器,那么我们下面就来做一个定时器的程序,巩固一下我们学到的内容。我们这节课的程序先使用定时器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//包含寄存器的库文件

sbitLED=P0^0;

sbitADDR0=P1^0;

sbitADDR1=P1^1;

sbitADDR2=P1^2;

sbitADDR3=P1^3;

sbitENLED=P1^4;

voidmain()

{

unsignedcharcounter=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的频率进行闪烁。

提醒:《定时器程序应用》最后刷新时间 2023-07-10 03:59:32,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《定时器程序应用》该内容的真实性请自行鉴别。