上一篇文章写了PI C最基本得入门的 闪灯程序,通过这个程序而欧美可以看到我们的 单片机的确开始按照我们的程序工作了,今天我们开始使用单片机里面的一个定时器的资源,即就是PIC里面的定时器,通过查询定时器是否计时到我们规定的值来决定我们是否要做什么事! PIC里面有3个定时器,比起51单片机多了一个定时器(哈哈)!分别为Timer0,Timer1,Timer2.分别说说每一个定时器吧:
Timer0是一个8为定时器,与看门狗公用一个8位预分配频器, 时钟源可以选择位内部时钟和外部时钟,通过设置OPTION_REG寄存器的PS2:0位的值可以选择不同的预分频比,根据选择的预分频比和系统震荡频率就可以计时定时了。
Timer1是一个16位的计时器,有一个3位预分频器,也就是意味着最多实现1:8的分频比,(随便说一下,要实现比较精确的定时的话,最好选择小一点的预分频比,最好是不分频),Timer1也可以选择内部或者是外部时钟。
Timer2是一个8为定时器,至今没用过Timer2,感觉还是Timer1用的比较舒服。
下面贴上最基本得Timer0的 定时器查询的闪灯程序,程序计时0.5秒灯闪一次。
#include
;程序采用可重定位的汇编编写
udata_shr
L1 res 1h ;为变量L1分配一个字节地址
reset code 0x0 ;程序开始地址
pagesel main
goto main
code
main
NOP
BANKSEL PORTA ;配置PORTA端口
CLRF PORTA
BANKSEL ANSEL ;端口PORTA为数字端口模式
CLRF ANSEL
BANKSEL TRISA
MOVLW B'00000000'
MOVWF TRISA ;PORTA所有位为输出
BANKSEL OPTION_REG
MOVLW B'11000100'
MOVWF OPTION_REG ;配置Timer0预分频为32分频
BANKSEL PORTA
INITTMR0
BCF INTCON,T0IF
MOVLW d'61' ;设置外面套的循环次数
MOVWF L1
LOOP
BTFSS INTCON,T0IF
GOTO LOOP
BCF INTCON,T0IF
DECFSZ L1,f ;外面套的循环
GOTO LOOP
MOVLW B'00000001'
XORWF PORTA,f ;取反RA0,让LED闪烁
GOTO INITTMR0
END