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

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

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

【说明】:                       

[发送端]:

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); 
    }
}
时间: 2024-10-10 10:28:07

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

51单片机对无线模块nRF24L01简单的控制收发程序

它的一些物理特性如工作频段.供电电压.数据传输速率就不详细介绍了,直接上代码. 1.首先是发送端: // Define SPI pins #include <reg51.h> #define uchar unsigned char /***************************************************/ #define TX_ADR_WIDTH 5 // 5字节宽度的发送/接收地址 #define TX_PLOAD_WIDTH 4 // 数据通道有效数据宽度

如何使用无线模块WizFi210的HTTP功能?

 点击了解:无线模块WizFi210 1.HTTP和HTTPS简介 1.1 HTTP简介 HTTP即超文本传输协议(Hyper Text Transfer Protocol),客户端(User Agent)通过WEB浏览器或网络爬虫等工具向服务器(网站)上指定端口(默认为80)以URL(统一资源定位符,即网址)的形式发起一个HTTP请求(一般为GET.POST),服务器监听到这一请求后会回复一个状态行+响应消息的主体,从而形成了一个完整的HTTP"请求-响应"过程,而这一过程是建立

LBDP-Z支持STM32通过无线模块实现在线升级

LBDP-Z可支持STM32通过无线模块实现在线升级,支持单播或广播模式. LBDP-Z可变数据域报文 SD2 LE LEr SD2 GA SA FC DU FCS ED SD2 起始字节,ED结束字节,GA组地址,SA从站地址/源地址,DA目的地址,LE/LEr数据域长度,FC控制字节,FCS校验字节. GA为组地址,可表示0x02~0x7E共125个组:0x7F表示广播,0x00.0x01和0x80~0xFF保留.SA为从站地址,可表示0x02~0x7E共125个从站:0x7F表示广播,0x

LBDP-Z支持STM32通过无线模块实现在线升级(二)

LBDP-Z可支持STM32通过无线模块实现在线升级,FCm = 0x41/0x51仅支持广播模式(取消单播升级模式). 因广播模式可能发生丢包,因此需要多次发送,在代码校验后进行升级操作.增加FCn=0x39命令: FCn=0x39: 校验flash.设置升级标志并复位,后跟6字数据,开始地址(2B) ,长度(2B) ,CRC校验(2B) . 增加FCm = 0x43,支持单播升级模式. FCm = 0x43  后跟6+n字数据,开始地址(2B) ,长度(2B) ,CRC校验(2B),代码数据

nRF2401A/nRF24L01/nRF24L01+无线模块最常见问题汇集(转)

俗话说:每个人一生下来什么都会的,都是通过自己努力和探索出来的,NRF系列芯片,刚开始都好奇心加兴趣才来捣鼓它的,刚开始做硬件和软件,没有收发数据弄得整个人头都快炸开了,所以在此和大家分享一下前辈的经验,希望大家会少走弯路. Q:最近在选型的时候发现基本常见的无线模块都是3V供电,而我使用的单片机是5V的,它们之间要怎么连接呢?直接连接会不会损坏模块? 回答: 如果你使用的51单片机的P0口是高阻引脚,可以直接将无线模块的IO脚连接到P0端口,并在对应的连线与3V电源间放置1K~10K左右的偏置

CC1101 433无线模块,STM8串口透传

CC1101 433无线模块,STM8串口透传 原理图:http://download.csdn.net/detail/cp1300/7496509 下面是STM8程序 CC1101.C [cpp] view plaincopy /************************************************************************************************************* * 文件名: CC1101.c * 功能:  S

[51单片机] nRF24L01 无线模块 测试 按键-灯-远程控制

哈哈,穷吊死一个,自己做的一个超简单的板还没有电源提供,只得借助我的大开发板啦.其实这2个模块是完全可以分开的,无线嘛,你懂得!进入正题,这个实验的功能就是一个发送模块(大的那个板)连接4个按键,通过按动这4个不同的按键来发送4种不同的命令,来控制接收端(小的板)点亮4个不同的灯. >_<!首先是发送模块: 1 void main() 2 { 3 uchar Tx_Buf1[]={1}; //发送的信息1 4 uchar Rx_Buf[32]; //接收到的数据暂存器,最多32字节数据 5 i

串口发送模块——1字节数据发送

此次试验旨在通过串口试验,讲述FPGA的硬件设计思想和通用设计流程.串口是电子设计中非常常见,可以说掌握了串口数据收发,就明白了最基本的时序操作.串口的数据收发过程有其固定的数据格式.下面是本次实验使用的数据格式,在满足串口格式规范前提下是可变的: 空闲状态下为高电平,当发送数据时,先发送低电平起始位,后从低位开始逐位发送有效数据比特,数据位位数由双方约定,此处设定为8位.可在数据位后添加数据校验位,但这不是必须的.发送完后发送高电平停止位并持续空闲状态直至下一次发送.虽然本次实验没有用到,但这

无线模块 RXB12-315m TXB12-315M 应用

最近有个产品用到这对模块,由于没有什么技术支持,就直接上机调试,测试结果为带障碍发射距离60米. 以下是应用的几个知识点: 1:编程操作,其实比较简单,调制信号315M是模块自带的,不需要调制和解调,我们只需控制自己的协议即可,我用的是红外发射的协议来控制. 2:发射位和接受位是相反的,即你发送一个1,接受的是0 3:天线 ,这个也重要,关系到发射的距离和稳定性,频率 15M,波长 20米,可以使用1/4波长(即天线长度等于1/4波长,315M对应23.8CM),具体波长 可以借用波长计算器,以