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