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