微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > PIC单片机的红外遥控与解码

PIC单片机的红外遥控与解码

时间:11-09 来源:互联网 点击:

void interrupt main_int()
{

if(INTF&INTEDG)
{
GIE=0 ;
INTF=0 ;
TMR1ON=0;
frame.count=TMR1H*256+TMR1L;
TMR1H=0;
TMR1L=0;
TMR1ON=1;

switch(frame.ir_state)
{
case IR_IDLE :
if(frame.count>0x2000)//防止干扰
frame.ir_state=IR_START ;
break ;
case IR_START :
if(frame.ready==1)//没有处理,等待
{
frame.ir_state=IR_IDLE ;
return ;
}
if((frame.count>ms_125)&&(frame.count{
frame.add=0 ;
frame.addinv=0 ;
frame.data=0 ;
frame.datainv=0 ;
frame.ir_state=IR_ADD ;
frame.temp=1 ;
frame.ready=0 ;

}
else if((frame.count>ms_9)&&(frame.count{
frame.ready=1 ;
frame.ir_state = IR_IDLE ;

}
else//噪声?
{
frame.ir_state = IR_IDLE ;
}
break ;
case IR_ADD :
if(frame.count<0x280)//噪声?
return ;
if((frame.count>ms_168))//高电平?
frame.add|=frame.temp ;

frame.temp=frame.temp<1 ;
if(frame.temp==0x2000)//13位OK?
{
frame.ir_state=IR_ADDINV ;
frame.temp=1 ;
}
break ;
case IR_ADDINV :
//int_delay(75) ;
//if(RB0)
if(frame.count<0x280)
return ;
if((frame.count>ms_168))
frame.addinv|=frame.temp ;

frame.temp=frame.temp<1 ;
if(frame.temp==0x2000)//13位OK?
{
frame.ir_state=IR_DATA ;
frame.temp=1 ;
}
break ;
case IR_DATA :
if(frame.count<0x280)//噪声
return ;
if((frame.count>ms_168))//高电平
frame.data|=frame.temp ;

frame.temp=frame.temp<1 ;
if(frame.temp==0x0100)//8位 finished ?
{
frame.ir_state=IR_DATAINV ;
frame.temp=1 ;
}
break ;
case IR_DATAINV :
if(frame.count<0x280)
return ;
if((frame.count>ms_168))
frame.datainv|=frame.temp ;

frame.temp=frame.temp<1 ;
if(frame.temp==0x0080)//7 位 finished?
{
frame.temp=frame.temp<1 ;
int_delay(75) ;//延时等待最后一位的电平
if(RB0)
frame.datainv|=frame.temp ;
if((frame.data|frame.datainv==0xff)&&(frame.add==0x011F))
{
frame.ready=1 ;
}
frame.ir_state=IR_IDLE ;
}
break ;
default :
break ;
}
GIE=1 ;
}
}

void init_all()
{
init_232() ;
//init_hongwai() ;
INTCON=0 ;
INTE=1;//开RB电平中断
PEIE=1;
INTEDG=1 ;
TRISB0=1;//RB4为输入
T1CON=0 ;
TMR1H=0xAA ;
TMR1L=0xBB ;
frame.ir_state=IR_IDLE ;
GIE=1 ;
ADCON0=0x06 ;
TRISA0=0 ;
}
void main()
{
const char str[]= "hello world !" ;

init_all() ;
send_str(str) ;//测试串口
while(1)
{

if(frame.ready==1)
{
put_char(frame.data) ;
frame.ready=0 ;
}

}
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top