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

单片机编码 无线模块发送与接收 程序



【说明】:                       

[发送端]:

LED亮灭跟随发送状态

发送字符串"ABCDEFGHIJKLMNOP"

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

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


[接收端]

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

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

接收字符串

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


【效果图】                       

wKioL1Y2EtSj7sKJACUlnSme2mc479.jpg




【发送端】                                   

/************************************
程序名:    无线模块【发射端】程序
编写人:    春哥 
编写时间:  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); 
    }
}