一个大佬的文章:定时器的基本原理

定时/计数器,是一种能够对内部时钟信号或外部输入信号进行计数,当计数值达到设定要求时,向CPU提出中断处理请求,从而实现定时或者计数功能的外设。定时/计数器的最基本工作原理是进行计数。作为定时器时,计数信号的来源选择周期性的内部时钟脉冲;用作计数器时,计数信号的来源选择非周期性的外部输入信号
不管是定时器还是计数器,本质上都是计数器

51单片机有两个定时/计数器T0和T1,为16位加法计数器,由低8位TLx高8位THx两个寄存器组成,最大计数值为65535个计数脉冲

当16位计数器加到最大值时,会产生溢出,溢出可能产生中断或者查询,这就要自己设置了。
能使计数器+1的信号有2个:
<1> 系统时钟振荡器输出的12分频。
<2> T0或T1引脚输入的外部脉冲信号。

对于信号<1> ,内部时钟脉冲不一定就是输入的计数信号。因为它经过了12分频。对于系统时钟脉冲,它的周期是知道的;它能用做定时器是一位定时计数器的计数是确定的。
对于信号<2>,它是偶发性的。它的周期是不确定的。但是我们能知道我们记了多少个脉冲。

假设单片机的外部晶振为12MHz,那么,经过12分频后输入计数器的计数脉冲为1MHz,即每个脉冲的周期为1us。因此定时器T0的16位工作模式最大的定时时间为65535us,65.5ms。如果要定时10ms的话,计数器就不能够从0开始计数了,必须给它一个计数初值。
要定时10ms,则相当于计数10000个脉冲后计数器的值就到达65535了,那么开始计数的这个地方就是计数初值。
65535 - 10000 = 55535 = 0xd8ef
把这个计算得到的初值写入TH0和TL0寄存器即可:
TH0 = 0xd8;或者 TH0 = (65535 - 10000) / 256;
TL0 = 0xef; 或者 TL0 = (65535 - 10000) % 256;

与定时/计数器相关的寄存器除了计数初值寄存器THx和TLx之外,就是TMOD寄存器和TCON寄存器,务必掌握。

C/T就是选择是使用内部信号还是外部输入。
后两位是控制工作模式。

10经常用于串口波特率发生。自动重装是指每次都要对其进行计数初值的赋值。
因为当计数器/定时器溢出时TL0和TH0里面的值都变为了0,要想继续跟之前一样计数的话,就必须重新赋初值,让计数器从初值重新开始计数。

在定时/计数器的程序设计中,通常有两个函数:初始化函数和中断服务函数。
在初始化函数中,一般需要进行以下几个配置:
<1> 配置工作模式,即对TMOD寄存器编程。
<2> 计算技术初值,即对THx和TLx寄存器进行赋值。
<3> 使能定时/计数器中断,即ET0或ET1置1。
<4> 打开总中断,即EA =1。
<5> 启动定时器,即TR0或TR1置1。
在中断服务函数中,一般需要进行以下的编程:
<1> 如果不是自动重装模式,需要对THx和TLx重新赋值。
<2> 进行间隔定时到达的逻辑处理(越少越好)。

//利用51单片机定时器T0的模式1实现间隔定时,每个1秒LED闪烁一下,也就是点亮0.5秒,熄灭0.5秒;每隔2秒LED2闪烁一下,即熄灭一秒,点亮一秒。
#include "reg52.h"sbit L1 = P0^0;
sbit L8 = P0^7;void SelectHC573()
{P2 = (P2 & 0x1f | 0x80);
}
//=================================
void InitTimer0()
{TMOD =  0x01;          //不能位操作的寄存器,写入模式[Gate R/T M1 M0]TH0 = (65535-50000) / 256;                     //一个脉冲时间是1us,那么计数器最大计数65.5ms,但这个要求计时0.5秒,就要多次计时TL0 = (65535-50000) % 256;ET0=1;EA=1;TR0=1;
}unsigned char count = 0; //因为定时器定时的是50ms,需要10个这样的定时器,就要求有10个中断,所以需要一个中断变量。
unsigned char count1 = 0;
void ServiceTimer0 () interrupt 1
{TH0 = (65535-50000) / 256; //在中断中一定要对定时器的初值重新配置,因为模式1没有重装功能                    TL0 = (65535-50000) % 256;count++;count1++;if (count == 10){L1= ~L1;count = 0;}if(count == 100){L8= ~L8;count1=0;}
}//=================================
void main()
{SelectHC573();InitTimer0();while(1){}
}

优化一点

//利用51单片机定时器T0的模式1实现间隔定时,每个1秒LED闪烁一下,也就是点亮0.5秒,熄灭0.5秒;每隔2秒LED2闪烁一下,即熄灭一秒,点亮一秒。
#include "reg52.h"sbit L1 = P0^0;
sbit L8 = P0^7;void SelectHC573()
{P2 = (P2 & 0x1f | 0x80);
}
//=================================
void InitTimer0()
{TMOD =  0x01;          //不能位操作的寄存器,写入模式[Gate R/T M1 M0]TH0 = (65535-50000) / 256;                     //一个脉冲时间是1us,那么计数器最大计数65.5ms,但这个要求计时0.5秒,就要多次计时TL0 = (65535-50000) % 256;ET0=1;EA=1;TR0=1;
}unsigned char count = 0; //因为定时器定时的是50ms,需要10个这样的定时器,就要求有10个中断,所以需要一个中断变量。void ServiceTimer0 () interrupt 1
{TH0 = (65535-50000) / 256; //在中断中一定要对定时器的初值重新配置,因为模式1没有重装功能                    TL0 = (65535-50000) % 256;count++;if (count % 10 == 0){L1= ~L1;count = 0;}if(count == 100){L8= ~L8;count=0;}
}//=================================
void main()
{SelectHC573();InitTimer0();while(1){}
}

08-小蜜蜂单片机定时器相关推荐

  1. 单片机定时器精准定时_8051单片机(STC89C52)定时器实现10ms精准定时

    8051内部集成了2个16bits的计数器, 可以根据需要将其作为定时器使用. 这时, 定时器的计数频率为系统CLK/12. 如果CPU的晶振频率为12MHz, 那么定时器信号源的频率固定为12MHz ...

  2. 单片机定时器实验两位倒计时秒表_第5章 定时器与数码管基础

    第5章 定时器与数码管基础 通过上节课的实验,大家会发现,我们逐渐进入比较实质性的学习了,需要记住的内容也更多了,个别地方可能会感觉吃力.但是大家不要担心,要有信心.这个跟小孩学走路一样,刚开始走得不 ...

  3. 单片机原理及其应用——单片机定时器中断实验(八段数码管依次显示0~9数字)

    目录 一.实验要求 二.知识要点 (一)单片机定时器/计数器 (二)相关的特殊功能寄存器 1.工作方式寄存器TMOD 2.定时器/计数器控制寄存器TCON (三)定时器/计数器的工作方式 1.工作方式 ...

  4. 单片机定时器精准定时_PIC单片机的定时器精准计时的计算

    关于PIC单片机的定时器精准计时的计算 在此用了16C711单片机的TMR0做定时中断,希望实现精准计时,在程序中,TMR0用了晶振的32分频,初值#0FCH,因此POPBEAR兄弟计算出每个定时中断 ...

  5. 单片机中断程序实例_单片机定时器中断实现长时间定时程序

    单片机定时器中断实现长时间定时程序 #include // 包含51单片机寄存器定义的头文件 sbit D1=P2^0; //将D1位定义为P2.0引脚 unsigned char Countor; ...

  6. 单片机定时器_单片机定时器/计数器基本原理

    目前常用的单片机中往往都配备了定时器/计数器.在AT89S52芯片内包含有三个16位的定时器/计数器:T0.T1和T2,其核心是加1计数器.我们主要要求掌握T0和T1的结构和功能.学习中要注意从电路结 ...

  7. 单片机定时器_51单片机的定时器如何计算初值?

    在学习单片机的时候,我们发现很多功能都是通过中断来实现的.之前也举过烧水的例子来阐述中断,今天就讲解一下定时器赋初值的方法.8位的定时器最大可计数2的8次方为256,16位的定时器最大可计数2的16次 ...

  8. C51单片机————定时器计数器

    51单片机定时器/计数器 定时(定时控制.测量.延时...)和计数(对外部事件统计数目). Created with Raphaël 2.1.2张三张三李四李四嘿,四哥, 定时器和计数器有哪几种实现哦 ...

  9. 请描述定时器初值的计算方式_51单片机定时器初值计算器

    51单片机定时初值计算软件是一款比较实用的单片机定时器初值计算软件,可以精确的计算定时器的时间常数,给出数据即可快速计算出初值,还可以设置定时器方式晶振频率定时时长.有需要的朋友可以下载! 10MS定 ...

  10. 单片机定时器中断原理

    单片机定时器中断原理 #define _1231_C_ #include "reg51.h" //sbit OE=P2^3; unsigned int SystemTime; vo ...

最新文章

  1. 资源 | 一文掌握机器学习所有值得看的视频、课程、工具
  2. YYAsyncLayer 学习
  3. 投票|PMCAFF产品经理第一课,下一站去哪?杭州、深圳、上海...
  4. windows+php+mysql+apache(wamp)安装配置问题
  5. OpenCV TSP(TravelingSalesman Problem)的实例(附完整代码)
  6. char、varchar、binary和varbinary的区别与联系
  7. 2021校招 | 交通银行-IT类编程题
  8. VSCode+BeetleX.VueHost开发Vue应用
  9. python的with关键字
  10. Windows/Android/IOS平台如何在Unity3d播放RTSP/RTMP流
  11. 信息学奥赛一本通 1168:大整数加法 | OpenJudge NOI 1.6 10:大整数加法
  12. 【错误记录】springboot项目报错Field xxx in com.xx.xx.xx.impl.xxImpl required a bean
  13. php那好,php那好【货币问答】- php那好所有答案 - 联合货币
  14. 如何利用新浪微博开放平台API获取新浪微博用户数据
  15. Excel 2010 VBA 入门 043 按自定义序列进行排序
  16. Python selenium定位动态下拉框
  17. opencv 识别黄色物体的程序代码
  18. HTML5树叶飘落动画
  19. 【技术科普】区块链世界也存在多元宇宙
  20. 使用jmc监控远程tomcat

热门文章

  1. 互联网快讯:多地要求商家下架槟榔;多所高校延长专硕学制至3年
  2. java公倍数_java中如何计算最小公倍数
  3. BeagleboneBlack上u-boot的MLO文件是哪里来的
  4. CSS SVG开关按钮切换网页白天和夜晚
  5. 用Java编写记事本
  6. 秋姑娘_我爱秋天作文300字
  7. webView系列(五)----历史记录
  8. Entry name *.xml collided终极解决方案
  9. 通用输入/输出接口 GPIO
  10. 数据仓库指标体系搭建实战