⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 interrupt.c

📁 以C8051F020单片机做的多功能计数器
💻 C
字号:
/*********interrupt.c****************/
#include "interrrupt.h"
extern xdata uchar state;
extern xdata uchar liangcheng;
extern xdata refreshTime;
extern xdata refreshTemp;

idata Counter periodCounters[COUNTERS_LEN];
Counter periodCounter;
//uint counts[6];
//uint count=0;
idata uchar DownCount=0 ;
bit T2ExDown2=0;
xdata uchar CountFor1s=0;


#define IGNORE 4 

void InitInterrupt();						//初始化中断

void InitInterrupt()
{
//	PCA0MD=0x0B;//使用外时钟8分频,允许CF中断
//	EIE1 =0x08;//EPCA0置1,允许PCA0中断

	
	EX0=1;//外部中断0
	IT1=1;//沿触发方式
	//IT1=0;//
	CKCON=0xF0;	//定时器1,2,4系统时钟不分频,定时器0使用12分频

	TMOD=0x21;
	TH0=0;TL0=0;

	PT0=0;//低优先级
	ET0=1;
	TR0=1;

	EA=1;	
	//EX1=1;//打开外部中断1
	//IT1=0;//电平触发方式
	
	//EIE2=0x10;//打开外部中断6
	//P3IF=0x00;//使用默认值,下降沿触发


}


void INT1() interrupt 2 using 1 //外部中断1
{
	if(++DownCount<=8)//if(++DownCount<=2*IGNORE)
		return;//舍弃前IGNORE次结果

	if(DownCount%2==1)
	{
		//periodCounter.Low16=
		TR1=1;	//开定时器
	}
	else
	{
		TR1=0;
		periodCounters[DownCount/2-5]=periodCounter;//periodCounters[DownCount/2-(IGNORE+1)]=periodCounter;
		periodCounter=0;			
	}
	if(DownCount==20)//if(DownCount==((IGNORE*+COUNTERS_LEN)*2))
	{
		ET1=0;	
		EX1=0;//关闭外部中断0	
		DownCount=0;
	//	interrupted=1;
		state=CALCU;
	}

	
}



void Timer1() interrupt 3 using 3	
{
	periodCounter++;
	
//	TEST=!TEST;
}


void Timer0() interrupt 1 using 1
{
	++CountFor1s;
	if(32==CountFor1s)
		refreshTime=1;
	if(64==CountFor1s)
	{
		refreshTime=1;
		refreshTemp=1;
		CountFor1s=0;
	}
}


/*
void PCATimer() interrupt 9 using 3
{
	TR1=0;

}*/


//way 1
void Timer2() interrupt 5 using 2 //the number of the input pulse  arrived 65536	
{
	TR1=0;
	TR2=0;
	EA=0;
	
	periodCounters[DownCount++]=periodCounter;
	periodCounter=0;

	if(DownCount==3)
	{
		DownCount=0;
		ET2=0;
		ET1=0;
		state=CALCU;
	}
	else
	{	
		switch(liangcheng)
		{
		case 4:break;
		case 3:TH2=0xfc;TL2=0x18;break;//1000 periods
		case 2:TH2=0xff;TL2=0x9c;break;//100 periods
		case 1:TH2=0xff;TL2=0xf6;//10 periods
		case 5:TH2=0xff;TL2=0xfb;//2 periods
		}
	
		EA=1;
		TR1=1;
		TR2=1;	
	}
	TF2=0;

}


		
/*
//way 2

void Timer2() interrupt 5 using 2 //
{

	if(EXF2)
   {
      EXF2 = 0;                        // Reset Capture Flag

   }
   else if(TF2)
   {
      TF2 = 0;
   }


if(T2ExDown2==0)
	{
		T2ExDown2=1;	
	}
	else
	{
		periodCounter=RCAP2H*256+RCAP2L ;
		EXEN2=0;
		T2ExDown2=0;	
		TR2=0;
		TH2=0;
		TL2=0;
	}
	EXF2=0;	
}
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -