LINUX下使用簡單的中斷程序使單片機(jī)精確計時
在程序開始時需要對定時器及中斷寄存器做初始化設(shè)置:
對TMOD——定時器/計數(shù)器工作方式寄存器賦值,以確定T0和T1的工作方式。
計算初值,并將初值寫入TH0,TL0或TH1,TL1。
對IE——中斷允許寄存器的EA和ET0或ET1賦值,打開T0或T1。
使TR0或TR1置位,啟動定時器/計數(shù)器定時或計數(shù)。
詳細(xì)說明如下
一、TMOD是工作方式寄存器,D0~D3是定時器T0,D4~D7是定時器T1。D0~D3含義如下:
D0:M0。
D1:M1——M0和M1的四種組合方式?jīng)Q定了定時器/計數(shù)器的4種工作方式。當(dāng)M1=0,M0=1時是16位定時器/計數(shù)器。
D2:C/T——定時器模式和計時器模式選擇位,1為計數(shù)器模式,0為定時器模式。
D3:GATE——門控制位。為0時定時器/計數(shù)器的啟動與停止只與TCON寄存器的TRX(x=0,1)有關(guān);為1時由的TRX和外部中斷引腳上的電平狀態(tài)共同控制。
二、THX是高8位,TLX是低8位。(X=0,1)——假定M0=1,M1=0
設(shè)機(jī)器周期為T,想要設(shè)定定時器產(chǎn)生一次中斷的時間為t,那么需要計數(shù)的個數(shù)為N:
N=t/T
THX=(65536-N)/256
TLX=(65536-N)%256
三、中斷允許寄存器IE
D7:EA——全局中斷允許位。1打開;0關(guān)閉;
D3:ET1——T1中斷允許位。1打開;0關(guān)閉;
D1:ET0——T0中斷允許位。1打開;0關(guān)閉;
四、定時器/計數(shù)器控制寄存器TCON。
D7:TF1——定時器1溢出標(biāo)志位。
D6:TR1——定時器1運行控制位,與GATE的值有關(guān)。
D3:IE1——外部中斷請求標(biāo)志。
D2:IT1——外部中斷觸發(fā)方式選擇位。
下面是具體代碼:
#include<8052.h>uchartable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};uchartime=0,i;uintnum;voiddelayms(ucharx){uchari;while(x--){for(i=0;i<113;i++);}}voidmain(){P1_0=0;TMOD=0x01;//將工作方式寄存器TMOD置為00000001即M0=1,M1=0————工作方式一:16位定時器/計數(shù)器。同時C/T=0設(shè)置為定時器,GATE設(shè)為0。TH0=0x4c;//初始化T0的高8位寄存器TH0為(65536-46080)/256=76TL0=0x00;//初始化T0的低8位寄存器TL0為(65536-46080)%256=0EA=1;//中斷允許寄存器IE打開全局中斷控制ET0=1;//T0——定時器/計數(shù)器的開關(guān)在中斷允許寄存器IE的D1位TR0=1;//定時器/計數(shù)器控制允許寄存器TCON的D4位,在GATE為0的情況下,啟動,停止僅由TR0控制P1_1=1;P1_2=1;P0=table[num];while(1){P0=table[num%10];P1_1=1;delayms(5);P1_1=0;P0=table[num/10];P1_2=1;delayms(5);P1_2=0;if(i==60){break;}}P0=0x00;P1=0xff;while(1);}voidT0_time(void)__interrupt(1)__using(1){TH0=0x4c;//中斷時需要重新設(shè)置T0定時器寄存器的初值。TL0=0x00;time++;if(time==20){//每50ms中斷一次,因此中斷20次是1stime=0;num++;i++;}}