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);//構(gòu)成32位的一個數(shù)據(jù)組,為發(fā)送紅外信號做準備
//發(fā)送數(shù)據(jù)開始
//1.先發(fā)送9ms的載波數(shù)據(jù)
PWM_38KHZ(1);
DELAY_US(9000);
//2.然后發(fā)送4.5ms的低電平數(shù)據(jù)
PWM_38KHZ(0);
DELAY_US(4500);
//3.發(fā)送完引導(dǎo)碼后,就可以開始傳輸數(shù)據(jù)
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;//設(shè)置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(); //接收引導(dǎo)碼,先是9ms的低電平
if(time<7000||time>10000)return;//判斷時間是否在區(qū)域內(nèi)波動,否則不是數(shù)據(jù)
time=GET_TIMEH(); //接收引導(dǎo)碼,接下來是4.5ms的高電平
if(time<4000||time>5000)return;//判斷時間是否在區(qū)域內(nèi)波動,否則不是數(shù)據(jù)
//如果以上都成立,則表示引導(dǎo)碼正確,接下來就可開始接收數(shù)據(jù)了
for(x=0;x<4;x++)
{
for(y=0;y<8;y++)
{
time=GET_TIMEL();//判斷低電平的時間,是不是560us
if(time<460||time>660)return;//如果時間不在范圍內(nèi),則直接退出函數(shù)
time=GET_TIMEH();//判斷高電平持續(xù)的時間,判斷接收到的數(shù)據(jù)是高電平還是低電平
if(time>460&&time<660)//接收低電平的數(shù)據(jù)
{
date>>=1;
}
else if(time>1580&&time<1800)
{
date>>=1;
date |=0x80;
}
}
infr_buff[x]=date;
}
infr_buff[4]=1;//表示解碼成功
}
解碼和編碼的代碼 |