利用Keil C51实现T0精确定时.docVIP

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
利用Keil C51实现T0精确定时 时间:2008-10-27 ? 来源: ? 作者:方飞 ? 点击:891 ? 字体大小:【大 中 小】 ??? 利用89C51设计一个简易日历时钟系统,时钟系统硬件主要由单片机控制的计时电路、复位等辅助电路、按键电路、数码管显示电路、电源系统等组成。日历时钟可以显示年、月、时、分、秒;可以设置年、月、时、分 其中计时控制电路由AT89C51单片机控制;按键电路包含时间设置;时间显示屏电路由7个数码管组成;电源系统由小功率整流滤波稳压电路组成,输出直流电压5 V,向主电路及显示电路供电。系统框图如图1所示。 ? 图1 日历时钟系统框图 ??? 在计时过程中,系统利用89C51自身的计时器T0作为时钟基准,计时器中断的准确度直接关系到整个系统的精度,因此获取精确的定时时钟信号成为该系统的关键。MCS-51单片机内有2个可编程的16位定时器/计数器,在本系统设计中采用AT89C51的定时器T0,并工作在方式1下,晶振频率为12 MHz。 1 T0定时中断 ??? 定时器/计数器T0工作方式1的电路逻辑结构如图2所示。T0定时特性功能寄存器由TL0(低8位)和TH0(高8位)构成。特殊功能寄存器TMOD控制定时寄存器的工作方式;TCON则用于控制定时器T0和T1的启动和停止计数,同时管理定时器T0和T1的溢出标志等。程序开始时需对TL0和TH0进行初始化编程,以定义它们的工作方式,并控制T0和T1的计数。在系统的设计中,计时单位以s为基准,并要求日误差≤10 s,如果用循环去做,无法满足精度要求。选用12 MHz的晶体可得到1 s的精度,经分析确定使用定时器0的方式1。这个方式下,定时器0是16位定时器,也就是最大定时值为FFFFH,12 MHz晶体的每个定时周期为1 s,最多可以定时FFFFH×1 s=65635 us,即使使用最大值也无法一次定时1 s,设计中使用1次定时20 ms,50次定时中断得到1 s。20 ms定时中断的定时值为:FFFFH-20 ms/1 s= B1DFH。 ? 图2 定时器/计数器工作方式1逻辑结构 2 程序测试与调整 在Keil uVision3平台下利用C语言实现如下代码: #includereg52.h #define uchar unsigned char uchar data MScond= 0;//ms uchar data Scond= 0; //s uehar data M inute= 0;//min uchar data Hour= 0;//h void main(void){ EA =1; //允许CPU中断 ET0 = 1; //定时器0中断打开 TMOD =0x1; //设定时器0为方式1 TH0= 0xB1; TL0= 0xDF; //设定时值为20 000 us(20 ms) TR0 = 1; //开始定时 while(1); } void Time0(void) interrupt 1 using 1 { TH0=0xB1; //20 ms断点 (1) TL0=0xDF; //设定时值 MScond= MScond+ 1; if(MScond == 50) {MScond=0; Scond= Scond+ 1; if(Scond == 60) {Scond=0; Minute=Minute+1; //分断点?? (2) if(Minute == 60) {Minute=0; Hour=Hour+1; //d,时断点?? (3) if(Hour == 24) { Hour=0; }}}} ??? 首先调试每20 ms中断时的精度,在选项中设定调试晶振为12 MHz,在(1)处设置一个断点再运行,这时记录下每次中断时的时间,如图3所示。在初始化中费时为551 s,每一次中断时间应该考虑该项的影响。在实际处理中可以利用两次中断时间的差来作为定时器的中断时 间间隔。 ??? 通过测试,得到第一次为0.020 568 00 s,第二次为0.040 580 00 s,第三次为0.060 592 00 s。可以看出,每中断一次会比定时值长了12 s。如果将断点设定在(2)处,并通过Logic Analyzer tool,得到分钟第一次中断的时间为60.036 57 S,第二次中断的时间为120.072 57 s,则每分钟的实际时间为60.036 S。再将断点设定在(3)处,得到小时第一次中断的时间为3 602.160 576 S,第二次中断的时间为7204.320 576 S,可以得到小时的实际时间为3602.16 S,如图4所示。 ??? 为什么会产生这些误差呢?通过对中断程序的汇编源码进行分析,实际上中断程序入堆栈时使用了两条语句:PUSH

文档评论(0)

word.ppt文档 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档