一、結構
1、TMR1可以作為通用的定時器和計數(shù)器,也可以利用內置的低頻時基振蕩器實現(xiàn)實時時鐘RTC功能;通過TMR1與CCP模塊的配合使用,TMR1還可以實現(xiàn)輸入捕捉和輸出比較功能。
TMR1是一個16位的可讀可寫的計數(shù)寄存器,由高低兩字節(jié)組成(TMR1H和TMR1L)16位寄存器從0000H到FFFFH加1計數(shù),然后回到0000H。在從FFFFH到0000H的過程中,置位中斷標志位TMR1。
TMR1帶有一個3位的可編程預分頻器和一個低功耗低頻時基振蕩器。
二、特點
1、由16位的時鐘信號上升沿觸發(fā)的累加計數(shù)寄存器對 TMR1H,TMR1L;
2、TMR1H和TMR1L是在RAM中統(tǒng)一編址的寄存器對,地址為0EH和0FH,可用軟件的方式讀/寫TMR1寄存器對的內容;
3、一個可選用的3位可編程的預分頻器;
4、累加計數(shù)的信號源可以選擇內部系統(tǒng)時鐘、外部觸發(fā)信號或自帶時基振蕩器信號;
5、既可工作于定時器模式,又可以工作于計數(shù)器模式,還可以用作實時時鐘RTC;
6、在計數(shù)溢出時,相應的溢出中斷標志自動置位,并可產(chǎn)生溢出中斷。
三、相關寄存器
1、中斷控制寄存器 INTCON
2、第一外設中斷標志寄存器 PIR1
3、第一外設中斷使能寄存器 PIE1
4、計數(shù)寄存器 TMR1H和TMR1L
5、控制寄存器 T1CON
四、工作方式
TMR1兩種工作方式:定時器方式和計數(shù)器方式,其中計數(shù)器方式又分為同步計數(shù)器方式和異步計數(shù)器方式。
TMR1的時鐘信號或者觸發(fā)信號共有3種獲取方式:
1、有內部系統(tǒng)時鐘4分頻后獲取,即取自指令周期
2、從RC0/T1OSO/T1CKI和RC1/T1OSI/CCP2引腳獲取
3、振蕩器產(chǎn)生
五、使用定時器TMR1注意事項
1、當對寄存器TMR1H和TMR1L進行初始化時,預分頻器將會自動清零
2、在寄存器對TMR1H和TMR1L進行寫操作時,可以使預分頻器清零。當TMR1處于運行狀態(tài)時,對于寄存器TMR1H和TMR
1L值進行的寫操作,可能會寫入不希望的值
3、TMR1工作于異步計數(shù)器方式時,不能作為CCP模塊的輸入捕捉或輸出比較的時間基準。
4、在上電復位(POR)或者其他復位時,TMR1H和TMR1L的內容保持原有數(shù)值,不會復位到0000H
5、在上電復位或掉電復位時,控制寄存器T1CON的內容將回到00H,并關閉TMR1,且預分頻器的分頻比設定為缺省值
1:1。在所有的其他復位時,均不會影響T1CON寄存器的值。
6、如果在復位時需要將TMR1H和TMR1L的內容回到00H,可以用程序實現(xiàn),即先將TMR1關閉,然后分別將寄存器TMR1H和TMR1L清零
六、使用方式
1 void main()
2 {
3 unsigned int num;
4 /*
5 預分頻器1:256,賦值61 256-61=195
6 */
7 INTCON = 0xc0;//開總中斷,開第一外設中斷
8 PIE1 = 0x01;//使能定時器1中斷
9 //賦值 50ms
10 TMR1H = (65536-50000)/256;
11 TMR1L = (65536-50000)%256;
12 T1CON = 0x01;//啟動定時器,不使用預分頻器
13
14 while(1)
15 {
16 if(20 == num)
17 {
18 num = 0;//計數(shù)清零
19 //功能1
20 {
21
22 }
23 }
24 }
25 }
26
27 void interrupt timer1() //中斷函數(shù)不需要調用
28 {
29 //注意進入中斷T0IF已經(jīng)置1
30 TMR1IF = 0//標志位清零
31 //重新賦值
32 TMR1H = (65536-50000)/256;
33 TMR1L = (65536-50000)%256;
34 num++;
35 }
使用預分頻器
1 void main()
2 {
3 unsigned int num;
4 /*
5 預分頻器1:8
6 */
7 INTCON = 0xc0;//開總中斷,開第一外設中斷
8 PIE1 = 0x01;//使能定時器1中斷
9 //賦值 50ms
10 TMR1H = (65536-50000)/256;
11 TMR1L = (65536-50000)%256;
12 T1CON = 0x31;//啟動定時器,預分頻器1:8
13
14 while(1)
15 {
16 if(20 == num)//8s
17 {
18 num = 0;//計數(shù)清零
19 //功能1
20 {
21
22 }
23 }
24 }
25 }
26
27 void interrupt timer1() //中斷函數(shù)不需要調用
28 {
29 //注意進入中斷T0IF已經(jīng)置1
30 TMR1IF = 0//標志位清零
31 //重新賦值
32 TMR1H = (65536-50000)/256;
33 TMR1L = (65536-50000)%256;
34 num++;
35 }