PIC18f2580下TMR0定时器初值设置方法

机器频率Fosc:单片机的振荡频率,如果用外置的晶振电路,晶振上会有频率标志,常用的有4MHz、8MHz、20MHz等,本例使用的是4MHz。

机器周期Tosc:机器频率的倒数,本例中Fosc=4MHz,Tosc=1/4=0.25us

指令周期:运行一条指令所需的时间,等于4个机器周期,本例中机器周期为0.25us,则指令周期为1us。

【注】PIC系列大部分为单指令周期,就是说一条指令运行只需要一个指令周期的时间。但有有几条指令,允许需要两个指令周期的时间;如RETURN、GOTO等;而有些指令需要1~2个指令周期,需要具体分析,如DECFSZ,如果无调整只需1指令周期,如果有跳转则需要2个指令周期。


定时时间的计算.假设Timer0用的时钟源是内部的4MHZ,那么每条指令的执行时间就是 1us,设Timer0的预分频系数是1:256,TMR0的初值是6,那么定时时间为: 
256×(256-6)×1us=64ms

  256×(256-6)×(1/4M*4)=64ms

(4M/4)/256/250=16HZ。    

     参见: bit 5 T0CS:Timer0 Clock Source Select bit

1 = Transition on T0CKI pin input edge
0
= Internal clock (F OSC /4)

源程序:

#include 

void initPORTB(void);
void initTMR0(void);
void interrupt TMR0INT(void);
int coun=0;
bit abc=0b0;

void main(){
	initPORTB();
	initTMR0();
	while(1){}
}

void initPORTB(){
	TRISB=0x00;
	PORTB=0x00;
}

void initTMR0(){	
	//T0CON=0x89;	//10001001 89
	T0CON=0xc7;	//11000111 c7  8位定时器方式 256分频
	TMR0IF=0;
	TMR0IE=1;
	GIE=1;
//	TMR0H=0x00;
	TMR0L=0x06;
}

void interrupt TMR0INT(void){
//if(TMR0IF==1)
//{
	GIE=0;

	//	TMR0H=0x00;
		TMR0L=0x06;	
		TMR0IF=0;
//	PORTB=coun&0x0f;
//	if(coun==10)
//	{
		coun=0;
		RB0=abc;
		abc=!abc;
//	}
	coun++;		
	GIE=1;
//}
}

	



例如:10ms延时


#include   
  
void initPORTB(void);  
void initTMR0(void);  
void interrupt TMR0INT(void);  
int coun=0;  
bit abc=0b0;  
  
void main(){  
    initPORTB();  
    initTMR0();  
    while(1){}  
}  
  
void initPORTB(){  
    TRISB=0x00;  
    PORTB=0x00;  
}  
  
void initTMR0(){      
    T0CON=0x89; //10001001 89 使能TMR0,工作于16位定时器方式,使用内部时钟,不分频  
    TMR0IF=0;  
    TMR0IE=1;  
    GIE=1;  
    TMR0H=0xd9;  
    TMR0L=0x00;  
}  
  
void interrupt TMR0INT(void){  
//if(TMR0IF==1)  
//{  
    GIE=0;  
  
        TMR0H=0xd9;//FFFF-D900=9983 采用4M晶振。指令周期1us,  
        TMR0L=0x00;//故对TMR0写入10ms(即9983*1us)定时调整值9983  
      
        TMR0IF=0;  
//  PORTB=coun&0x0f;  
//  if(coun==10)  
//  {  
        coun=0;  
        RB0=abc;  
        abc=!abc;  
//  }  
    coun++;       
    GIE=1;  
//}  
} 







你可能感兴趣的:(单片机)