📄 ir.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 + -