PIC单片机入门_定时器/计数器TMR0详解与实例

2019-04-15 11:35发布

1.前言:

PIC 系列单片机内部配备有数量不等的定时器/计数器模块:例如PIC17CX系列和PIC18CX系列都都配置了4个定时器/计数器模块;而PIC16F87X系列都配置了3个定时器/计数器模块,分别记为TMR0、TMR1和TMR2
TMR0、TMR1和TMR2在电路上均不相同,而且用途也各有所异,但是三者也存在许多共同之处。这里主要介绍的是TMR0,TMRl和TMR2将在后面介绍。
其实定时器都是一个由时钟信号触发的递增的计数器;都是从预先设定的初始值开始累计,在累计数超过最大值,或者超过预先设定的值时便产生溢出,并同时会建立一个相应的溢出标志(即中断标志位)。        

2.TMR0的特性

①核心部分是一个8位宽,在时钟信号上升沿触发的循环累加计数寄存器TMR0;最大位数:256
②TMR0是一个特殊功能寄存器,地址为01H或101H;
③有一个可选用的8位可编程分频器; 
信号源可以是内部时钟信号源(定时器模式),也可以是外部时钟信号源(计数器模式)。     当使用外部触发信号作为时钟信号源时,可定义触发方式,即上升沿触发或下降沿触发;
具有溢出中断功能

3.与TMR0模块相关的寄存器

与TMR0模块有关的特殊功能寄存器有四个:8位的累加寄存器TMR0中断控制寄存器INTCON选项寄存器OPTION_REG端口RA方向控制寄存器TRISA,如下表所列。


以上4个寄存器都是特殊功能寄存器,可以把它们当做普通RAM单元来进行读写访问。我挑几个起控制作用的寄存器进行介绍。

3.1 选项寄存器OPTION_REG      


选项寄存器是一个可读、写的寄存器,与TMR0有关各位的含义如下: 
⑴PS2~PS0:分频器分频比选择位。如下表所列:
⑵PSA:分频器分配位。  1=分频器分配给WDT;0=分频器分配给TMR0。  
⑶T0SE:TMR0时钟源触发边沿选择位,只有当TMR0工作于计数器模式时,该位才有效。1=外部时钟T0CKI下降沿触发TMR0递增; 0=外部时钟T0CKI上升沿触发TMR0递增。 ⑷T0CS:TMR0的时钟源选择位;1=由T0CKI外部引脚输入的脉冲作为TMR0时钟源;0=由内部提供的指令周期信号作为TMR0时钟源。

3.2 中断控制寄存器INTCON


中断控制寄存器也是一个可读/写的寄存器,与TMR0有关的各位的含义如下:    
T0IF:TMR0溢出标志位(也就是溢出中断标志)。l=TMR0发生溢出;0=TMR0未发生溢出。
T0IE:TMR0溢出中断使能位。l=允许TMR0溢出后产生中断;    0=屏蔽TMR0溢出后产生中断。
GIE:全局中断总使能位。1=允许CPU响应所有外围设备产生的中断请求;0=禁止CPU响应所有外围设备产生的中断请求。

3.3 端口RA方向控制寄存器TRISA(外部触发引脚复用)

TRISA4:由于TMR0的外部输入信号T0CKI与端口RA4是复合在同一条脚上的,当TMR0工作于计数模式时,要求该脚必须设置为输入方式,作为T0CKI信号专用输入引脚1=引脚RA4设为输入,以便从该脚送进T0CK1信号。

4.TMR0的电路结构和工作原理

定时器/计数器TMR0的结构方框图如图所示:

在图可以将整个电路按功能简化为三个相对独立的主要组成部分:计数寄存器TMR0、分频器和看门狗定时器WDT。因为看门狗在电路上与TMR0之间共同分享同一个分频器,于是两者就有了同时出现在同一张图上。

4.1 分频器

看门狗定时器WDT与TMR0共同分享一个分频器,但两者不能同时使用。即在同一时刻,分频器只能分配给两者中之一。分频器也是一个8位累加计数器,不过它不能像TMR0那样直接进行读、写操作,它只能配合TMR0或WDT起分频作用。当PSA=0时,分频器归TMR0所有,进入累加器TMR0的时钟信号,都要先经过分频器;而当PSA=1时,分频器与TMR0隔离,进入TMR0的时钟信号,不再经过分频器
当分频器分配给TMR0时,任何以TMR0为目标的写操作指令(如CLRF TMR0 , MOVWF TMR0 )都会将分频器清0;当分频器分配给WDT时,执行CLRWDT的指令将会同时将其分频器清零。注意分频器清零时,而分频比和分配对象并不会改变。

4.2 TMR0 累加计数寄存器

定时器/计数器TMR0 既可以作为定时器使用,也可以作为计数器使用,即TMR0有定时和计数两种工作模式。
两种模式的差异就是进入TMR0的时钟信号源不同,TMR0的工作模式由T0CS位,即选项寄存器OPTION_REG位5决定。
1.定时器模式: 当T0CS=0时,TMR0为定时器模式, TMR0的触发信号来自于内部的指令周期信号。在定时器模式下,一旦往TMR0中写入初始值,TMR0便启动累加计数。未使用分频器时,TMR0会在每个指令周期信号到来时自动加1;使用了分频器时,TMR0会在收到n个指令周期信号后自动加1, n 由分频比决定。
2.计数器模式:工作在计数器模式时,T0SE位决定了外部时钟信号的触发边沿:T0SE=1,下降沿触发;T0SE=0,上升沿触发。TMR0工作于计数器模式时,一旦往计数寄存器中写入初始值后,TMR0立即开始新一轮的累加计数。
没有使用分频器时,TMR0会在每个T0CKI信号的上升沿或下降沿到来时自动加1。在此模式下,外部随机送入的脉冲信号和内部的工作时钟之间存在一个同步的问题。也就是说,并不是外部触发信号一进入,TMR0就立即加1,而是要经过一个同步逻辑,外部信号与系统时钟同步之后,方能进入累加计数器TMR0,引发 一次加1操作。

5.TIMER0应用实例

前面介绍了用软件方式实现延时,下面利用定时器TMR0来实现硬件延时。
把PIC单片机演示板上的8只LED发光二极管,设计为轮流发光,也就是在下图所示 16 个状态间轮流切换,并且在各个状态之间切换时,插入256 ms的延时。

8只LED的亮灭规律符合数据结构中的队列操作规则:“最先移入队列的亮灯,最先移出队列”。即开始亮灯的顺序是:LED0→ LED1 LED0 →…. LED7… LED0 。熄灯的顺序也是以上顺序。 
软件设计
⒈延时时间设计:
 当8个LED在16个状态之间切换时,要插入256 ms的延时;每个灯在发光时有闪烁,即每个灯不断在“亮-灭”, “亮-灭”之间的延时为64 ms ,这些延时要求由TMR0产生。
⒉  定时器/计数器TMR0控制字设计:
将分频器配置给TMR0使用,即PSA=0;分频比设定为最大(1:256),即PS2~PS0=111;那么OPTION_REG=07H (00000111B)。
TMR0的初值X计算(假设Tcyc=1μs) :
                 256*(256-X)*Tcyc =64000μs
                 X=256-64000/256=6 (关键是要找到这个初值,启动定时器的时候,把它装进去)
⒊设计一个查表子程序READ ,在表中预先存储要显示的状态, LED显示码可以调用READ获取。
⒋程序流程图如下:

程序清单
TMR0 EQU 01H ;定义寄存器的位置 PCL EQU 02H ;定义程序计数器低字节寄存器地址 STATUS EQU 03H ;定义状态寄存器地址 OPTION EQU 81H ;定义选项寄存器位置 INTCON EQU 0BH ;定义中断寄存器位置 PORTC EQU 07H ;定义PORTC的存储位置 TRISC EQU 87H TMR0B EQU 6 ;定义TMR0寄存器初始值 COUNT EQU 20H ;定义一个计数器变量 RP0 EQU 5 ;定义RAM的页选位RP0 ORG 000H BSF STATUS, RP0 ;转向RAM的体1 MOVLW 00H ;将端口C设为输出 MOVWF TRISC ;**********TMR0延时子程序(64 MS)************* DELAY BCF INTCON,2 ;清除TMR0溢出标志位 MOVLW TMR0B ;TMR0赋初值 MOVWF TMR0 ; 并重新启动定时计数 LOOP1 BTFSS INTCON,2 ;检测TMR0溢出标志位 GOTO LOOP1 ; 没有溢出,循环检测 RETURN ; 子程序返回 ;********** 读取显示信息的查表子程序************ READ ADDWF PCL,1 ; 地址偏移量加当前PC值 RETLW B'00000001' ;显示信息码,下同 RETLW B'00000011' RETLW B'00000111 ' RETLW B'00001111' RETLW B'00011111' RETLW B'00111111' RETLW B'01111111' RETLW B'11111111' RETLW B'11111110' RETLW B'11111100' RETLW B'11111000' RETLW B'11110000' RETLW B'11100000' RETLW B'11000000' RETLW B'10000000' RETLW B'00000000' END