基于51单片机315MHz无线收发模块调试程序.docx
《基于51单片机315MHz无线收发模块调试程序.docx》由会员分享,可在线阅读,更多相关《基于51单片机315MHz无线收发模块调试程序.docx(8页珍藏版)》请在冰豆网上搜索。
基于51单片机315MHz无线收发模块调试程序
/****************************
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"
#defineuintunsignedint
#defineucharunsignedchar
sbitWXSEND=P1^0;
uchartimedata[8]={0xfe,0x61,0xfc,0xc3,0xf8,0xcd,0xea,0x66};//450us,900us,2MS,6ms
/*************************************
11.0592MHZ 下500毫秒延时,还准
***************************************/
voiddelay500ms(uinti)
{
uintj;
uchark;
while(i--)
{
for(j=0;j<750;j++)
for(k=0;k<200;k++);
}
}
voidtime0init()
{
TMOD=0x01;//
}
voidsendset(ucharsenddata);//发送数据程序
voidsendstartbit();//数据发送起始信号2ms高电平和2ms低电平的起始码
voidsendlowbit();//发送低电平
voidsendhighbit();//发送高电平
voidmain()
{ucharsenddata,i;
time0init();//定时器初始化
senddata=0x55;
while
(1)
{
for(i=0;i<20;i++)
{
sendset(senddata);//发送数据程序
}
delay500ms(10);
senddata++;
}
}
//发送数据程序
voidsendset(ucharsenddata)
{uchari,sendbit;
sendstartbit();//发送开始信号
for(i=0;i<8;i++)
{
sendbit=senddata&0x80;
if(sendbit==0)sendlowbit();//发送低电平
elsesendhighbit();//发送高电平
senddata=senddata<<1;
}
}
//数据发送起始信号6ms高电平和2ms低电平的起始码
voidsendstartbit()
{
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;
}
voidsendlowbit()//发送低电平
{
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;
}
voidsendhighbit()//发送高电平
{
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};// 450us, 900us,2MS
uchar wxrecepda;
void time0init()
{
TMOD=0x21;//定时器0
TH0=0;
TL0=0;
//TMOD=0x20;/*TMOD:
timer1,mode2,8-bitreload*/
TH1=0xFD;/*TH111.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;
}