1.引言 我开始看单片机的书籍比较早,只有C语言基础而没有数电基础(不知道要学),所以我在很多地方概念都是模模糊糊的。尤其是什么控制位什么寄存器什么逻辑电路都不懂,只纯粹的想写C语言操作单片机就行了。现在有了一定的基础,发现了很多以前知其然不知其所以然的东西,所以在这里稍微的总结一下,同时我想可能对基础不扎实的同学有一定的帮助(其实我基础也不扎实~嘻嘻)。
2.定时器的控制寄存器 对硬件(单片机)的操作,从本质上将就是对寄存器的操作。一个寄存器通常是1字节,即8位。每一位(bit)可以联想成一个开关,打开这个开关就能做一件事,关闭这个开关就能停止做一件事。
8051系列的单片机中定时器由两个寄存器控制,这两个寄存器名称分别是TMOD(Time Mode,工作方式寄存器)和TCON(Time Configuration,控制寄存器)。因为这些寄存器是操作单片机中定时器的,有特殊功能作用,所以属于特殊功能寄存器而不是通用寄存器。另外想要记住这两个寄存器的名称也很简单,用英文全称来记忆。
【51单片机总结之定时器】
下面先对两个控制寄存器各个位进行总结:
2.1 工作方式寄存器(TMOD)
TCOM | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | ||
位名称 | GATE | C/T | M1 | M0 | GATE | C/T | M1 | M0 | ||
功能 | 门控位 | 定时/计数方式选择 | 工作方式选择 | 门控位 | 定时/计数方式选择 | 工作方式选择 | ||||
说明 | 高4位控制T1 | 低4位控制T0 |
2.1.1 门控位(GATE)
我初学的时候没有用到这个位,不过我还是简单对它总结一下吧:
可以通过编程对这个位置1或清零。
当GATE = 0时,只要使TCON中的TR0或TR1置1,就可以启动定时器了。
当GATE = 1时,除了使TCON中的TR0和TR1置1以外,还需要外部中断INT0或INT1为高电平,才能启动定时器。即比GATE = 0时多一个启动条件。
2.1.2 定时/计数模式选择位(C/T)
其中C的英文全称是Count,意思是计数器。T是Timer,定时器。置1为选择计数器工作模式,置0为选择定时器工作模式。(T上面应该画一横的,表示低电平有效)。
当C/T = 0时,为定时模式。此时定时器计数的时间是一个机器周期,一个机器周期的时间长度和晶振频率有关。大家都知道周期T和频率f是互为倒数的关系。而知道了晶振频率fosc后,还要除以12(硬件内部结构12分频的结果),它的倒数就是一个机器周期。即如果单片机采用12MHz的晶振,那么机器周期就是1微秒。
每经过一个机器周期,定时器的数值就会加1,直到计数器产生溢出,最后产生中断执行自己写的程序,这个程序就是你想让单片机计数结束后做什么的程序。
当C/T = 1时,为计数模式,这里不详细总结了。
另外上电复位后,这里的控制位默认是0,即定时模式。
2.1.3 工作方式选择(M1和M2)
M1M0 | 工作方式 | 说明 | ||||
00 | 方式0 | 13位定时器 | ||||
01 | 方式1 | 16位定时器 | ||||
10 | 方式2 | 8位自动重装定时器 | ||||
11 | 方式3 | T0分成两个独立的8位定时器;T1停止使用 |
TMOD不能单独对一个位置1或清零。只能一个字节的写入TCOM设置定时器。
另外,CPU复位时TCOM所有的位都清零。
2.2 控制寄存器(TCON)
TCON | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
位名称 | TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
功能 | T1中断标志 | T1运行开关 | T0中断标志位 | T0运行开关 | - | - | - | - |
2.2.1 溢出中断请求标志位(TFn)
标题上的TFn中的n表示0或1,即溢出中断请求标志位分别有TF0和TF1。TF的英文全称是Timer overflow Flag,即定时器溢出标志位。
当定时器Tn(n=0、1)计数溢出后,相应的TFn由硬件自动置1,然后向CPU申请中断,执行中断程序。
CPU响应中断后,硬件自动对TFn清零。
另外,TFn也可以在程序中置1或清零。
2.2.2 定时器运行控制位(TRn)
TR的英文全称是Timer Run,即定时器运行(控制位)。
当TRn = 1时,定时器n运行;
当TRn = 0是,定时器n停止。
3.定时器的结构 知道了如何控制定时器之后,现在再来看一下定时器的结构。
定时器的实质是加一计数器(16位),由高8位和低8位两个寄存器组成(THn和TLn)。
不同工作方式(M1M0控制),THn和TLn也有不同的功能。我最常用的是使用工作方式1——16位定时器。所以也只是稍微总结一下,因为足够用了,能做很多事情了。
在这个工作方式下,THn和TLn合起来作为16位计数器。由TLn作为低8位,THn作为高8位(因为L是low,H为High)。当16位计数器溢出时,TFn置1。然后产生中断,进入并执行中断程序。
若使用12MHZ的晶振,定时器每加1则需要1微秒时间,如果把THn和THn都置为00H,当定时器溢出并产生中断的时候,就已经过了65536微秒(2^13次方微秒)。
推荐阅读
- 单片机|单片机初学者做项目为什么这么难(单片机初学者心得有哪些)
- 单片机|自学单片机好找工作吗(会单片机能找什么工作?)
- 单片机|keil把源代码生成lib的方法
- c语言|一文搞懂栈(stack)、堆(heap)、单片机裸机内存管理malloc
- 单片机|Arduino、arm、树莓派、单片机四者有什么不同()
- 灵动微电子全新超值型MM32F基本特性及目标应用
- AD中PCB布局与布线的原则
- 灵动微MM32F0130国产32位单片机电子货架标签应用案例参考
- 灵动微代理ARM?Cortex?-M0的32位微控制器MM32F0020
- 灵动微电子MM32SPIN0280国产32位单片机为主控的滑板车参考方案