找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1432|回复: 0
收起左侧

红外遥控新增八位校验(有自己编写的数组进行)接收端该如何实现

[复制链接]
ID:117063 发表于 2016-4-27 14:59 | 显示全部楼层 |阅读模式

红外发射端
#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++;
}

接收端的程序不是特别理解,引导码发射过去后是需要怎么处理的?

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表