一文解析51单片机定时器(上)

控制/MCU

1876人已加入

描述

看了很多几本单片机的书,对51定时器的认识又有了一些新的变化。开局一张图(一个简单的单片机程序),其实文章也是来解释这个代码的写法。

寄存器

在此,后面也会对STC官方的库,做详细的解读和使用

寄存器

我们使用串口,设置它的寄存器
 

寄存器

一共4种模式,八位的可变

寄存器

2位,4个状态

B6位为0的时候,B7用于帧错误检测,当检测到一个无效的停止位的时候,UART设置它,软件清0.

寄存器

这个方式0,是使用一个专用的SBUF发送的

寄存器

TI标志位

发送完以后,自动的变1,相对于有了一个中断。然后中断系统处理,处理完以后就要把状态变回去。

寄存器

RI也是,一发一收

寄存器

接收的一个函数

寄存器

这里是注意的编程要点

寄存器

这里要开启UART的中断,先开启大中断,接着开启串口的中断

寄存器

REN是收发功能的开关

寄存器

1,2,3都是异步通信,0是移位寄存器

寄存器

接下来配置定时器

寄存器

只有两个寄存器,灵活使用要

寄存器

TCON是这样的

寄存器

TR1,相对于是使能位

关于定时器不得不说,而且最近看了几本相对古老的书,真的很清晰,现在的书比喻一堆也不知道想说什么。

对51来说,其实是只有4种方式:

1、51单片机计数器的脉冲输入脚。主要的脉冲输入脚有Px,y, 也指对应T0的P3.4和对应T1的P3.5,主要用来检测片外来的脉冲。而引脚18和19则对应着晶振的输入脉冲,脉冲的频率和周期为:


F = f/12 = 11.0592M/12 = 0.9216MHZ T = 1/F = 1.085us

2、定时器有两种工作模式,分别为计数模式和定时模式。对Px,y的输入脉冲进行计数为计数模式。定时模式,则是对MCU的主时钟经过12分频后计数。因为主时钟是相对稳定的,所以可以通过计数值推算出计数所经过的时间。所谓的定时器就是恒定的数数。

3、51计数器的计数值存放于特殊功能寄存器中。T0(TL0-0x8A, TH0-0x8C), T1(TL1-0x8B, TH1-0x8D)

寄存器

其实就是容器,存放脉冲数的

寄存器

这是我们单片机的4种定时器模式

4、TLx与THx之间的搭配关系

以下的进制,就是向前进位的意思。

1)、TLx与THx之间32进制。即当TLx计到32个脉冲时,TLx归0同时THx进1。这也称为方式0。

注意x,是两个定时器的意思。

寄存器

这个图可能更清晰

2)、TLx与THx之间256进制。即当TLx计到256个脉冲时,TLx归0同时THx进1。这也称为方式1。

在方式1时,最多计65536个脉冲产生溢出。在主频为11.0592M时,每计一个脉冲为1.085us,所以溢出一次的时间为1.085usx65536=71.1ms。

2的16次方

3)、THx用于存放TLx溢出后,TLx下次计数的起点。这也称为方式2。
4)、THx与TLx分别独立对自己的输入脉冲计数。这也称为方式3。

寄存器

最后再看一下这个定时器的容器

H,L都是高低位的说明。

定时器初始化

1)、确定定时器的计数模式。
2)、确定TLx与THx之间的搭配关系。
3)、确定计数起点值。即TLx与THx的初值。
4)、是否开始计数。TRx

看不懂没有关系,继续磨豆腐,再看别的解释。

寄存器

16位的寄存器最大的数值是这样的

寄存器

13位是这么大

0,13位模式

1,16位模式

2,8位自动重装模式

3,两个八位模式

有个问题是,定时器总是和中断关联,其实就是,你再应用的时候,不学任何一个都不行。

寄存器

中断就好像是权力巨大的IF程序,来了以后主程序就得搭理,妈的。就好像,来了快递你必须要去取1一样。

在51里面,这么屌的事件,有这么几个。更装逼的名字叫中断源。分类有三种,外部引脚来的中断,也就是测量使用,比如你想测量一个波形的占空比,一个波肯定是有边沿的,你记录这两个事件,接着你计算中间的时间,相对于计数,这就测量出来了。

其次就是定时器的中断,和UART的中断。

一个这样的来源,就有一个这样的标志,这也好理解啊,你总得说明它发生了不是吗?

这个世界是高速并行的,对于单片机的世界也是,经常多个中断一起来,关于顺序的问题,引入的解决方案是优先级。

害,有个无奈的事情,就是有的东西天生就自带光环,比如复位事件。基本上就是活土匪了,妈的,我来了,谁也别活。。。

寄存器

一个中断究竟要怎么样的触发,对于现实世界来讲,就是消息。打电话,喊叫,或者看见。总之是发生了什么。

单片机也是这样,发生了什么。

我想聊聊定时器中断,时刻记得两个使命,定时和计数。其实你该想想时间是什么作用。其实是标度的概念。它说明了两个点,起点和终点,在定义它是均匀的时候,那么你可以无聊的数一下有多少。

总结一下,定时器,不如说是时间,它就是一把尺子。中断就是定位使用的标尺,说:我想从这里开始计数,到下个位置停止。

当然了,处于对技术上面的妥协,定时器中断也来做别的工作。对于定时,有长有短。对于特别长的时间呢。就好像下面这样:

寄存器

右边是一个计时的间隔

寄存器

这样看

不同于我们世界的计时法,我们可以看表,秒针一动,一个时间间隔,单片机没有这种东西,它有的是是振荡器。12M,这东西0都数不清,所以不能之间使用,这里就做除法。

我们把这个间隔记录下来,满了以后就传一个数值出去,接着把这个清空,继续装东西,好咧,这就是定时器所有的奥秘了。

寄存器

接下来看看中断的结构

寄存器

对于定时器的中断寄存器就是这样

寄存器

这里面没有编程模型,但是我非要加点这个东西进去。查询模型,查询标准位,然后balabala。

4个中断控制寄存器分别是,定时器,UART,中断允许,中断优先级。功能是中断标志,中断允许,优先级设定。

IE0 ,外部中断0标志当它位1的时候,向CPU发送中断,CPU响应以后硬件请0.

寄存器

这个就是什么样的信号来激发

单片机响应中断以后,不会自动的关闭中断。转向ISR以后,把中断关闭。为了响应下一次中断。

寄存器

外中断1,脉冲触发这样设置

这里还需要说一下,中断优先级。两级,高或者低。低级可以被高级的打断,同级不响应。

寄存器

这个表的作用就是同时来了中断,响应的顺序

寄存器

这样写ISR

寄存器

毕竟在主线搬砖,现在突然去支线干活,所以需要保护现场

先把手头的工作做完,PC是执行下一次主线命令的指针,也放入stack。接着搞个围栏,挡同级的中断。ISR虽然小,但也还是一个函数,所以它的PC值装载在主线中,开始运行。

寄存器

ISR完成的标志是,返回RETI这个指令,相当于,老子完事了~至于这个中断来的时候去哪里执行ISR,也就是入口在哪里,这个是固定的。

这个时候,引起中断的位置会自动清0,主程序的第一条指令是跳转指令,越过这个中断的向量区。

寄存器

最后擦屁股得指令就用RETI,这个指令可以把中断优先级状态还原,否则中断就认为中断还在运行。还有建议就是PUSH和POP得成对使用。

寄存器

后面得这个激发次数比较重要

寄存器

外部中断0 ,下降沿触发

寄存器

看看汇编得版本

寄存器

这个是中断得向量表,一个长跳转带你去main还是exit0

寄存器

mian很简单,初始化sp,然后就是一些设置

寄存器

最后是服务程序,CPL操作IO ,RRTI来说明中断完成

寄存器

这段有点拗口

这里需要补充一些东西:

1T、4T、6T和12T是指一个机器周期需要的时钟周期数。比如现在普遍的51单片机STC89S52是12T的,其1个机器周期等于12个时钟周期。

也就是说,机器周期大,时钟周期小。

时钟频率:是指为单片机提供时钟信号的振荡源的周期(也叫时钟周期),当采用12MHz晶振时,一个振荡周期是1/12M秒(1/12000000s)。

时钟周期也称为振荡周期,定义为时钟脉冲的倒数(可以这样来理解,时钟周期就是单片机外接晶振的倒数,例如12M的晶振,它的时间周期就是1/12 us),是计算机中最基本的、最小的时间单位

机器周期:对于标准51架构而言,1个机器周期为12个时钟振荡周期,即1微秒。具体计算为:时钟周期 X cycles。如果单片机是12T的话,那么机器周期就是时钟周期×12。

指令周期:执行一条指令的时间,是机器周期的倍数。不同的CPU,执行不同的指令,所需要的指令周期不同。 

机器周期是单片机执行的最小倍数。

不同的单片机指令执行速度不同。1T单片机的计时器是兼容传统12T单片机的。也就是说只是执行一般的指令会快12倍。

新的单片机已经能做到不分频了,并且尽量单指令周期,就是指令周期=机器周期=时钟周期。

就是什么1T单片机,比传统的快12倍。

在8051单片机中把一个时钟周期定义为一个节拍(用P表示),二个节拍定义为一个状态周期(用S表示)。

在计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段,每一阶段完成一项工作。例如,取指令、存储器读、存储器写等,这每一项工作称为一个基本操作。

完成一个基本操作所需要的时间称为机器周期。

一般情况下,一个机器周期由若干个S周期(状态周期)组成。8051系列单片机的一个机器周期同6个S周期(状态周期)组成。前面已说过一个时钟周期定义为一个节拍(用P表示),二个节拍定义为一个状态周期(用S表示),8051单片机的机器周期由6个状态周期组成,也就是说:

一个机器周期=6个状态周期=12个时钟周期

指令周期

指令周期是执行一条指令所需要的时间,一般由若干个机器周期组成。指令不同,所需的机器周期数也不同。对于一些简单的的单字节指令,在取指令周期中,指令取出到指令寄存器后,立即译码执行,不再需要其它的机器周期。对于一些比较复杂的指令,例如转移指令、乘法指令,则需要两个或者两个以上的机器周期。

时钟周期、机器周期、指令周期之间的关系图如下。

寄存器

时序图

时钟周期(振荡器的倒数)最小,写做一个P,接着把这个X2,当作状态周期。

6个状态作为一个机器周期。

通常含一个机器周期的指令称为单周期指令,包含两个机器周期的指令称为双周期指令。

MCS-51中,按它们的长度可分为单字节指令、双字节指令和三字节指令。执行这些指令需要的时间是不同的,也就是它们所需的机器周期是不同的,有下面几种形式:

·单字节指令单机器周期·

单字节指令双机器周期·

双字节指令单机器周期·

双字节指令双机器周期·

三字节指令双机器周期·

单字节指令四机器周期(如单字节的乘除法指令)

寄存器

这里截取数据手册看看。注意看,都是使用的机器周期,好好牢记,6个状态一个机器周期。

寄存器

指令时序图

为了好说明指令在什么时候执行,这里就写:

寄存器

S1P2

S2P1

S取(1-6),P(1,2),就这样

S是6分频的时钟周期

寄存器

现在再看这个

S5P2,是不是可以看懂了。在第五个状态周期的第二个时钟周期进行对外采样。

遇到特别短的脉冲的时候要考虑这个,如果太短就捕获不到了。

再总结一下:

MCS-51的时序单位有四个,它们分别是节拍、状态、机器周期和指令周期。

·节拍与状态:我们把振荡脉冲的周期定义为节拍(为方便描述,用P表示),振荡脉冲经过二分频后即得到整个单片机工作系统的时钟信号,把时钟信号的周期定义为状态(用S表示),这样一个状态就有两个节拍,前半周期相应的节拍我们定义为1(P1),后半周期对应的节拍定义为2(P2)。 

·机器周期:MCS-51有固定的机器周期,规定一个机器周期有6个状态,分别表示为S1-S6,而一个状态包含两个节拍,那么一个机器周期就有12个节拍,我们可以记着S1P1、S1P2……S6P1、S6P2,一个机器周期共包含12个振荡脉冲,即机器周期就是振荡脉冲的12分频,显然,如果使用6MHz的时钟频率,一个机器周期就是2us,而如使用12MHz的时钟频率,一个机器周期就是1us。·指令周期:执行一条指令所需要的时间称为指令周期,MCS-51的指令有单字节、双字节和三字节的,所以它们的指令周期不尽相同,也就是说它们所需的机器周期不相同,可能包括一到四个不等的机器周期。

呼,文章虽然很长,但是对于定时器的内容,我还是没有写出来好难受。。。

审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分