|
定時(shí)器中斷是由單片機(jī)中的定時(shí)器溢出而申請(qǐng)的中斷。
51單片機(jī)中有兩個(gè)定時(shí)器T0和T1:
TF0:定時(shí)器T0溢出中斷請(qǐng)求。當(dāng)定時(shí)器TO產(chǎn)生溢出時(shí),TO中斷請(qǐng)求標(biāo)志TF0置1,請(qǐng)求中斷處理。
TF1:定時(shí)器T1溢出中斷請(qǐng)求。當(dāng)定時(shí)器Tl產(chǎn)生溢出時(shí),T1中斷請(qǐng)求標(biāo)志TF1置1,請(qǐng)求中斷處理。
Stm32共有11個(gè)定時(shí)器:
1.兩個(gè)高級(jí)定時(shí)器:TIM1、TIM8-------------------------APB2
2.四個(gè)通用定時(shí)器:TIM2~TIM5-------------------------APB1
3.兩個(gè)基本定時(shí)器:TIM6、TIM7-------------------------APB1
4.兩個(gè)看門(mén)狗
5.一個(gè)系統(tǒng)嘀嗒定時(shí)器(SysTick)
定時(shí)/計(jì)數(shù)器
編輯
定時(shí)/計(jì)數(shù)器T0和T1分別是由兩個(gè)8位的專用寄存器組成,即定時(shí)/計(jì)數(shù)器T0由TH0和TL0組成,T1由TH1和TL1組成。此外,其內(nèi)部還有2個(gè)8位的特殊功能寄存器TMOD和TCON,TMOD負(fù)責(zé)控制和確定T0和T1的功能和工作模式,TCON用來(lái)控制T0和T1啟動(dòng)或停止計(jì)數(shù),同時(shí)包含定時(shí)/計(jì)數(shù)器的狀態(tài)。 [1]
TF1:定時(shí)器1溢出標(biāo)志。定時(shí)/計(jì)數(shù)器溢出時(shí)由硬件置位。中斷處理時(shí)由硬件清除。或用軟件清除。
TF0:定時(shí)器0溢出標(biāo)志。定時(shí)/計(jì)數(shù)器溢出時(shí)由硬件置位。中斷處理時(shí)由硬件清除,或用軟件清除。
工作流程
編輯
定時(shí)器工作的流程可以按照這個(gè)順序(以51為例用定時(shí)器0方式一產(chǎn)生10毫秒的定時(shí))
1、確定使用哪個(gè)定時(shí)器,使用哪種方式,這一步通過(guò)TMOD設(shè)置,TMOD的低四位是設(shè)置定時(shí)器0的,高四位是用來(lái)設(shè)置定時(shí)器1的,其中的M0,M1是用來(lái)設(shè)置定時(shí)器工作在哪種方式,GATE一般用不要設(shè)置,C/T是選擇計(jì)數(shù)模式還是定時(shí)模式的,如:TMOD = 0X01,就說(shuō)明定時(shí)器0工作在方式1。
2、接下來(lái)就要設(shè)置定時(shí)的時(shí)間,用定時(shí)器定時(shí)50毫秒,可以用這種方式TH0 = (65535 - 10000) / 256,TL0 = (65535 - 10000) % 256;可以這樣理解:因?yàn)檫@是定時(shí)器的初值,也就是說(shuō)計(jì)數(shù)脈沖就是在這個(gè)數(shù)的基礎(chǔ)上向上遞增,到達(dá)65535后就溢出產(chǎn)生中斷。
3、第三步打開(kāi)中斷,使用IE寄存器,首先打開(kāi)總中斷EA = 1,這一步是所有中斷所必須的,然后打開(kāi)定時(shí)器0中斷,ET0 =1。
4、這時(shí)準(zhǔn)備工作結(jié)束,啟動(dòng)定時(shí)器,使用TCON寄存器,TR0 = 1,實(shí)現(xiàn)了一個(gè)10毫秒的定時(shí)。
代碼如下:(中斷時(shí)間根據(jù)情況改變)
#include <reg51.h>
#include <delay.h>
sbit key1 = P0^0;
sbit LED1 = P3^0;
#define DataPort P1 //宏定義,如果換接口,需要修改這里
sbit Seg_Latch = P2^2; //段鎖存
sbit Bit_Latch = P2^3; //位鎖存
unsigned char code Seg_Code[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //段碼
unsigned char code Bit_Code[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //位碼
void Display(unsigned char m,unsigned char num,unsigned int n);
unsigned char i;
void main()
{
TMOD = 0x01;
EA = 1; //開(kāi)中斷
ET0 = 1;
//因?yàn)橹挥幸粋(gè)中斷,所以IP不用設(shè)置
TH0 = (65536 - 400) / 256;
TL0 = (65536 - 400) % 256;
TR0 = 1; //開(kāi)啟定時(shí)器0,等待中斷的到來(lái)
while(1)
{
key1 = 1;
if(!key1) //按下key1
{
DelayMs(50);
if(!key1) //判斷key1是否持續(xù)按下,進(jìn)行防抖測(cè)試
{
// while(!key1) //
{
LED1 = ~LED1;
}
while(!key1);
LED1 = 1;
}
i++;
if(i > 19)
{
i = 0;
}
Display(1,2,i);
}
}
}
void Display(unsigned char m,unsigned char num,unsigned int n) //兩位共陰極數(shù)碼管顯示數(shù)字
{
unsigned char j,a[5];
a[0] = n / 10;
a[1] = n % 10;
for(j = m-1;j < num;j++)
{
DataPort = 0;
Seg_Latch = 1; //段開(kāi)門(mén)
Seg_Latch = 0; //段關(guān)門(mén)
DataPort = Bit_Code[j]; //送位碼,鎖定第m位
Bit_Latch = 1; //位開(kāi)門(mén)
Bit_Latch = 0; //位關(guān)門(mén)
DataPort = Seg_Code[a[j]]; //送段碼
Seg_Latch = 1; //段開(kāi)門(mén)
Seg_Latch = 0; //段關(guān)門(mén)
}
}
void T0_ISR(void) interrupt 1
{
unsigned char j;
EA = 0; //如果你不想被其他中斷打斷,屏蔽中斷
TH0 = (65536 - 400) / 256; //
TL0 = (65536 - 400) % 256;
Display(1,2,i);
EA = 1;
}
|
評(píng)分
-
查看全部評(píng)分
|