看了很多几本单片机的书,对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的指令有单字节、双字节和三字节的,所以它们的指令周期不尽相同,也就是说它们所需的机器周期不相同,可能包括一到四个不等的机器周期。
呼,文章虽然很长,但是对于定时器的内容,我还是没有写出来好难受。。。
审核编辑:刘清
评论
查看更多