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