【原帖必看,不然你看不懂本帖】
【说明】:
[发送端]:
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); } }