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