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<reg52.h>
#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<reg52.h>
#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};// 450us,
900us,2MS uchar wxrecepda;
void time0init()
{
TMOD=0x21;// 定时器0
TH0=0;
TL0=0;
//TMOD=0x20;/*TMOD:timer1,mode2,8-bitreload*/
TH1=0xFD;/*TH1 11.0592MHz*/
TL1=0XFD;
EA=1;
EX0=1;
ET0=1;
IE0=0;
}
void uartinit()
{
SCON=0x50;/*SCON: 模式1,8-bitUART, 使能接收*/ TR1=1;/*TR1:timer1run*/
void receivewx();// 接收子程序
void main()
{
time0init();// 定时器初始化
uartinit();
while(1) ;
}
void receivewx()// 接收子程序
{uint i;
uchar j,recedata;
while(WXrecep==0);
TR0=0;
i=TH0*256+TL0;
TH0=0;
TL0=0;
if((i>=1800)&&(i<=1890))
{ recedata=0;
for(j=0;j<8;j++)
{
while(WXrecep==1);
TR0=1;
while(WXrecep==0);
TR0=0;
i=TH0*256+TL0;
if((i>=390)&&(i<=450)) recedata=recedata&0xfe;
else if((i>=800)&&(i<=860)) recedata=recedata|0x01;
recedata=recedata<<1;
TH0=0;
TL0=0;
}
wxrecepda=recedata>>1 ;
SBUF=wxrecepda;
while(TI==0);
TI=0;
}
}
void wxrecint() interrupt 0
{
TH0=0;
TL0=0;
TR0=1;
EX0=0;
receivewx();
EX0=1;
}。