当前位置:文档之家› PIC单片机timer中断实例

PIC单片机timer中断实例

/***************************************************************************************************
工程名称: Timer_IRQ
功能描述: Timer0实现1s定时,RD低四位取反控制LED低四位,Timer1实现0.5s定时,RD高四位取反控制LED高四位
维护记录: 2011-8-22
***************************************************************************************************/
#include //头文件在HI-TECH安装目录下\HI-TECH Software\PICC\std\9.60\include

#define uchar unsigned char
#define uint unsigned int

uint temp1,temp2;

//***********************************************************************************
//延时
//***********************************************************************************
void delay(uint time)
{
uint i,j;
for(i = 0;i < time; i++)
{
for(j = 0;j < 30; j++);
}
}
//***********************************************************************************
//IO初始化操作
//***********************************************************************************
void IO_init(void)
{
TRISD=0x00; //RD设置为输出
PORTD=0xff; //初始化为高
}
//***********************************************************************************
//timer0初始化
//***********************************************************************************
void timer0_init(void) //fosc/4=4M/4所以计数周期为1us
{
T0CS=0; //timer0工作于定时器方式
PSA=1; //timer0不分频
T0IF=0; //清timer0中断标志
T0IE=1; //timer0中断允许
TMR0=0xAA; /*置初值,定时100us。因为写入TMR0后接着的两个周期不能增量,
中断需要3个周期的响应时间,以及C语言自动进行现场保护要消
耗周期,取修正值15,所以只需要定时100-15=85us
初值=255-85=0xaa*/
GIE=1; //开总中断
}
//***********************************************************************************
//timer1初始化
//***********************************************************************************
void timer1_init(void) //fosc/4=4M/4所以计数周期为1us
{
T1CON=0X01; //16位定时方式
TMR1IF=0; //清timer1中断标志
TMR1IE=1; //timer1中断允许
TMR1H=0xFC; /*置初值,TMR1每1ms中断一次。因为写入TMR1后接着的两个周期不能增量,
中断需要3个周期的响应时间,以及C语言自动进行现场保护要消
耗周期,取修正值15,所以只需要定时1000-15=985us
初值=65535-985=0xFC26*/
TMR1L=0x26;
PEIE=1; //允许外围中断
GIE=1; //开总中断
}


//*************************************************

**********************************
//中断服务子程序
//***********************************************************************************
void interrupt ISR(void)
{
// Timer0 interrupt service routine
if(TMR0IF==1)
{
TMR0=0xAA; //每100us中断一次对TMR0写入一个调整值。
T0IF=0; //清timer0中断标志
temp1++; //中断次数加1
if(temp1>9999) //中断10000次后,为1秒
{
temp1=0; //中断次数清0
RD0=!RD0;RD1=!RD1; RD2=!RD2; RD3=!RD3;//取反控制RD低4位LED发光或熄灭
}
}

// Timer1 interrupt service routine
if(TMR1IF==1)
{
TMR1H=0XFC; //中断一次对TMR1写入一个调整值。
TMR1L=0x26;
TMR1IF=0; //清timer1中断标志
temp2++; //中断次数加1
if(temp2>499) //中断500次后,为0.5秒
{
temp2=0; //中断次数清0
RD4=!RD4; RD5=!RD5; RD6=!RD6; RD7=!RD7; //取反控制RD高4位LED发光或熄灭
}
}
}
//***********************************************************************************
//主函数
//***********************************************************************************
main()
{
__CONFIG(XT&WDTDIS&LVPDIS); //配置,设置为晶振XT方式振荡,禁看门狗,禁低电压编程
IO_init(); //IO初始化
timer0_init(); //定时器0初始化
timer1_init(); //定时器1初始化
while(1); //死循环
}

//******************************************程序结束*****************************************

相关主题
文本预览
相关文档 最新文档