足球比分直播

定时器84358.doc

返回
定时器84358.doc_第1页
第1页 / 共17页
定时器84358.doc_第2页
第2页 / 共17页
定时器84358.doc_第3页
第3页 / 共17页
定时器84358.doc_第4页
第4页 / 共17页
定时器84358.doc_第5页
第5页 / 共17页
点击查看更多>>
资源描述:
定时器数字钟要准确持续地走时,1 秒钟是最小的计时单位,60 秒种是 1 分钟,60 分钟时是一个小时,24 小时就是 1 天了。能得到精确的 1 秒钟,就会得到精确的 1 分钟、1 个小时和 1 天了,显而易见,得到精确的 1 秒钟是数字钟准确持续走时的核心问题。那么在 51 单片机内部如何得到精确的 1 秒钟呢,在第一章中的学习时,我们曾将介绍过 delayms这个函数可以实现延时,利用它可以得到 1 秒钟,但是这个延时函数不够精确,实际上 51 单片机内部已经集成了定时器,利用定时器我们可以得到所需要的精确的 1 秒钟。在利用定时器完成数字钟走时之前,我们先来系统地学习一下定时器的原理。(一)定时器的原理(1)定时与计数的引入在讲述定时器的原理之前,我们先看一下图一中的图片。这是一个水龙头向水盆滴水的画面,在画面中,水龙头由于没有关紧,水一滴一滴地滴向脸盆,盆的容量是有限的,水终会在某一个时刻从脸盆中溢出来。假设一开始水盆没有水,10000 滴水滴恰好可以把水盆装满,恰好是计数了10000 次。如果我们计数 100 次怎么办呢我们应该首先向水盆中预先装下了 9900 滴水,然后让水龙头开始滴水,等到水盆中的水溢出了,自然是计数了 100 次。如果水滴的速度是恒定的,1 秒一滴水滴,那么计数也就变成了计时了,水盆中没有水,要让水盆中的水装满,那得需要 10000秒的时间。通过上面地分析,我们发现只要保持水滴的速度是恒定的,定时与计数在本质上是一回事。51 单片机的定时器/计数器与上面讲述的水盆滴水的例子类似。在 51 单片机内部,信号源产生的脉冲可以看成是水滴滴水;由两个 8 位的 RAM(共 16 位)构成的存储单元可以看成是水盆;水龙头向水盆滴水的过程,在 51 单片机内部,可以看成是信号源每产生一个脉冲,就向 16 位的RAM 加 1 这样一个过程;16 位的 RAM 中的数据不断加 1,直到 65536,再加 1,RAM 中的数据就会溢出,可以类似水盆中的水满了,再加入 1 滴水滴,水就会溢出。通过这样的类比,我们可图 1以来很好的理解单片机定时器/计数器的原理。(2)定时器/计数器内部结构及工作原理在 51 单片机内部,有 2 个定时?计数器,分别称为定时器? 计数器 0、定时器?计数器 1。每个定时器? 计数器都具有计数和定时两大功能,并具有 4 种工作方式。现用定时? 计数器 0 的方式 1 来说明定时?计数器内部结构与工作原理。图 2 为定时/计数器 0 方式 1 的内部结构图。51 单片机内部定时/ 计数的信号源有两种当定时/计数器工作于定时方式,加 1 脉冲由系统时钟 fosc 经 12 分频后产生。当定时/计数器工作于计数方式,加 1 脉冲由 T0P3.4引脚直接提供。定时器工作于定时还是计数方式,取决于选择开关C/T,当 C/T0 时工作于定时方式,C/T1 时工作于计数方式。加 1 脉冲要经过启动开关才能到达加 1 计数器,启动开关由与门的输出端控制,其输入端分别接启动控制位 TR0 与或门输出端启动开关比较复杂,在后面的内容中会详细地介绍。前面我们提及过两个 8 位的 RAM,高八位的RAM 称为 TH0,低八位的 RAM 称为 TL0,每来一个脉冲,RAM 的数值加 1,当 RAM 的数值超过 65536 时,计数器会溢出,TF0 会由 0 变成 1,TF0 的变化会引发事件的发生。图 2 定时/计数器 0 的内部结构(方式 1)(3)定时/计数器的方式控制字在 1.1 中我们已经大体知道了定时/计数的工作原理,那么在 51 单片机中如何控制它们工作于我们需要的用途呢我们先来看一下 51 单片机定时/计数的两个方式控制字。在单片机中有两个特殊功能寄存器与定时/计数有关,这就是 TMOD 和 TCON。顺便说一下,TMOD 和 TCON是名称,我们在写程序时就可以直接用这个名称来指定它们。图 3 TMOD从图 3 中,我们可以看出,TMOD 被分成两份,每份四位,高四位用于定时 /计数器 1 的控制,TR0启动开关C/T 选择低四位用于定时/计数器 0 的控制,结合图 2 定时/计数器 0 的内部结构,我们可以看出,GATE 参与了启动开关的选择,称为门控位。C/T 是用来选择定时还是计数, M1,、M0 是我们下面要介绍的 4 种工作方式的选择位。图 4 是 TCON 寄存器的配置,也被分成了两份,前四位用于定时/计数器,后四位用于中断。而 TF0 在工作原理中已提到了,当计数溢出后 T0 就由 0 变为 1。TR0 也参与了启动开关的选择。称为运行控制位。4 定时/计数器的四种工作方式工作方式 0定时器/计数器的工作方式 0 称之为 13 位定时/ 计数方式。它由 TL(1/0 )的低 5 位和TH(0/1 )的 8 位构成 13 位的计数器,此时 TL(1/0)的高 3 位未用。由于方式 0 和方式 1 使用起来差不多,方式 1 计数范围是 16 位,所以这里不介绍方式 0 的使用了。工作方式 1 M1M0定时/计数器一共有四种工作方式,就是用 M1M0 来控制的,2 位正好是四种组合。工作在方式 0 的时候,M1M000。工作于方式 1 的时候,M1M001。 C/T定时或者计数的选择位,C/T0,信号源选择晶振的 12 分频,计时;C/T1,信号源选择外接脉冲,计数。GATE从图 2 中我们可以看到,选择了定时或者计数工作方式后,还要闭合启动开关,这样计数脉冲才会送到后面的 RAM 中,而启动开关的闭合不仅由运行控制位 TR0 决定,还有门控位 GATE 决定。GATE0,分析一下逻辑,GATE 非后是 1,进入或门,或门总是输出 1,和或门的另一个输入端 INT1 无关,在这种情况下,开关的打开、合上只取决于 TR1,只要 TR1 是 1,开关就合上,而如果 TR1 等于 0 则开关打开,计数脉冲无法通过,因此定时/ 计数是否工作,只取决于TR1。 GATE1,在此种情况下,计数脉冲通路上的开关不仅要由 TR1 来控制,而且还要受到INT1 引脚的控制,只有 TR1 为 1,且 INT1 引脚也是高电平,开关才合上,计数脉冲才得以通过。这个特性可以用来测量一个信号的高电平的宽度。 工作方式 2 工作在方式 2 的时候,将 M1M0 设为 10,。在介绍这种方式之前,我们先来看一下在方式 1模式下如何连续地定时 1ms晶振选择 12M,那么计数脉冲的周期是 1us,1ms 的定时就是要计1000 个脉冲,所以我们要预先在计数器中装入(65536-1000)65436,然后来 1000 个脉冲,计数器计满溢出,第一个 1ms 就实现了,那么下一个 1ms 呢如果我们不对计数器做设置,计数器在溢出之后会从 0 开始计数,也就是说下一次溢出,要计 655536 个脉冲,显然这样是不合理的。正确的做法,在溢出之后,要重新对计数器装初值 65436。对计数器装初值是需要耗费一定的时间的,对于时间要求不是很严格的场合,这样做没有什么大问题,但是如果在要求严格的场合我们本单元中的数字钟就对时间要求比较严格,1S 中有小误差,日积月累,那么误差就大了,方式 1 显示不可行了,所以我们应该采用方式 2 模式。方式 2 是自动重装模式,预置数的重装不需要人工干预,由硬件自动完成。既然要自动重装,预置数应事先放在一个地方,那预置数放在什么地方呢它放在 T(0/1)的高 8 位,那么这样高 8 位不就不能参与计数了吗是的,在工作方式 2,只有低 8 位参与计数,而高 8 位不参与计数,用作预置数的存放。计数范围缩少了一半,但计数精度确增加了。工作方式 3 这种式作方式之下,定时/计数器 0 被拆成 2 个独立的定时/ 计数器来用。其中,TL0 可以构成 8 位的定时器或计数器的工作方式,而 TH0 则只能作为定时器来用。我们知道作定时、计数器来用,需要控制,计满后溢出需要有溢出标记,T0 被分成两个来用,那就要两套控制及、溢出标记了,从何而来呢TL0 还是用原来的 T0 的标记,而 TH0 则借用 T1 的标记。如此 T1 不是无标记、控制可用了吗是的。一般情况处,只有在 T1 以工作方式 2 运行(当波特率发生器用)时,才让 T0 工作于方式 3 的。5 定时器/计数器的定时/计数范围工作方式 013 位定时/计数方式,因此,最多可以计到 2 的 13 次方,也就是 8192 次。工作方式 116 位定时/计数方式,因此,最多可以计到 2 的 16 次方,也就是 65536 次。工作方式 2 和工作方式 3,都是 8 位的定时/计数方式,因此,最多可以计到 2 的 8 次方,也说是 256 次。预置值计算用最大计数量减去需要的计数次数即可。例流水线上一个包装是 12 盒,要求每到 12 盒就产生一个动作,用单片机的工作方式 0 来控制,应当预置多大的值呢对了,就是 8192-128180。以上是计数,明白了这个道理,定时也是一样。6定时器/计数器的初始化和溢出标志位处理在讲解定时器的应用实例之前,我们先来看看定时器的初始化和溢出标志位的处理。(一)定时器/计数器初始化设置如下(1)设置工作方式,由 TMOD 的值确定定时器/ 计数器的工作方式;(2)预置处置,根据定时/计数要求,给出 TH1、TL1(或 TH0,TL0)送初值;(3)根据需要,确定是否需要开启中断,如果需要,设定 EA 和 ET0(或者 ET1)(4)确定中断级别,通过 IP 的设置来确定优先级别(5)启动定时器/计数器,定时器 /计数器的启动由定时控制器 TR0(TR1)来决定。(二)溢出标志位处理溢出标志位可采用查询和中断两种方式进行处理。采用中断方式处理,当定时器/计数器值到位时,溢出位座位中断请求信号向 CPU 发出中断请求。CPU 响应中断后,进行中断处理过程,在中断处理中要重新给定时器、计数器赋初值(方式 2 外) 。采用查询方式处理,当开启定时器/计数器后,在主程序中来查询 TF0TF1的到来。二定时、计数例程应用 1计数的应用要求流水线上一个包装是 12 盒,要求每到 12 盒就一个动作。这里用按键来模拟盒数,每按一次按键,产生一次脉冲,表示生产线检测到一盒产品,按键接 P3.4。用发光二极管的状态来模拟生产线的动作,发光二极管的的状态取反一次,表示动作一次,发光二极管接单片机的P0.0。用定时器 0,方式 0,计数,溢出分别采用查询方式和中断方式。(a)查询方式程序includedefine uchar unsigned char define uint unsigned int sbit ledP00;void mainvoid{TMOD0 x05; //GATE0,C/T1,M1M001;TH00 xff;TL00 xf4; //设置初值 65536-12/2560 xff,65536-122560 xf4;TR01; //开启定时器while1{ifTF01 //查询定时器有没有溢出{TF00; //清空溢出标志位ledled; //发光二极管状态取反TH00 xff;TL00 xf4; //重新赋初值}}}程序说明(1)按键会在下节中详细介绍。这里只是做一下说明按键内部是一个机械开关,按下,机械开关内部连通,松开,内部开关断开,图中的按键一端接单片机的 P3.4 引脚,两外一端接地。由于单片机的 P3 引脚已经内接上拉,所以,按键没有被按下的时候,P3.4 引脚被置成高点平,按键按下的时候,P3.4 引脚被置成低电平,这样按键每按一下次,相当于给 P3.4 引脚送了一个脉冲。(2)我们在试验的时候发现,按键大约在 5-10 次内就可以使发光二极管的状态取反一次,这是由于按键按下时会产生抖动,有可能一次按键产生多个脉冲的缘故,若想稳定地观察试验现象,大家可以把 P3.4 口接到稳定的信号源上。(3)定时器可以对外来脉冲计数,但并不是说对任意频率脉冲计数。脉冲应满足一定条件。当输入信号产生由 1 到 0 的负跳变时,计数器加 1。单片机对外部输入引脚进行采样,如在第一个机器周期内采样值为 0,下一个机器周期采样值为 1,则紧跟着下一个机器周期,计数器加1。从这个过程我们可以看出,单片机确认一次负跳变,需要 2 个机器周期,所以外部输入脉冲的最高频率不应该超过振荡器频率的 1/12。例如,12MHZ 频率的晶振,允许外部输入脉冲的频率为 500KHZ。对于外部脉冲的占空比(脉冲的高低电平宽度之比)也有一定限制,为了确保某一给定的电平在变化之前能被采样一次,则这一电平持续的时间,至少要保持一个机器周期以上。(b)中断方式includedefine uchar unsigned char define uint unsigned int sbit ledP00;void mainvoid{TMOD0 x05; //GATE0,C/T1,M1M001;TH00 xff;TL00 xf4; //设置初值 65536-12/2560 xff,65536-122560 xf4;TR01; //开启定时器ET0EA1; //开定时器中断和总中断while1;;}void timer0_intrvoid interrupt 1{TH00 xff;TL00 xf4; //溢出后重新赋初值ledled; //中断每产生一次,发光二极管的状态取反一次}应用 2定时的应用实例 1在单片机系统中,单片机经常需要给外围的器件提供脉冲信号,例如,在超声波测距模块中,需要提供 40Khz 的脉冲信号;在红外通信中,需要提供 38Khz 的脉冲信号;模数转换器件 ADC0809 无内接时钟源,需提供几十 K 到几百 K 的脉冲信号。在本例中,用定时器实现单片机 I/O 口输出 10KHz 的方波,I/O 口为 P0.0,定时器 1,方式 0。includedefine uchar unsigned char define uint unsigned int sbit signalP10;void mainvoid{TMOD0 x20; //GATE0,C/T0,M1M010;TH1206;TL1206; //设置初值,TR11; //开启定时器ET11; EA1; //开定时器中断和总中断while1;}void timer0_intrvoid interrupt 3{signalsignal; //中断每产生一次,发光二极管的状态取反一次}实例 2PWMPulse Width Modulation是脉冲宽度调制的英文单词的缩写,利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中,例如调光灯、电机调速和开关电源等等场合。上面的专业术语看起来比较晦涩,简单来讲,PWM 就是通过在一个固定周期里调节占空比(高电平与低电平的比例) ,来调节输出的平均电压、电流或者功率等被控制量。我们可以用一个水龙头来类比,把 1S 时间分成 50 等份,即每一个等份 20MS。在这 20MS 时间里如果我们把水龙头水阀一直打开,那么在这 20MS 里流过的水肯定是最多的,如果我们把水阀打开 15MS,剩下的 5MS 关闭水阀,那么流出的水相比刚才 20MS 全开肯定要小的多。同样的道理,我们可以通过控制 20MS 时间里水阀开启的时间的长短来控制流过的水的多少。那么在 1S 内平均流出的水流量也就可以被控制了。下面是利用定时器完成的 PWM 控制程序。PWM 的周期为 10ms,P1.0 输出 PWM,占空比可以设定。程序includedefine uchar unsigned char define uint unsigned int define pwm_limit 20sbit pwmP10;uchar pwm_counter;void mainvoid{TMOD0 x20; //GATE0,C/T0,M1M010;TH1156;TL1156; //设置初值,TR11; //开启定时器ET11; EA1; //开定时器中断和总中断while1;}void timer0_intrvoid interrupt 3{ifpwm_counter100 pwm_counter0;ifpwm_counterdefine uchar unsigned char define uint unsigned int sbit pwmP10;uchar pwm_counter;uchar i;uchar pwm_limit;uchar code table[]{16,22,27,30,31,30,27,22,16,9,4,1,0,1,4,9};void mainvoid{TMOD0 x20; //GATE0,C/T0,M1M010;TH1217;TL1217; //设置初值,TR11; //开启定时器ET11; EA1; //开定时器中断和总中断while1;}void timer0_intrvoid interrupt 3{ifpwm_counter32 {pwm_counter0;ifi16 i0;pwm_limittable[i];}ifpwm_countertable[i] pwm1;else pwm0; }在程序中,最小时基单位为 50us,每 32 个时基信号的到来改变一次 PWM 的占空比,这让I/O 的脉冲输出经过滤波后就形成正弦波,在本设计中,正弦波的频率为20k/32/1639hz。实例 4测脉冲高电平宽度红外线遥控器广泛用于家电以及工业设备中,由发射和接收两大部分组成。如图 1 所示。发射部分包括键盘矩阵、编码调制、LED 红外发送器;接收部分包括光、电转换放大器、解调、解码电路。遥控发射器专用芯片很多,现以日本 NEC 的 uPD6121G 组成发射电路为例说明编码原理。采用脉宽调制的串行码,以脉宽为 0.565ms、间隔 0.56ms、周期为 1.125ms 的组合表示二进制的“0” ;以脉宽为 0.565ms、间隔 1.685ms、周期为 2.25ms 的组合表示二进制的“1”,其波形如图 2 所示。
展开阅读全文
收藏
下载资源

加入会员免费下载





足球比分直播