52单片机中定时/计数器2的研究 .
来源:互联网 发布:linux网络yum源 编辑:程序博客网 时间:2024/05/24 07:06
网上关于讲52单片机定时/计数器2的资料不是很多,因为它被用得较少,后来我只能根据网上的资料和我的不断的尝试,从简单实例入手去研究,才才搞透定时/计数器2的使用,才实现了中断和定时的复用。下面是我搜到的定时器2寄存器的一些资料,比较可靠。
定时器T2的功能比T1、T0都强大,但描述它的资料不多,可能是使用得比较少的缘故吧。它是一个16位的具有自动重装和捕获能力的定时/计数器,它的计数时钟源可以是内部的机器周期,也可以是P1.0输入的外部时钟脉冲。T2的控制寄存器的功能描述如下:
T2CON(T2的控制寄存器),字节地址0C8H:
位地址 0CFH 0CEH 0CDH 0CCH 0CBH 0CAH 0C9H 0C8H
符 号 TF2 EXF2 RCLK TCLK EXEN2 TR2 C/T2 CP/RT2
各位的定义如下:
TF2:定时/计数器2溢出标志,T2溢出时置位,并申请中断。只能用软件清除,但T2作为波特率发生器使用的时候,(即RCLK=1或TCLK=1),T2溢出时不对TF2置位。
EXF2:当EXEN2=1时,且T2EX引脚(P1.0)出现负跳变而造成T2的捕获或重装的时候,EXF2置位并申请中断。EXF2也是只能通过软件来清除的。
RCLK:串行接收时钟标志,只能通过软件的置位或清除;用来选择T1(RCLK=0)还是T2(RCLK=1)来作为串行接收的波特率产生器
TCLK:串行发送时钟标志,只能通过软件的置位或清除;用来选择T1(TCLK=0)还是T2(TCLK=1)来作为串行发送的波特率产生器
EXEN2:T2的外部允许标志,只能通过软件的置位或清除;EXEN2=0:禁止外部时钟触发T2;EXEN2=1:当T2未用作串行波特率发生器时,允许外部时钟触发T2,当T2EX引脚输入一个负跳变的时候,将引起T2的捕获或重装,并置位EXF2,申请中断。
TR2:T2的启动控制标志;TR2=0:停止T2;TR2=1:启动T2
C/T2:T2的定时方式或计数方式选择位。只能通过软件的置位或清除;C/T2=0:选择T2为定时器方式;C/T2=1:选择T2为计数器方式,下降沿触发。
CP/RT2:捕获/重装载标志,只能通过软件的置位或清除。CP/RT2=0时,选择重装载方式,这时若T2溢出(EXEN2=0时)或者T2EX引脚(P1.0)出现负跳变(EXEN2=1时),将会引起T2重装载;CP/RT2=1时,选择捕获方式,这时若T2EX引脚(P1.0)出现负跳变(EXEN2=1时),将会引起T2捕获操作。但是如果RCLK=1或TCLK=1时,CP/RT2控制位不起作用的,被强制工作于定时器溢出自动重装载模式。
T2MOD(方式寄存器),字节地址0C9H:
D7 D6 D5 D4 D3 D2 D1 D0
-- -- -- -- -- -- T2OE DCEN
T2OE:T2输出允许位,当T2OE=1的时候,允许时钟输出到P1.0。(仅对80C54/80C58有效)
DCEN:向下计数允许位。DCEN=1是允许T2向下计数,否则向上计数。
T2的数据寄存器TH2、TL2和T0、T1的用法一样,而捕获寄存器RCAP2H、RCAP2L只是在捕获方式下,产生捕获操作时自动保存TH2、TL2的值。
以上是T2的相关寄存器的描述,其实用法上跟T0、T1是差不多的,只是功能增强了,设置的东西多了而已。
定时/计数器2其实用到最多的就是T2CON这个寄存器啦,它设定的定时和计数的方式。有三种工作方式,捕获,自动重装,波特率发生器。下面我是在百度百科里面找的少许资料:
捕获方式:
在捕获方式下,通过T2CON控制位EXEN2 来选择两种方式。如果EXEN2=0,定时器2 是一个16 位定时器或计数器,计数溢出时,对T2CON 的溢出标志TF2 置位,同时激活中断。如果EXEN2=1,定时器2 完成相同的操作,而当T2EX 引脚外部输入信号发生1 至0 负跳变时,也出现TH2 和TL2 中的值分别被捕获到RCAP2H 和RCAP2L 中。另外,T2EX 引脚信号的跳变使得T2CON 中的EXF2 置位,与TF2 相仿,EXF2 也会激活中断。捕获方式如图4 所示。
自动重装载(向上或向下计数器)方式:
当定时器2工作于16位自动重装载方式时,能对其编程为向上或向下计数方式,这个功能可通过特殊功能寄存器T2CON(见表5)的DCEN 位(允许向下计数)来选择的。复位时,DCEN 位置“0”,定时器2 默认设置为向上计数。当DCEN置位时,定时器2 既可向上计数也可向下计数,这取决于T2EX 引脚的值,参见图5,当DCEN=0 时,定时器2 自动设置为向上计数,在这种方式下,T2CON 中的EXEN2 控制位有两种选择,若EXEN2=0,定时器2 为向上计数至0FFFFH 溢出,置位TF2 激活中断,同时把16 位计数寄存器RCAP2H 和RCAP2L重装载,RCAP2H 和RCAP2L 的值可由软件预置。若EXEN2=1,定时器2 的16 位重装载由溢出或外部输入端T2EX 从1 至0 的下降沿触发。这个脉冲使EXF2 置位,如果中断允许,同样产生中断。
定时器2 的中断入口地址是:002BH ——0032H 。
当DCEN=1时,允许定时器2 向上或向下计数,如图6 所示。这种方式下,T2EX 引脚控制计数器方向。T2EX 引脚为逻辑“1”时,定时器向上计数,当计数0FFFFH 向上溢出时,置位TF2,同时把16 位计数寄存器RCAP2H 和RCAP2L重装载到TH2 和TL2 中。 T2EX 引脚为逻辑“0”时,定时器2 向下计数,当TH2 和TL2 中的数值等于RCAP2H 和RCAP2L中的值时,计数溢出,置位TF2,同时将0FFFFH 数值重新装入定时寄存器中。
当定时/计数器2向上溢出或向下溢出时,置位EXF2 位。
波特率发生器:
当T2CON(表3)中的TCLK 和RCLK 置位时,定时/计数器2 作为波特率发生器使用。如果定时/计数器2 作为发送器或接收器,其发送和接收的波特率可以是不同的,定时器1 用于其它功能,如图7 所示。若RCLK 和TCLK 置位,则定时器2工作于波特率发生器方式。
波特率发生器的方式与自动重装载方式相仿,在此方式下,TH2翻转使定时器2 的寄存器用RCAP2H 和RCAP2L 中的16位数值重新装载,该数值由软件设置。
在方式1 和方式3 中,波特率由定时器2 的溢出速率根据下式确定:
方式1和3的波特率=定时器的溢出率/16
定时器既能工作于定时方式也能工作于计数方式,在大多数的应用中,是工作在定时方式(C/T2=0)。定时器2 作为波特率发生器时,与作为定时器的操作是不同的,通常作为定时器时,在每个机器周期(1/12 振荡频率)寄存器的值加1,而作为波特率发生器使用时,在每个状态时间(1/2 振荡频率)寄存器的值加1。波特率的计算公式如下:
方式1和3的波特率=振荡频率/{32*[65536-(RCP2H,RCP2L)]}式中(RCAP2H,RCAP2L)是RCAP2H 和RCAP2L中的16 位无符号数。
定时器2 作为波特率发生器使用的电路如图7 所示。T2CON 中的RCLK 或TCLK=1 时,波特率工作方式才有效。在波特率发生器工作方式中,TH2 翻转不能使TF2 置位,故而不产生中断。但若EXEN2 置位,且T2EX 端产生由1 至0 的负跳变,则会使EXF2 置位,此时并不能将(RCAP2H,RCAP2L)的内容重新装入TH2 和TL2 中。所以,当定时器2 作为波特率发生器使用时,T2EX 可作为附加的外部中断源来使用。需要注意的是,当定时器2 工作于波特率器时,作为定时器运行(TR2=1)时,并不能访问TH2 和TL2。因为此时每个状态时间定时器都会加1,对其读写将得到一个不确定的数值。
然而,对RCAP2则可读而不可写,因为写入操作将是重新装载,写入操作可能令写和/或重装载出错。在访问定时器2或RCAP2 寄存器之前,应将定时器关闭(清除TR2)。
回到主题,其实我要研究,是如何先让定时器先产生下降沿中断,软后中断函数里面又开始定时。其实说来也很简单,因为只要置EXEN2=1,而且不开启定时功能,也就是置TR2=0后,如果有外部下降沿脉冲输入T2EX(P1.1)引脚,那么就产生中断,那么就可以在中断函数中置TR2=1,设置定时器初值,这样就开启了定时器,实现了定时功能。总之,这个TR2设置很关键。这样就实现了先中断,软后立即定时。其实也可以用T2EX口完全做外部下降沿脉冲的中断的,只要一直设置TR2=0就行了,我这里只不过是要用到定时功能而已。
下面我是用汇编语言写的一个单片机程序,实现了先做外部中断后定时的功能。
T2CON EQU 0C8HT2MOD EQU 0C9HCP EQU T2CON.0TR2 EQU T2CON.2EXEN2 EQU T2CON.3EXF2 EQU T2CON.6TF2 EQU T2CON.7 ET2 EQU IE.5RCAP2L EQU 0CAHRCAP2H EQU 0CBHTL2 EQU 0CCHTH2 EQU 0CDHORG 0000HLJMP MAINORG 002BH ;T0中断入口LJMP T2 ;转到T0中断服务程序ORG 0030HMAIN:SETB EASETB ET2SETB EXEN2MOV R1,#00HLP:SJMP LPT2:CLR TF2 ;注意外部有方波信号输入T2EX口,引发中断CLR EXF2CJNE R1,#00H,TT2SETB TR2 ;开启定时功能MOV TH2,#0F2HMOV TL2,#0FAH INC R1RETITT2:CJNE R1,#01H,TTT3INC R1MOV TH2,#0D8HMOV TL2,#0EFHSETB P1.2 ;第一次定时到输出一个脉冲信号LCALL DELAYCLR P1.2RETITTT3:CJNE R1,#02H,ESCCLR TR2 ;关闭定时,等待下一次下降沿中断MOV R1,#00HSETB P1.3 ;第二次定时到又输出一个脉冲信号LCALL DELAYCLR P1.3ESC:RETIDELAY: ;触发脉冲宽度延时程序 MOV R0, #0FHDL_M: DJNZ R0, DL_M RETEND
方波可以可以作为外部中断信号从T2EX口输入,当它的下降沿到来时可以定时器2触发中断,开启定时模式,然后定时器2进入定时器2进入定时模式,定时一段时间后输入一个脉冲信号,然后还有定时一段时间,输出另外一个脉冲信号。
总结:根据我这几天的学习,关于定时/计数器2的其他功能也没有详细去了解,不过让我了解到52的定时器2的确比定时器0和1要复杂和强大。首先一点就是他可以用作外部下降沿中断,虽然用计数的方式的方式也可以实现外部中断,但它的功能更强大。
- 52单片机中定时/计数器2的研究
- 52单片机中定时/计数器2的研究 .
- 单片机的定时/计数器
- 51单片机的定时/计数器
- 51单片机定时/计数器的功能实现
- 单片机之定时/计数器
- 单片机定时/计数器
- 51单片机定时计数器
- 【51单片机学习过程记录】9 中断之定时计数器0的使用2
- 单片机定时/计数器的四种工作方式
- 51单片机的中断与定时计数器尝试
- 51定时器/计数器的深入研究-精确定时
- 学习笔记之-51单片机定时计数器
- 80C52、AT89C52的定时/计数器2
- 关于51单片机学习中计数器/定时器中断的理解
- 51单片机中定时器/计数器初值的计算
- 基于proteus的51单片机仿真实例五十七、定时器/计数器T0的定时实例
- 基于proteus的51单片机仿真实例五十八、定时器/计数器T1的定时实例
- C++中const的用法
- 写在前面
- 2013秋13级预备队集训练习2 --D - Artificial Intelligence?
- 【Qt移植到linux】问题 qt界面无法输入中文,中文不显示,乱码等问题
- 简单的多模块Maven工程
- 52单片机中定时/计数器2的研究 .
- java中各种地址总结
- Java 正则表达式
- 输入框中输入汉字时自动联想相似数据方法使用小结
- VirtualBox更改虚拟硬盘 VDI文件空间大小的方法(特别注意空格和中文)
- 福州大学第十届程序设计竞赛——神庙逃亡——物理题
- 十大降低人才流失率的方法
- #define ## # #@
- 图像处理-线性滤波-1 基础(相关算子、卷积算子、边缘效应)