继电器咔哒咔哒定时法.DOCVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
继电器咔哒咔哒定时法

继电器咔哒咔哒(定时法) 项目说明: 1.实现继电器的切换,频率为 0.5秒,发出咔哒咔哒声。 2.采用定时的方法实现 0.5秒的精确延时。 此项目练习的目的:(我们应掌握如下知识点) (1)回顾定时器/计数器T0。 (2)回顾定时器/计数器T0 的查询用法。 (3)回顾时钟的概念。 完整代码: #include reg52.h //52系列单片机头文件 sbit Relay = P3^3; //声明单片机 P3口的第 4位 /*定时器 T0初始化:主要是一些寄存器的配置 定时时间是 0.25ms。 */ void InitT0(void) { TMOD = 0x02; /*8位自动重装载定时器,当溢出时将 TH0存放的值自动重 装入 TL0*/ TL0 = 0x1A;//晶振 11.0592MHz TH0 = 0x1A; TR0 = 1;//启动定时器 } void main (void) /*主函数*/ { unsigned short int RelayDelayCnt = 0; InitT0();/*调用定时器初始化函数,进行相应配置*/ while (1) { if (TF0)/*判断定时器是否计满溢出*/ { TF0 = 0;/*清楚溢出标志,准备下次溢出的判断*/ if (RelayDelayCnt++ = 2000)//2000*0.25ms = 0.5s { RelayDelayCnt = 0;/*清计数,重新开始计数*/ Relay = ~Relay;/*翻转继电器控制电平,让其切换*/ } } } } 首先说明下,建议先学习完延时法,再学定时法,因为这里不再重复延时法 的内容。用定时法操作继电器和用定时法控制 LED闪烁项目知识点都差不多, 我们主要再重复讲一遍定时的知识。 定时器/计数器在我们经后做项目设计产品的时候会经常用到。所以定时器/ 计数器我们需要理解它。定时器/计数器属于单片机的内部资源,所以在使用的 时候需要对定时器相关的寄存器进行配置,配置为自己想要的工作方式。 ???????? 第一步:我们看一下程序是如何将定时器配置为 0.25ms的 void InitT0(void) { TMOD = 0x02; /*8位自动重装载定时器,当溢出时将 TH0存放的值自动重 装入 TL0*/ TL0 = 0x1A;//晶振 11.0592MHz TH0 = 0x1A; TR0 = 1;//启动定时器 } 函数里面第一条语句: TMOD = 0x02; 我们看一下这条语句是将定时器T0 配置成什么功能,首先我们看一下 TMOD 寄存器的设置:打开STC89C52RC 中文手册.pdf 这个文件(在资料里面 的芯片数据手册里面),找到TMOD 这个寄存器的定义说明: 接下来我们看第二句和第三句: TL0 = 0x1A;//晶振 11.0592MHz TH0 = 0x1A; 这个0x1A 是如何计算得出:我们看一下定时器T0 的内部框图(以后我们 需要慢慢学会看框图): TMOD = 0x02;表示选择内部时钟(C/T = 0),即系统时钟,11.0592MHz,表示 容易算出来了需要多少个脉冲是0.25ms。假设脉冲数N 个为0.25ms,则有下式: 不过我们从图2 可以看出,系统时钟是除以12 倍或者6 倍才给定时器/计数器 T0 的,我们默认下载的时候都是除以12 倍,如下图3: 因此我们的公式应该是: 我们算出N = 230.4,由于TL0 是一个字节,没有小数,所以只能取整,230。于 是我们就知道了,230 个脉冲(当然是有点误差,理论是230.4 个脉冲),就是 0.25ms。于是让定时器/计数器T0 总共计230 个脉冲,就是0.25ms。 前面我们已经把定时器/计数器T0 配置成了8 位自动重装的了,8 位的范围 是0~255,一个周期是256,计到255 后再来一个脉冲就溢出了,定时器/计数器 相应的TF0 就会硬件置1。因此,我们要让定时器/计数器T0 计230 个脉冲,就应该从256-230 = 26 开始计,等溢出的时候就刚好是计了230 个脉冲也就是 0.25ms,达到了我们的目的。 剩下的就TR0 = 1; 这条语句是启动定时器,让其开始计数。 通过上面的分析,我们知道如何配置定时器每0.25ms 发生一次溢出。那么 我们执行2000 次溢出,就能实现0.25ms*2000=0.5s。 ?? 第二步:main函数编写 void main (void) /*主函数*/ { unsigned short int RelayDelayCnt = 0; InitT0();/*调用定时器初始化函数,进行相应配置*/ while (1) { if (TF0)/*判断定时器是否计满溢出*/

文档评论(0)

ailuojue + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档