void SEND_NEC_DATA(u8 user,u8 key)
{
u16 date_H=0;
u16 date_L=0;
u32 date=0;
u8 x=0;
date_H=((~key&0xFF)<<8)|((key&0xFF)<<0);
date_L=((~user&0xFF)<<8)|((user&0xFF)<<0);
date=((u32)date_H<<16)|(date_L<<0);//构成32位的一个数据组,为发送红外信号做准备
//发送数据开始
//1.先发送9ms的载波数据
PWM_38KHZ(1);
DELAY_US(9000);
//2.然后发送4.5ms的低电平数据
PWM_38KHZ(0);
DELAY_US(4500);
//3.发送完引导码后,就可以开始传输数据
for(x=0;x<32;x++)
{
PWM_38KHZ(1);
DELAY_US(460);
if(date&0x01)
{
PWM_38KHZ(0);
DELAY_US(1540);
}
else
{
PWM_38KHZ(0);
DELAY_US(425);
}
date>>=1;
}
PWM_38KHZ(1);
DELAY_US(560);
PWM_38KHZ(0);
DELAY_US(1000);
flag=0;
}
int main(void)
{
P1M1=0x00;
P1M2=0x00;//设置P1口为准双向口
P0M1=0x00;
P0M2=0x00;
// IO_Init();
// EA=1;
while(1)
{
if(infr_buff[4]==1)
{
infr_buff[4]=0;
P10=~P10;
}
SEND_NEC_DATA(0x00,0x02);
DELAY_US(65000);
P11=~P11;
}
return 0;
}
//IO口中断
void PinInterrupt_ISR (void) interrupt 7
{
u16 time=0;
u16 x,y;
u8 date=0;
time=GET_TIMEL(); //接收引导码,先是9ms的低电平
if(time<7000||time>10000)return;//判断时间是否在区域内波动,否则不是数据
time=GET_TIMEH(); //接收引导码,接下来是4.5ms的高电平
if(time<4000||time>5000)return;//判断时间是否在区域内波动,否则不是数据
//如果以上都成立,则表示引导码正确,接下来就可开始接收数据了
for(x=0;x<4;x++)
{
for(y=0;y<8;y++)
{
time=GET_TIMEL();//判断低电平的时间,是不是560us
if(time<460||time>660)return;//如果时间不在范围内,则直接退出函数
time=GET_TIMEH();//判断高电平持续的时间,判断接收到的数据是高电平还是低电平
if(time>460&&time<660)//接收低电平的数据
{
date>>=1;
}
else if(time>1580&&time<1800)
{
date>>=1;
date |=0x80;
}
}
infr_buff[x]=date;
}
infr_buff[4]=1;//表示解码成功
}
解码和编码的代码 |