|
本帖最后由 yixiti 于 2012-11-19 00:59 编辑
RT!
弄了对315M的无线模块
发射的搞定了,接收的是没有发射的信号就是乱码显示,有发射的信号就接收发射的信号,两边都是用的串口,就是RXD,TXD,三线的,还一个GND没有,因为是无线.发射的接单片机的TXD用来发射信号,接收的我先把接收模块的数据端接到串口线的TXD,就是连的电脑上,拿串口助手看都是正确的,因为有乱码所以需要把信号加工,弄了几个识别码啥的,可问题是在电脑上看接收的都是正常的...用单片机接收就会出现数据错误的问题...比如我发射端一直发射0XFF,用电脑看挺好,用单片机接收就乱了...程序我弄上来大家给看看的
中断用了两个,因为要数据的正确性所以要在电脑上验证,用定时器1发给电脑数据.看着发来的全是错的...开机发送的0X22是对的...用的虚拟串口,波特率2400,33M多的晶振设的...无线传输完在电脑上看正确的说明无线模块没问题..现在就是接收的程序的问题了......
#include<15f104e.h>
#define uchar unsigned char
#define uint unsigned int
sbit RXD=P3^0;
sbit TXD=P3^1;
sbit TM0_FLAG=P3^2; //设传输标志位
sbit TM1_FLAG=P3^3;
uchar codes[2],recive[7];
void WaitTF0( void );
void Init(void) //计数器及中断初始化
{
ET1=1;
ET0=1; //允许定时器0中断
EA=1; //中断允许总开关
//AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TMOD &= 0x0F;
TL0 = 0x7F; //设置定时初值
TH0 = 0xFB; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 0; //定时器0使用时才开始计时
TL1 = 0x7F; //设置定时初值
TH1 = 0xFB; //设置定时初值
TF1 = 0; //清除TF0标志
TR1 = 0; //定时器0使用时才开始计时
TM1_FLAG=0;
TM0_FLAG=0;
}
uchar RByte() //接收一个字符
{
uchar Output=0;
uchar i=8;
TR0=1; //启动Timer0
WaitTF0(); //等过起始位
//发送8位数据位
while(i--)
{
Output >>=1;
if(RXD)
Output |=0x80; //先收低位
WaitTF0(); //位间延时
}
while(!TM0_FLAG) if(RXD) break;
TR0=0; //停止Timer0
return Output;
}
void IntTimer0() interrupt 1 //中断1处理程序
{
TM0_FLAG=1; //设置标志位。
}
void IntTimer1() interrupt 3 //中断1处理程序
{
TM1_FLAG=1; //设置标志位。
}
void WaitTF0( void ) //查询传输标志位
{
while(!TM0_FLAG);
TM0_FLAG=0; //清标志
}
void WaitTF1( void ) //查询传输标志位
{
while(!TM1_FLAG);
TM1_FLAG=0; //清标志
}
bit StartBitOn() //检查是不是有起始位
{
return (RXD==0);
}
void send(uchar input) //发送一个字符
{
//发送启始位
uchar i=8;
TR1=1;
TXD=(bit)0;
WaitTF1();
//发送8位数据位
while(i--)
{
TXD=(bit)(input&0x01); //先传低位
WaitTF1();
input=input>>1;
}
//发送结束位
TXD=(bit)1;
WaitTF1();
TR1=0;
}
void manch()//这是曼特斯特解码的函数..还没用到这呢...接收到的编完码的数据就不对...这函数里面还有的校验不用说跟本过不去了..
{
uint i,j;
uchar check;
check=0xFF;
for(i=2;i<6;i++)
{
check=check^recive;
}
check=~check;
if(check==recive[6])
{
for(i=0;i<2;i++)
{
codes=0x00;
for(j=0;j<4;j++)
{
codes=codes>>1;
if((recive[i*2+2]&0x03)==0x01)
{
codes=codes|0x80;
}
if((recive[i*2+3]&0x03)==0x01)
{
codes=codes|0x08;
}
recive[i*2+2]=recive[i*2+2]>>2;
recive[i*2+3]=recive[i*2+2]>>2;
}
}
}
}
void main()
{
uint i;
Init();
send(0x22);
while(1)
{
/*if(StartBitOn())//这个判断RXD的函数用不用我不是太清楚...不过用了接收的还是有问题.不用的话0XA5这个起始标致位是按一下键就能收到的,不过下面的就都错了...
{
send(RByte());
} */
if(RByte()==0xa5)
{
while(RXD);//和这个StartBitOn()是一个意思...
recive[2]=RByte();
while(RXD);
recive[3]=RByte();
while(RXD);
recive[4]=RByte();
while(RXD);
recive[5]=RByte();
while(RXD);
recive[6]=RByte();
send(0x23);
for(i=2;i<7;i++)
{
send(recive);
}
Write(0xf0,0x00);
manch();
}
if(codes[0]==0xaa)
{
; //这块就是接收不成功
}
}
}
已经搞定了,除了接收有问题另外解码也有问题~主要是清楚UART的状态就能明白了
|
|