/**************************** 315Mhz 无线通信程序 原理: 第一块单片机 p1.0 口输出脉冲方波提供给无线发射模块, 无线发射模块将信号以电磁波的形式传到无线接收模块。 无线接收模块会根据这个电磁波还原出脉冲方波提供给第二块单片机, 第二块单片机进行进一步的解算处理。 通信协议: 根据这个原理和315模块的特性。 我决定以 900us 高电平和 2000us 底电平表示1; 450us 高电平和 2000us 低电平表示0。 而8个1或0组成一个字节。为了防止误码, 所以在每个字节的前面加一个 2ms 高电平和 2ms 低电平的起始码。 每个 5S 发送一个字符,一个字符发送 20 遍 *******************************/ /**************************** 315Mhz 无线通信程序 发送程序 11.0592M 晶振 1 机器周期=1.0851us 定时器产生 2MS 定时 TH0=0XF8;TL0=0XCD; 900us 定时 TH0=0XFC;TL0=0XC3; 450us 定时 TH0=0XFE;TL0=0X61; *******************************/ #include #include intrins.h #define uint unsigned int #define uchar unsigned char sbit WXSEND=P1^0; uchar timedata[8]={0xfe,0x61,0xfc,0xc3,0xf8,0xcd,0xea,0x66};// 450us, 900us,2MS,6ms /************************************* 11.0592MHZ 下 500 毫秒延时,还准 ***************************************/ void delay500ms(uint i) { uint j; uchar k; while(i--) { for(j=0;j<750;j++) for(k=0;k<200;k++); } } void time0init() { TMOD=0x01;// } void sendset(uchar senddata);//发送数据程序 void sendstartbit();//数据发送起始信号 2ms 高电平和 2ms 低电平的起始码 void sendlowbit();//发送低电平 void sendhighbit();//发送高电平 void main() {uchar senddata,i; time0init();//定时器初始化 senddata=0x55; while(1) { for(i=0;i<20;i++) { sendset(senddata);//发送数据程序 } delay500ms(10); senddata++; } } //发送数据程序 void sendset(uchar senddata) {uchar i,sendbit; sendstartbit();//发送开始信号 for(i=0;i<8;i++) { sendbit=senddata&0x80; if(sendbit==0)sendlowbit(); //发送低电平 else sendhighbit();//发送高电平 senddata=senddata<<1; } } //数据发送起始信号 6ms 高电平和 2ms 低电平的起始码 void sendstartbit() { WXSEND=1; TH0=timedata[4]; TL0=timedata[5]; TR0=1; while(TF0==0); TR0=0; TF0=0; TH0=timedata[4]; TL0=timedata[5]; WXSEND=0; TR0=1; while(TF0==0); TR0=0; TF0=0; } void sendlowbit() //发送低电平 { WXSEND=1; TH0=timedata[0]; TL0=timedata[1]; TR0=1; while(TF0==0); TR0=0; TF0=0; TH0=timedata[4]; TL0=timedata[5]; WXSEND=0; TR0=1; while(TF0==0); TR0=0; TF0=0; } void sendhighbit()//发送高电平 { WXSEND=1; TH0=timedata[2]; TL0=timedata[3]; TR0=1; while(TF0==0); TR0=0; TF0=0; TH0=timedata[4]; TL0=timedata[5]; WXSEND=0; TR0=1; while(TF0==0); TR0=0; TF0=0; } /**************************** 315Mhz 无线通信程序 接收程序 11.0592M 晶振 1 机器周期=1.0851us 用中断 0 边沿触发中断,开启接收程序 由于接收模块平时大部分时间是低电平,有信号时是高电平,而中断 0 是负边沿触发,所 以, 硬件电路中接收模块的信号输出端经过非门后接到单片机 P3.2 接收到数据,用串口传到上位机的串口调试软件显示 *******************************/ #include #include intrins.h #define uint unsigned int #define uchar unsigned char sbit WXrecep=P3^2; //uchar code timedata[6]={0xfe,0x61,0xfc,0xc3,0xf8,0xcd};//