PIC 系列单片机内部配备有数量不等的定时器/计数器模块:例如PIC17CX系列和PIC18CX系列都都配置了4个定时器/计数器模块;而PIC16F87X系列都配置了3个定时器/计数器模块,分别记为TMR0、TMR1和TMR2。
TMR0、TMR1和TMR2在电路上均不相同,而且用途也各有所异,但是三者也存在许多共同之处。这里主要介绍的是TMR0,TMRl和TMR2将在后面介绍。 其实定时器都是一个由时钟信号触发的递增的计数器;都是从预先设定的初始值开始累计,在累计数超过最大值,或者超过预先设定的值时便产生溢出,并同时会建立一个相应的溢出标志(即中断标志位)。
①核心部分是一个8位宽,在时钟信号上升沿触发的循环累加计数寄存器TMR0;最大位数:256
②TMR0是一个特殊功能寄存器,地址为01H或101H;
③有一个可选用的8位可编程分频器;
④信号源可以是内部时钟信号源(定时器模式),也可以是外部时钟信号源(计数器模式)。 ⑤当使用外部触发信号作为时钟信号源时,可定义触发方式,即上升沿触发或下降沿触发;
⑥具有溢出中断功能。
与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信号。
前面介绍了用软件方式实现延时,下面利用定时器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