红外发射端
#include <reg52.h>
#include "red.h"
uchar encryption_table[4][8];
char mima_table[4][8]=
{{1,0,1,0,1,0,0,0},
{0,1,0,1,0,1,0,1},
{1,0,1,0,1,0,1,0},
{1,1,1,1,1,0,1,1}};
unsigned char i,j[4];
void delay_ms(uint ms)
{
uint i,j;
for(i=0;i<120;i++)
{
for(j=0;j<ms;j++);
}
}
void encryption()
{
uchar i,n,table;
for(n=0;n<8;n++)
{
encryption_table[0][n]=j[1]&0x80;
j[1]<<=1;
}
for(n=0;n<8;n++)
{
encryption_table[1][n]=j[2]&0x80;
j[2]<<=1;
}
for(n=0;n<8;n++)
{
encryption_table[2][n]=j[3]&0x80;
j[3]<<=1;
}
for(n=0;n<8;n++)
{
encryption_table[3][n]=j[4]&0x80;
j[4]<<=1;
}
for(i=0;i<4;i++)
{
for(n=0;n<8;n++)
{
encryption_table[i][n]=mima_table[i][n];
}
}
for(n=0;n<4;n++)
{
for(i=0;i<8;i++)
{
j[n]<<=1;
table=encryption_table[n][i]&0x08;
j[n]=j[n]|table;
}
}
}
//T1 13us2úéúò»′ÎÖD¶Ï óÃóú2úéú38KÔØ2¨
//T0 ·½ê½1 16λ óÃóú¶¨ê±
void Init_Timer(void)
{
TMOD=0x21; //T0 mode 1 T1 mode 2
TH1=256-(1000*11.0592/38.0/12)/2+0.5;
//ìØêa
TL1=TH1;
ET1=1;
EA=1;
}
//·¢Ëíòyμ¼Âë ·¢Ëí·½:4.5ms¸ßμçƽ 4.5msμíμçƽ
void Send_Start_Bit(void) //TR1μÄÖμ=·¢ËíμÄμçƽ
{
//4.5ms 1
TH0=(65536-8295)/256;
TL0=(65536-8295)%256;
TR0=1;
TR1=1;
while(!TF0);
TR2=0;
TF0=0;
TR0=0;
IR_OUT=0;
//4.5ms 0
TH0=(65536-4146)/256;
TL0=(65536-4146)%256;
TR0=1;
TR1=0;
while(!TF0);
TR1=0;
TF0=0;
TR0=0;
IR_OUT=0;
}
//·¢Ëí0
void Send_Bit_0(void)
{
//0.565ms 1
TH0=(65536-521)/256;
TL0=(65536-521)%256;
TR0=1;
TR1=1;
while(!TF0);
TR1=0;
TF0=0;
TR0=0;
IR_OUT=0;
//0.565ms 0
TH0=(65536-521)/256;
TL0=(65536-521)%256;
TR0=1;
TR1=0;
while(!TF0);
TR1=0;
TF0=0;
TR0=0;
IR_OUT=0;
}
//·¢Ëí1
void Send_Bit_1(void)
{
//0.565ms 1
TH0=(65536-521)/256;
TL0=(65536-521)%256;
TR0=1;
TR1=1;
while(!TF0);
TR1=0;
TF0=0;
TR0=0;
IR_OUT=0;
//1.685ms 0
TH0=(65536-1563)/256;
TL0=(65536-1563)%256;
TR0=1;
TR1=0;
while(!TF0);
TR1=0;
TF0=0;
TR0=0;
IR_OUT=0;
}
void Send_over(void) //·¢Ëíò»¸ö½áêøÂ룬òòÎa×îoóò»¸öλֻóDóöμ½Ï½μÑØ2ÅÄü¶áè¡£¨·¢éä¶ËμÄéÏéyÑØ£©
{
//0.500ms 1 //D¡óú0.5ms ½óêÕ¶ËoüÄÑ궱eμ½
TH0=(65536-500)/256;
TL0=(65536-500)%256;
TR0=1;
TR1=1;
while(!TF0);
TR1=0;
TF0=0;
TR0=0;
IR_OUT=0;
//0.500ms 0
TH0=(65536-500)/256;
TL0=(65536-500)%256;
TR0=1;
TR1=0;
while(!TF0);
TR1=0;
TF0=0;
TR0=0;
IR_OUT=0;
}
//·¢Ëíò»×Ö½ú 8λ
void Send_Char()
{
uchar i;
Send_Start_Bit();
encryption();//¼óÃü
j2=~j1;
j4=~j3;
// ·¢éäòyμ¼Âe
for(i=0;i<8;i++)
{
if(j1&0x80)
Send_Bit_0();
else
Send_Bit_1();
j1=j1<<1;
//Ïè·¢éäμíλ
}
for(i=0;i<8;i++)
{
if(j2&0x80)
Send_Bit_0();
else
Send_Bit_1();
j2=j2<<1;
//Ïè·¢éäμíλ
}
for(i=0;i<8;i++)
{
if(j3&0x80)
Send_Bit_0();
else
Send_Bit_1();
j3=j3<<1;
//Ïè·¢éäμíλ
}
for(i=0;i<8;i++)
{
if(j4&0x80)
Send_Bit_0();
else
Send_Bit_1();
j4=j4<<1;
//Ïè·¢éäμíλ
}
Send_over();
//½áêø·û
}
void main(void)
{
Init_Timer();
while(1)
{
if(key1==0)
{
delay_ms(5);
if(key1==0)
{
j2=0xaa;
j1=~j2;
j4=0x26;
j3=~j4;
Send_Char();
delay_ms(1000);
}
while(!key1);
}
if(key2==0)
{
delay_ms(5);
if(key2==0)
{
j2=0xaa;
j1=~j2;
j1=~j2;
j4=0x01;
j3=~j4;
Send_Char();
delay_ms(1000);
}
while(!key2);
}
}
}
//¶¨ê±Æ÷1
void T1_ISR(void) interrupt 3
{
IR_OUT=!IR_OUT;
}
接收端的处理
uchar irnum;
bit irnum_ok;
uchar irtime;
bit startflag;
bit irok,ircode_ok;
uchar i;
uchar irdate[33];
uchar ircode[4];
uchar irtable[]="0123456789ABCDEF";
void ir_code()
{
uchar num,j,k,m;
m=1;
num=0;
for(k=0;k<4;k++)
{
for(j=0;j<8;j++)
{
num>>=1;
if(irdate[m]>6)
num=num|0x80;
m++;
}
ircode[k]=num;
num=0;
}
if(ircode[2]=~ircode[3])
ircode_ok=1;
}
void irdisplay()
{
uchar j;
setwindow(4,0);
for(j=0;j<4;j++)
{
write_date(irtable[ircode[j]/16]);
write_date(irtable[ircode[j]%16]);
if(j<3)
write_date('-');
}
}
void irchange()
{
if(ircode[2]==0x80)
{
irnum_ok=1;
irnum=0;
}
else if(ircode[2]==0x64)
{
irnum_ok=1;
irnum=1;
}
else irnum_ok=0 ;
}
void ex0init()
{
IT0=1;
EX0=1;
EA=1;
}
void ex0() interrupt 0
{
if(startflag)
{
if(irtime>43&&irtime<63)
i=0;
irdate[i]=irtime;
irtime=0;
i++;
if(i==33)
{
i=0;
irok=1;
}
}
else
{
irtime=0;
startflag=1;
}
}
void time0init()
{
TMOD=0x02;
TH0=0X00;
TL0=0X00;
ET0=1;
TR0=1;
}
void time0() interrupt 1
{
irtime++;
现在想在send_char后面继续发八位进行校验(有数组循环,每次的数字不同),想问下接收端需要如何更好
补充的校验程序
void Send_jiaoyan()
{
uchar i;
static int j;
char jiaoyan[]=
{};
for(i=0;i<8;i++)
{
if(jiaoyan[j]&0x80)
Send_Bit_0();
else
Send_Bit_1();
jiaoyan[j]=jiaoyan[j]<<1;
}
j++;
}
接收端的程序不是特别理解,引导码发射过去后是需要怎么处理的?
|