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

2019-04-15 11:49发布

机器频率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; //} }