您的位置:首页 > 运维架构

无线模块数据加密,反码校验,发送字符串"ABCDEFGHIJKLMNOP" LED频闪

2015-11-01 21:27 543 查看
【原帖必看,不然你看不懂本帖】单片机编码 无线模块发送与接收 程序

【说明】:
[发送端]:
LED亮灭跟随发送状态
发送字符串"ABCDEFGHIJKLMNOP"
发送过程,用"春哥"的GBK码对字符串异或运算加密
数据校验:采用反码校验,先发送源码,再发送反码,抗干扰

[接收端]
接收加密的源码,用"春哥"的GBK码对字符串异或运算解密,得到源码
接收反码,反码与源码比较
接收字符串

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

【效果图】





【发送端】
/************************************
程序名:    无线模块【发射端】程序
编写人:    春哥 
编写时间:  2015年10月31日
硬件支持:  STC12C5A60S2 外部晶体12MHz
接口说明:  P0.0接口发射,发送时LED亮,发送结束LED熄灭
加密密文:    春哥 -->GBK:b4 ba b8 e7
校验方式:    反码校验
发送数据:    发送字符串"ABCDEFGHIJKLMNOP"
/***********************************/
#include <STC12C5A60S2.H> //单片机头文件
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 <STC12C2052AD.H> //单片机头文件
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<length;i++){    //接收length个字节
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_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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息