【原帖必看,不然你看不懂本帖】

【说明】:                       

[发送端]:

LED亮灭跟随发送状态

发送字符串"ABCDEFGHIJKLMNOP"

发送过程,用"春哥"的GBK码对字符串异或运算加密

 数据校验:采用反码校验,先发送源码,再发送反码,抗干扰

[接收端]

接收加密的源码,用"春哥"的GBK码对字符串异或运算解密,得到源码

接收反码,反码与源码比较

接收字符串

判断字符串,每个字符控制对应的LED亮灭

【效果图】                       

【发送端】                                   

/************************************程序名:    无线模块【发射端】程序编写人:    春哥 编写时间:  2015年10月31日硬件支持:  STC12C5A60S2 外部晶体12MHz接口说明:  P0.0接口发射,发送时LED亮,发送结束LED熄灭加密密文:    春哥 -->GBK:b4 ba b8 e7校验方式:    反码校验发送数据:    发送字符串"ABCDEFGHIJKLMNOP"/***********************************/#include 
 //单片机头文件sbit OUT  = P1 ^ 0;   sbit LED  = P0 ^ 0;  void DELAY_MS (unsigned int a){    unsigned int i;    while( a-- != 0){        for(i = 0; i < 600; i++);    }}void ST (void){//开始码    OUT = 1; //    DELAY_MS (6);    OUT = 0; //    DELAY_MS (4);} void BT (bit s){//数据位码    OUT = 1;     LED=!LED;  // LED=~LED发送状态指示      DELAY_MS (1);    OUT = 0;     DELAY_MS (1);    if(s)  DELAY_MS (1);} void MT (unsigned char a){  //8位的数据发送    unsigned char b,i,n;   a=a^0xB4^0xBA^0xB8^0xE7;// 数据加密 春哥汉字对应的GBK编码是 0xB4 0xBA 0xB8 0xE7;    b=~a;                   // 把源码变反码    for(i=0;i<8;i++){       // 发送源码        n = a & 0x80;        a = a << 1;        if(n == 0x80) BT(1);    else  BT(0);    }    for(i=0;i<8;i++){       //发送反码        n = b & 0x80;        b = b << 1;        if(n == 0x80) BT(1);        else BT(0);    } }void END (void){MT(0xff);}void str(unsigned char *str){  while(*str != '\0') MT (*str++);    *str = 0;} void main (void){    while(1){        ST();    str("ABCDEFGHIJKLMNOP");        END();        DELAY_MS (100);    }}

【接收端】                        

/************************************程序名:    无线模块【接收】程序编写人:    春哥 编写时间:  2015年10月31日硬件支持:  STC12C4052AD 外部晶体12MHz接口说明:  P3.4接口 接无线data ,LED共阳 解密密文:    春哥 -->GBK:b4 ba b8 e7接收字符:    接收字符串"ABCDEFGHIJKLMNOP"判断字符串"ABCDEFGHIJKLMNOP",控制LED亮灭***************************************/#include 
 //单片机头文件sbit IN =P3^4;sbit LED1=P1^0;sbit LED2=P1^1;sbit LED3=P1^2;sbit LED4=P1^3;sbit LED5=P1^4;sbit LED6=P1^5;sbit LED7=P1^6;sbit LED8=P1^7;unsigned char Ir_Buf[16]; //用于保存16个8位的源码结果unsigned char Ir_bak[16]; //用于保存16个8位的解码结果unsigned char re_char[]={"ABCDEFGHIJKLMNOP"}; //待验证的字符串unsigned char length=16; // 定义字符串长度给for用void DELAY_MS (unsigned int a){    unsigned int i;    while( a-- != 0)  for(i = 0; i < 600; i++);} unsigned int Ir_Get_Low(){    TL1=0;    TH1=0;    TR1=1;     // 如果是0就循环,不能超过32.768ms    while(!IN && (TH1&0x80)==0);                    TR1=0;               return TH1*256+TL1;} unsigned int Ir_Get_High(){    TL1=0;    TH1=0;    TR1=1;    // 如果是1就循环,不能超过32.768ms    while(IN && (TH1&0x80)==0);    TR1=0;    return TH1*256+TL1;} void main(void){ unsigned int temp; unsigned char i,j; TMOD=0x10; // 使用定时器1,设定16位的定时/计数器 while(1){ restart: while(!IN); temp=Ir_Get_High(); if(temp<5000 || temp>8000){ goto restart;  } temp=Ir_Get_Low();  if(temp<3000 || temp>6000){ goto restart;  }     //只有上面的两个标记都通过了,说明发送端 准备好了 for(i=0;i
1500) goto restart; temp=Ir_Get_Low();  if(temp<500 || temp>2500) goto restart; Ir_Buf[i]<<=1;   if(temp>1500)  Ir_Buf[i]|=0x01;   } for(j=0;j<8;j++){        //接收反码 temp=Ir_Get_High();  if(temp<500 || temp>1500) goto restart; temp=Ir_Get_Low();   if(temp<500 || temp>2500) goto restart; Ir_bak[i]<<=1;       if(temp>1500)  Ir_bak[i]|=0x01; } if(Ir_Buf[i] != ~Ir_bak[i]) goto restart; //反码字符校验 Ir_Buf[i]=Ir_Buf[i]^0xB4^0xBA^0xB8^0xE7;  //数据解密 春哥对应的GBK字符是0xB4 0xBA 0xB8 0xE7 } if(Ir_Buf[0]=='A') LED1=0; DELAY_MS(80);  if(Ir_Buf[1]=='B') LED2=0; DELAY_MS(80);  if(Ir_Buf[2]=='C') LED3=0; DELAY_MS(80); if(Ir_Buf[3]=='D') LED4=0; DELAY_MS(80);  if(Ir_Buf[4]=='E') LED5=0; DELAY_MS(80);  if(Ir_Buf[5]=='F') LED6=0; DELAY_MS(80);  if(Ir_Buf[6]=='G') LED7=0; DELAY_MS(80);  if(Ir_Buf[7]=='H') LED8=0; DELAY_MS(80);  if(Ir_Buf[8]=='I') LED1=1; DELAY_MS(80);  if(Ir_Buf[9]=='J') LED2=1; DELAY_MS(80);  if(Ir_Buf[10]=='K') LED3=1; DELAY_MS(80);  if(Ir_Buf[11]=='L') LED4=1; DELAY_MS(80);  if(Ir_Buf[12]=='M') LED5=1; DELAY_MS(80);  if(Ir_Buf[13]=='N') LED6=1; DELAY_MS(80);  if(Ir_Buf[14]=='O') LED7=1; DELAY_MS(80);  if(Ir_Buf[15]=='P') LED8=1; DELAY_MS(80);     }}