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

📄 ir.c

📁 PIC MCU操作rpm871/873红外收发模块的C源代码,用PICC1618编译,MCU时钟为4M时实用,其它时钟需要修改延时参数.
💻 C
字号:




/********************************************************
使用前请预先定义如下端口,并设定其端口方向
	IRPM:	IR电源管理,输出端口
	IR_TX:	数据发送端口,输出端口
	IR_RX:	数据接收端口,输入端口
其中IR_RX为外部中断输入,下降沿触发,可以不使用中断。
在接收中断中占用TMR1资源;
发送数据,程序自动打开IR电源,结束后自动恢复电源模式;
接收数据必须在准备接收前1mS打开电源;
数据发送是基于ASCII码,遇‘\0’则发送结束(发送‘\0’)
*********************************************************/

/*******************************************
				调用函数定义
********************************************/
	void IrOn(void);	//开启IR通信
	void IrOff(void);	//关闭IR通信
	void IrSend(unsigned char *spt);
	unsigned char IrRead(unsigned char *RTpt);

/*******************************************
				端口定义
********************************************/
	#define IRPM		//IR电源管理
	#define IRPM_T		//端口方向控制
	#define IR_TX		//数据发送端口
	#define IR_TX_T		//端口方向控制
	#define IR_RX		//数据接收端口(必须为外中断输入口,下降沿触发)
	#define IR_RX_T		//端口方向控制	


/*******************************************
延时函数D9uS()
  作用:延时9uS
********************************************/
	void D9uS(void)
	{
	 asm("nop");	asm("nop");
	 asm("nop");	asm("nop");
	}
/*******************************************
延时函数D27uS()
  作用:延时27uS
********************************************/
	void D27uS(void)
	{
 	 unsigned char cnt;
	 for(cnt=5;cnt>0;cnt--)
	 	{asm("nop");}
	 asm("nop");
	}

/*******************************************
延时函数d1mS()
  作用:延时1mS
********************************************/
	void D1mS(void)
	{
	 unsigned char cnt;
	 for(cnt=248;cnt>0;cnt--)
	 	{asm("nop");}
	 asm("nop");asm("nop");
	}
/*******************************************
延时函数D169uS()
  作用:延时169uS
********************************************/
	void D169uS(void)
	{
 	 unsigned char cnt;
	 for(cnt=40;cnt>0;cnt--)
	 	{asm("nop");}
	 asm("nop");asm("nop");asm("nop");
	}
/*******************************************
延时函数D158uS()
  作用:延时158uS
********************************************/
	void D158uS(void)
	{
 	 unsigned char cnt;
	 for(cnt=38;cnt>0;cnt--)
	 	{asm("nop");}
	}

/******************************************
红外通信初始化函数IrInit(void)
  作用:设置端口,进入工作模式
  入口:无
  出口:无
*******************************************/
	void IrOn(void)
	{
	 IRPM_T=0;		//端口方向控制
	 IR_TX_T=0;		//端口方向控制
	 IR_RX_T=1;		//端口方向控制
	 IRPM=0;		//IR电源管理
	 IR_TX=0;		//数据发送端口
	//若用中断方式,此处增加中断设置
	}

/******************************************
红外通信关闭函数IrOff(void)
  作用:关闭红外通信
  入口:无
  出口:无
*******************************************/
	void IrOff(void)
	{
	 IRPM_T=0;		//端口方向控制
	 IR_TX_T=0;		//端口方向控制
	 IR_RX_T=1;		//端口方向控制
	 IRPM=1;		//IR电源管理
	 IR_TX=0;		//数据发送端口
	//若用中断方式,此处增加关闭中断
	}

/******************************************
红外信号发射函数IrSend()
  作用:发射红外线信号
  入口:字符串地址指针
  出口:无
*******************************************/
	void IrSend(unsigned char *spt)
	{
	 unsigned char data,cnt;
	 unsigned char backup;
	// 电源管理
	 backup=0;
	 if(INTE)
		{INTE=0;backup|=1;}
	 if(IRPM)
		{IRPM=0;backup|=2;D1mS();}
	 //发射起始码(4个20uS周期方波脉冲)
	 IR_TX=1;	 D9uS(); IR_TX=0;	 D169uS();
	 IR_TX=1;	 D9uS(); IR_TX=0;	 D169uS();
	 IR_TX=1;	 D9uS(); IR_TX=0;	 D169uS();
	 IR_TX=1;	 D9uS(); IR_TX=0;	 D158uS();
	//发送数据(0为100uS周期10uS脉冲,1为50uS周期10uS脉冲)
	 for(;*spt!='\0';spt++)
		{
		 data=*spt;		//加载数据
		 for(cnt=8;cnt>0;cnt--)
			{
			 IR_TX=1;D9uS();IR_TX=0;	//产生10uS脉冲信号
			 if(data&0x01)
				{					//1发送(40uS低电平)
				 if(cnt==1)			//数据加载时间补偿
					{D9uS();D9uS();asm("nop");asm("nop");}
				 else
					{D27uS();}
				}
			 else
				{					//0发送(90uS低电平)
				 if(cnt==1)
					{				//数据加载时间补偿
					 D27uS();D27uS();D9uS();
					 asm("nop");asm("nop");asm("nop");
					 asm("nop");asm("nop");asm("nop");
					}
				 else
					{
					 D27uS();D27uS();D9uS();D9uS();
					 asm("nop");asm("nop");asm("nop");
					 asm("nop");asm("nop");asm("nop");
					}
				 }
			 data>>=1;
			}
		}
	//发送‘\0’字符
	 for(cnt=8;cnt>0;cnt--)
		{	//8个100uS周期uS脉冲
		 IR_TX=1;	D9uS(); IR_TX=0;asm("nop");
		 D27uS();D27uS();D27uS();;asm("nop");
		 asm("nop");asm("nop");asm("nop");
		}
	 //发送结束码(1个130uS周期10uS脉冲)
	 IR_TX=1;	 D9uS(); IR_TX=0;
	 D27uS();D27uS();D27uS();D27uS();
	 D9uS();asm("nop");asm("nop");
  	 IR_TX=1;	 D9uS(); IR_TX=0;	D9uS(); 
	 //电源管理
	 if(backup&0x01)
		{INTF=0;INTE=1;}
	 if(backup&0x02)
		{IRPM=1;}
	}

/******************************************
接收处理函数IrRead(*RTpt)
  作用:接收IR数据
  入口:数据缓冲区首地址;
  出口:返回1,收到合法数据;
		返回0,未收到有效数据
*******************************************/
	unsigned char IrRead(unsigned char *RTpt)
	{
	 unsigned char cnt,temp_int,data_int,extcnt;
	 TMR1ON=0;TMR1L=2;INTF=0;extcnt=255;	//清除中断标志
	 while(!INTF);
		{
		 if(extcnt==0)
			{goto EXTINT;}
		 else
			{extcnt--;}
		}
	 TMR1ON=1;INTF=0;
	 while(1)
		{
		 extcnt=255;	//清除中断标志
		 while(!INTF);
			{
			 if(extcnt==0)
				{goto EXTINT;}
			 else
				{extcnt--;}
			}
		 temp_int=TMR1L;
		 TMR1L=3;TMR1H=0;INTF=0;
		 if((temp_int>=170)&&(temp_int<=190))// 起始码
			{data_int=0;cnt=0;}
		 else if((temp_int>=40)&&(temp_int<=60))//数据1
			{
			 data_int>>=1;
			 data_int|=0x80;
			 cnt++;
			 if(cnt>=8)
				{cnt=0;*RTpt=data_int;RTpt++;}
			}
		 else if((temp_int>=90)&&(temp_int<=110))//数据0
			{
			 data_int>>=1;
			 data_int&=0x7f;
			 cnt++;
			 if(cnt>=8)
				{cnt=0;*RTpt=data_int;RTpt++;}
			}
		 else if((temp_int>=120)&&(temp_int<=140))//结束码
			{
			 if(cnt==0)
				{data_int=1;}
			 else
				{data_int=0;}
			 INTF=0;TMR1ON=0;break;
			}
		 else
			{
EXTINT:		 data_int=0;
			 INTF=0;TMR1ON=0;break;
			}
		}
	 return(data_int);		 
	}

⌨️ 快捷键说明

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