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

📄 irq.c

📁 红外线接收头NEC码解码程序
💻 C
字号:

#pragma large
#include "public.h"

sfr WDT_CONTR = 0xE1;//看门狗
#define maxOverFlow 0xffff
#define oscFrequency  20000000


#define TMOD_AND_WORD   0xF0;
#define TMOD_TIME_MODE  0x01;
#define TMOD_COUNT_MODE 0x05;      //设置计数模式位  
sbit  TCON_ENABLE_TIMER = TCON^4;
sbit  TCON_TFx = TCON^5;           //中断标志位  
sbit  IE_ETx = IE^1;               //中断允许位为 ET0  
sbit  IP_PTx = IP^1;               //中断优先级  




UCHAR xdata gUartRxUser[100];	//串口发送缓冲区
UCHAR xdata gUartTxUser[100];	//串口发送缓冲区

unsigned char data gUartTxRead;
unsigned char data gUartTxWrite;



UCHAR gMainLoopTimeOut;
UINT   gDogCounter;		//看门狗计数器



unsigned char gAGCBrustFlag;	//9ms 引导码
unsigned char gSpaceFlag;//4.5ms
unsigned char lastth;
unsigned char lasttl;
unsigned short tmptimer;
unsigned char mAddr;
unsigned long mData;
unsigned char mBits;
unsigned char gFisrtBrust;
unsigned char mDataOK;

/*


  中断表	  索引
  /INT0			0
  TIMER0		1
  /INT1			2
  TIMER1		3
  UART			4
  TIMER2		5
  /INT2			6
  /INT3			7




*/

void timer0Int (void) interrupt 1 using 3
{
	TR0=0;
	gAGCBrustFlag=0;
	gFisrtBrust=0;
}
void Timer2Int(void)  interrupt 5  using 0
{
	
}
void Ex0Int(void)  interrupt 0 using 0
{
}
void Ex1Int(void)  interrupt 2  using 0
{
}
void Ex2Int(void)  interrupt 6 using 0
{

}
void Ex3Int(void)  interrupt 7  using 0
{
	
	//lastth=TH0;
	//lasttl=TL0;
	TR0=0;
	tmptimer=TH0;
	tmptimer<<=8;
	tmptimer+=TL0;
	TH0=0;
	TL0=0;
TR0=1;
	if(gFisrtBrust==0)
	{
		gFisrtBrust=1;
	}
	else
	{
		if(gAGCBrustFlag==0)
		{
			if(tmptimer<40000)//按键的重复
			{
				TR0=0;
					mBits=0;
					gUartTxUser[1]=mData>>24;
					gUartTxUser[2]=mData>>16;
					gUartTxUser[3]=mData>>8;
					gUartTxUser[4]=mData;
					gUartTxRead=1;
					gUartTxWrite=4;
					SBUF=gUartTxUser[1];
					gAGCBrustFlag=0;
					gFisrtBrust=0;
				mBits=0;
			}
			else
			{
				gAGCBrustFlag=1;//收到了引导码
				mBits=0;	
			}
	
		}
		else
		{
			if(mBits<32)
			{
			
				mData<<=1;
				mBits++;
				if(tmptimer<5617)//收到的为0
				{
					mData|=0;	
					
				}
				else //收到的为1
				{
					mData|=1;
				}
			}
			if(mBits>=32)
			{
					TR0=0;
					mBits=0;
					gUartTxUser[1]=mData>>24;
					gUartTxUser[2]=mData>>16;
					gUartTxUser[3]=mData>>8;
					gUartTxUser[4]=mData;
					gUartTxRead=1;
					gUartTxWrite=4;
					SBUF=gUartTxUser[1];
					gAGCBrustFlag=0;
					gFisrtBrust=0;
					
			}	
		}
	 }

	P3_5=!P3_5;	
}


void InitWatchCmd()
{
	WDT_CONTR=0x37;//WDT_EN=1 CLR_WDT=1 IDLE_WDT=0 PS2=1 PS1=1 PS0=1   6时钟模式 4.55s 复位
}



/**************************时钟中断处理函数*******************************
入口参数:	无

出口参数:	无

返 回 值:	无

功    能:	时钟中断处理函数

描    述:  50ms中断一次  公式:初值=65535-(20000000/6)*s	   //如果双倍速则为6 否则12
/**********************************************************************/
void Timer1Int(void)  interrupt 3  using 2
{
    TR1=0;	 //禁止计数
    TH1=0x00;
    TL1=0x00;
    TR1=1;	 //允许计数
	
    gDogCounter ++ ;

    if(gDogCounter>20)//500ms
    {
		
		gDogCounter=0;
		//主循环超时处理
        if(gMainLoopTimeOut>0)
        	gMainLoopTimeOut --;
		if(gMainLoopTimeOut ==0)  //当程序陷入死循环或跑飞时,进行软件狗复位
		{
			gMainLoopTimeOut = 1;
			return ;
		}
	
        //喂狗
       	WDT_CONTR=0x37;

       //Timer1000ms();
      
      
    }

}  
/**************************用户串口中断处理函数*******************************
入口参数:	无

出口参数:	无

返 回 值:	无

功    能:	用户串口中断处理函数

描    述:
/**********************************************************************/
void SerialDte(void) interrupt 4 using 1
{


	//UCHAR  ch;
	if(RI==1)
	{
		
	}
    if(TI==1)
    {
		if(gUartTxRead!=gUartTxWrite)
		{
			gUartTxRead=gUartTxRead+1;
			
			SBUF=gUartTxUser[gUartTxRead];    //发送一个字符后设置标志位空闲在主循环中进行发送
		
		}
		else
		{
        	;
			//gUartTxRead=0;
		}
		TI=0;
    }
}








	
	void InitTimer0 (void)            //串口初始化  
	{
		TR0 = 0;             //停止定时器  
		TMOD &= TMOD_AND_WORD;
		TMOD |= TMOD_TIME_MODE;

		IP_PTx = 1;                        //置中断优先级为最高3
		PT0H = 0;  
		IE_ETx = 1; 
		TR0 = 0;   
	}

void InitIR()
{
	gAGCBrustFlag=0;
	mBits=0;
	gFisrtBrust=0;
	
}
void OpenComm(unsigned long iBaudRate)
{
	
	unsigned short i;

	gUartTxWrite=0;
	gUartTxRead=0;



    //tm=  256 -  (oscFrequency/32/6/iBaudRate);     
    //TL1=tm;            //定时器1作为串口1的波特率发生器,公式:bps=11059200/32/12/(256-TH1) 接 9600波特率 目前在89c54中使用了双倍速,这里公式中除12改为除6
	//TH1=tm;             //
	
	T2CON=0x30;//bps mode
	i=  maxOverFlow -  (oscFrequency/16/iBaudRate)+1;     // T2=0ffffh-(11059200/(bps*16*2)),相同时不溢出。所有加一
    TL2=i&0xFF;
	TH2=(i&0xff00)>>8;
 	RCAP2L=i&0xFF;
 	RCAP2H=(i&0xFF00)>>8;



	REN=1; //允许串口接收位
		PS =0; //串行口中断声明为高优先级中断
	PSH = 0;  //优先级1
	TI=0;
	RI=0;
	ES= 1; //允许串行口中断
	//TR1=1; //开定时器1
	TR2=1;
   






}

⌨️ 快捷键说明

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