




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
定时器/计数器的深入研究-精确定时 作者:佚名发布时间:2009-10-9阅读次数:1372字体大小: 【小】 【中】【大】 今天结合救火车单片机实验室编写的小软件定时器时间计算工具1.0,来讲述定时器的工作过程。请到免费下载。我编这个小软件尽可能的模拟了51的定时器结构,相信你用过以后,一定会加深对定时器的理解。一、定时器相关寄存器与定时器有关的寄存器都在下面了。TCON 的高4位 TF1 TR1 TF0 TR0 TF1(TCON.7):定时器1的溢出中断标志位TR1(TCON.6):定时器1的运行控制位TF0(TCON.5):定时器0的溢出中断标志位TR0(TCON.4):定时器0的运行控制位TMODGATE1 C/T1 M1 M0 GATE0 C/T0 M1 M0 定时器1 | 定时器0 TH0、TL0、TH1、TL1这个不用说了吧中断允许控制寄存器IE中的三位。ET0(IE.1)、ET1(IE.4)、EA(IE.7)定时器的结构(以T0为例)把定时器分为六个部分来研究。脉冲源 控制端 计数器 中断请求位 中断允许控制 中断服务程序晶振或T0 TH0、TL0 TF0 ET0 EA void Tm0() interrup1 using 1 脉冲源:用作定时器时,取晶振作为脉冲源。每12个振荡周期(即一个机器周期)计数器(即TH0、TL0)加一。用作计数器时T0脚出现下降沿(管脚从1到0)跳变时,计数器加一。定时器和计数器的区别就是脉冲源不同,除此之外其他的工作过程完全相同。配置TMOD的C/T0可以选择脉冲源。置0是定时器,置1是计数器。控制端:相当于一个开关,开关打开时,脉冲源的信号才能传到计数器(TH0,TL0)中,计数器会不断增一。关闭这个开关,脉冲源的信号不能使计数器(TH0,TL0)增一。控制端的开启和关闭状态由TR0、GATE0和INT0脚电平决定。控制端的开启条件是TR0&(GATE0 | INT0)如下图。控制端的开启条件是TR0&(GATE0 | INT0)如图。一般情况下 令TR0=1 GATE0=0 开启控制端。TR0=0关闭控制端。当需要INT0引脚控制计数器时 令TR0=1 GATE0=1 这样INT0脚为高电平时计数,低电平时停止计数,这样可以很方便的测量脉冲宽度。在任何一本51书中的定时器部分都有详述。也可以使用本文配套的小软件,来体会控制端的逻辑。GATE=1的这种用法,我以前也没有注意过,在整理本文时才发现的。这也是我最新的学习收获。计数器,中断请求位:这里说的计数器是指TH0、TL0这两个寄存器。每收到一个脉冲源输出的脉冲,这个计数器就会增一。计数器计满溢出时,会置位TF0,产生中断请求。注意,这里只是产生中断请求,是否能够进入中断程序,还要由中断允许位决定。直接对TF0置位,也可以产生中断请求。计数器TH0、TL0一共有四种计数方式方式0(M1=0 M0=0)13位计数器。它由TH0的8位和TL0的低5位构成。TL0大于0x1F时就向TH0进位。TH0计满溢出就向TF0置位请求中断。方式1(M1=0 M0=1)16位计数器。与方式1差不多。由TH0的8位和TL0的8位构成。TH0计满溢出就向TF0置位请求中断方式2(M1=1 M0=0)8位定时器。TL0计满溢出时,置位TF0请求中断,并且将TH0中的数值重新装入TL0中。方式3(M1=1 M0=1)这个方式只有定时器0有,把定时器0当成两个8位定时器来用。这部分很有趣,你可以使用演示软件研究。定时器1没有方式3,如果设成方式3就相当于停掉了定时器1。中断允许控制:上一步产生中断请求(TF0被置1),并不代表会响应中断。还要看中断允许控制位,这是一个开关,只有开关在开启状态,中断才会响应。每个中断源都有自己的分开关,比如T0的中断允许位是ET0,T1的中断允许位是ET1还有一个总开总EA,它关闭时所有的中断都被禁止。必须是分开关和总开关都打开时,才能进入中断服务程序。 开定时器 关定时器开启和关闭定时器控制端,你可以点击小软件来体会逻辑关系。中断服务程序:如果中断条件都允许,程序跳转到中断服务程序。ORG 0000AJMP MainORG 000BHLJMP Tim0ORG 100HMain:MOV SP,#30HMOV TMOD,#01HMOV TH0,#0EEHMOV TL0,#00HSETB ET0SETB EASETB TR0WHILE:。主程序LJMP WHILETIM0:;TIMER0中断服务程序PUSH ACCPUSH PSWMOV TH0,#0EEH。其他程序POP PSWPOP ACCRETI#include /11.0592Mvoid timer0() interrupt 1 using 1 /5ms中断一次定时器中断处理函数TH0=0xEE; /重置定时初始值。其他程序void main (void)TMOD|=0x01; /选择定时器0,工作模式1,16位定时器TH0=0xEE; /置定时初始值TL0=0x00;ET0=1; /开启定时器0中断允许,允许定时器0中断。EA=1; /开启全局中断允许。允许所有中断TR0=1; /开启控制端 while(1)。主程序顺便把其他中断源的向量表也写出来。中断源 汇编语言 C语言 中断向量 例子 中断序号 例子 外部中断0(INT0) 0003H ORG 0003H 0 void _INT0() interrupt 0 using 1 定时器T0中断 000BH ORG 000BH 1 void _T0() interrupt 1 using 1 外部中断1(INT1) 0013H ORG 0013H 2 void _INT1() interrupt 2 using 1 定时器T1中断 001BH ORG 001BH 3 void _T1() interrupt 3 using 1 串行口中断 0023H ORG 0023H 4 void _UART() interrupt 4 using 1 定时器T2中断 002BH ORG 002BH 5 void _T2() interrupt 5 using 1 定时器例程之一:精确定时1秒钟我使用的硬件是救火车单片机工作室的JHC-51-A型学习板。晶振频率11.0592M。用定时器0的工作方式1实验。因为工作方式1,最大的计数是65536个机器周期。晶振是11.0592M时,最长溢出时间是71111.1111111111微秒,远远不够1秒,所以我把定时器溢出时间定成5毫秒。在定时器工具中输入5000,点 计算TH0 TL0 计算出 TH0 = 0xEF ,TL0 = 0x00.溢出时间是5毫秒,相当1秒的200分之一。在定时器工具中输入5000,点 计算TH0 TL0 计算出 TH0 = 0xEF ,TL0 = 0x00.溢出时间是5毫秒,相当1秒的200分之一。在程序中声时一个外部变量,计200次中断,就是1秒。unsigned char ms_5=0;void timer0() interrupt 1 using 1 /5ms中断一次定时器中断处理函数TH0=0xEE; /重置定时初始值if (+ms_5=200) ms_5=0; /程序每1秒钟进入这里一次。 /主程序如下:void main (void)TMOD|=0x01; /选择定时器0,工作模式1,16位定时器TH0=0xEE; /置定时初始值TL0=0x00;ET0=1; /开启定时器0中断允许,允许定时器0中断。EA=1; /开启全局中断允许。允许所有中断TR0=1; /开启控制端 到这里我们把定时器0做成了一秒钟的程序完成了。有很多朋友会有这样的疑问,这样做的1秒钟到底准不准?有多大误差?我可以负责任的告诉你,有误差,但可以控制到极其微小的程度。下面我们发析一下误差的产生,以及控制方法。晶振的误差 我们的晶振一般误差都是20PPM的,百万分之二十。想提高精度,只能选择误差更小的晶振,但它毕竟不是为精确定时设计的,很难达到时钟芯片晶振的精度。单片机中断系统的误差。 定时器产生中断请求以后,并不一定能马上响应这个中断。 单片机要把当前的指令执行完。51的指令是1到4个周期。如果赶上两周期指令,就会延误一个指令周期。最慢的情况会延误3个周期响应中断。这点误差倒是没什么关系。 但是如果单片机正处理其他的中断(同级或更高级)。要等其执行完其他中断,再执行一条主程序指令,才会响应定时器0中断。因为程序千差万别,所以其他中断占用的时间,就没准儿了。更要命的是,这类影响是随机的,你根本无法纠正。 看起来好像没有办法了,但是你深入研究定时器的工作原理以后,你会发现这个问题还是有可能解决的。请仔细看一下,我上面的中断程序,“TH0=0xEE;” 你是否注意到,我没有给TL0重新赋值。这可不是疏忽忘了。我们知道定时器只要开着,TH0和TL0就会不断的增一,增到FF FF,再增一就溢出,这时TF0被硬件置1(也就是中断请求)。我们要注意的就是不管定时器中断是否被响应,TH0和TL0仍然会不断增一,FF FF增一00 00 再增一 00 01 再增一 00 02 。这就是我为什么要选择5毫秒作为定时长度的原因。因为TH0=EE TL0=00。最主要的就是TL0=00。定时器在溢出产生中断以后,不论响应还是不响应,TL0并不停止计数。虽然中断响应有可能被延迟,但是延迟的时间仍然被计算。延迟的时间在下一次中断时会“补上”。这就是只对TH0重赋值的原因。从理论上说,真正是一个微秒都不差。研究出这个用法以后,着实让我兴奋了好长时间。呵呵。 还有一点需要注意。其他的中断占用的时间太长,TL0增数超过256,定时器中断响应时TH0已经大于0了,直接写TH0=0xEE;就有误差了可以改成 TH0=TH0+0xEE;但这样也会有一点点问题,我们不在这里详细讨论。最好还是控制其他的中断占用时间不要超过240个机器周期。每秒钟最后一次入中断的误差。原因和上面说的相同,误差在下一秒也会“补上”。定时器例程之二 :模拟时钟这也是JHC-51-A的实验6-1的内容。以下是部分程序void init_timer0(void)/以下为初始化定时器TMOD|=0x01; /选择定时器0,工作模式1:16位定时器TH0=0xEE; /置定时初始值TL0=0x00;/初始化完毕。ET0=1; /开定时器0中断,允许定时器0中断。EA=1; /开全局中断。允许所有中断TR0=1; /开始计数 unsigned char time_allow; /整点报时标志unsigned char time_num; /报时的次数 ,unsigned char fmq_times; /整点报时 蜂鸣器声音维持时间计数unsigned char set_kk_times; unsigned char ms5_times; /5ms中断计次unsigned char hour,min,sec; /定义时,分,秒。void timer0() interrupt 1 using 1 /5ms中断一次定时器中断处理函数/重新置位计数初始值 在工作方式1下,需要重新置位定时初始值,程序才会再一次进入中断,/工作方式0,3也是如此,只有工作方式2不需要重新置位初始值。TH0=0xEE; /置定时初始值if(+ms5_times=200) /5ms中断一次,计数200次 达到1s ms5_times=0; dc1=0; /处理小数点 点亮 sec+; /时钟 秒+1 if(sec=60) /秒计数达到60 sec=0; min+; /分钟+1 if(min=60) /分钟计数达到60 min=0; hour+; /小时+1 if(hour23) hour=0; /24小时制,计数达到24,清零 if(0=sec) if(0=min) /如果时间达到整点。允许报时功能 if(hour12) time_num=hour-12; /如果时间超过12点,报时声音次数相应减 12 else if(0=hour) time_num=12; /如果时间为零点。报时声音为12次 else time_num=hour; /报时次数为时间值 time_allow=1; /报时允许标志置位 if(30=min) /如果时间达到半点,允许报时功能 time_allow=1; /报时标志置位 time_num=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025安徽宣城市旌德县兴业融资担保有限公司招聘3人考前自测高频考点模拟试题及完整答案详解1套
- 2025年潍坊寒亭区(经济区)公开招聘中小学教师(11名)考前自测高频考点模拟试题附答案详解(考试直接用)
- 2025江苏南京白下人力资源开发服务有限公司招聘劳务派遣人员2人(二十五)模拟试卷有答案详解
- 2025湖北咸宁市通山县政金融资担保有限公司招聘工作人员3人模拟试卷及1套参考答案详解
- 2025年福建泉州市华侨大学分析测试中心招聘实验技术系列人员(4月)模拟试卷有完整答案详解
- 2025国内产品交易合同协议书
- 解除商品房租赁合同5篇
- 教资保育考试题库及答案
- 美术创意考试题库及答案
- 代理合同电线代理合同6篇
- 骨软骨瘤恶变信号:识别、诊断与临床管理
- DG-TJ08-2466-2025 超低能耗建筑设计标准(公共建筑)
- 安全生产盲区
- 社区居民健康档案建立
- 非公企业党建培训课件
- 物业管家手机管理办法
- 2025发展对象考试试题库及参考答案(完整版)
- 妇产科开展宫腔镜手术的可行性报告
- 重视体检的健康知识讲座
- DB54∕T 0275-2023 民用建筑节能技术标准
- 中国工运史课件
评论
0/150
提交评论