|
大神们,现在我用gps模块,52单片机接收,用无线,传送给另一个52单片机作接收,现在用串口中断直接写发送程序,接收乱码,如果单独发送,就能接收,考虑到是否是串口数据发送时被新的串口中断打断,用 NF905发送的,谁懂无线模块,帮忙指导下太感谢了!
//#include <reg52.h>
#include <stdio.h>
#include <string.h>
#include "GPS.h"
#include "LCD.h"
#include "display.h"
#include <intrins.h>
sbit led1 = P2^2; //接收数据指示灯(绿)
sbit led2 = P2^1; //GPRMC数据有效指示灯(白)
sbit led3 = P2^0; //GPGGA数据有效指示灯(红)
#define REV_YES led1 = 1 //接收数据
#define REV_NO led1 = 0
#define RMC_YES led2 = 1 //GPRMC数据有效
#define RMC_NO led2 = 0
#define GGA_YES led3 = 1 //GPGGA数据有效
#define GGA_NO led3 = 0
#define uint unsigned int
#define uchar unsigned char
#define WC 0x00
#define RC 0x10
#define WTP 0x20
#define RTP 0x21
#define WTA 0x22
#define RTA 0x23
#define RRP 0x24
sbit TX_EN= P1^4;
sbit TRX_CE=P3^2;
sbit PWR_UP=P1^3;
sbit CD=P1^2;
sbit AM=P1^7;
sbit DR=P3^3;
sbit MISO=P1^6;
sbit MOSI=P1^1;
sbit SCK=P1^5;
sbit CSN=P1^0;
sbit led=P3^0;
char xdata rev_buf[80]; //接收缓存 xdata表示变量存放在外部存储区中。
uchar xdata rev_start = 0; //接收开始标志
uchar xdata rev_stop = 0; //接收停止标志
uchar xdata gps_flag = 0; //GPS处理标志
uchar xdata change_page = 0; //换页显示标志
uchar xdata num = 0; //
extern GPS_INFO GPS; //在display.c中定义,使用时要加extern
void Uart_Init(void)
{
TMOD = 0x21; //0010 0001
PCON=0X00;
TH0=0x3c;
TL0=0xb0;
TH1=0xfd; //波特率9600
TL1=0xfd; //波特率9600
TR1=1; //开启定时器1
REN=1; //允许接收数据
SM0=0;
SM1=1;
TI=0;
RI=0;
EA=1; //开总中断
ES=1; //串口1中断允许
ET0 = 1; //定时器1中断允许
}
void Delay_us(uint x)
{
uint i;
for(i=0;i<x;i++)
{
_nop_();
}
}
void SpiWrite(uchar date) //NRF905 SPI写函数 用于向无线模块写数据及配置字
{
uchar i=8;
while (i--)
{
Delay_us(10);
MOSI=(bit)(date&0x80);
date<<=1 ;
Delay_us(10);
SCK=1;
Delay_us(10);
SCK=0;
}
}
void Ini_System(void) //无线模块NRF905初始化
{
CSN=1;
SCK=0;
PWR_UP=1;
TRX_CE=0;
TX_EN=0;
Delay_us(2);
CSN=0;
SpiWrite( 0x00); //配置命令//
SpiWrite( 0x4c); //CH_NO,配置频段在430MHZ
SpiWrite( 0x0C); //输出功率为10db,不重发,节电为正常模式
SpiWrite( 0x44); //地址宽度设置,为4字节
SpiWrite( 0x01);SpiWrite( 0x01); //接收发送有效数据长度为1字节
SpiWrite( 0xCC);SpiWrite( 0xCC);SpiWrite( 0xCC);SpiWrite( 0xCC); //接收地址
SpiWrite( 0x5E);
CSN=1;
PWR_UP=1;
TRX_CE=1;
TX_EN=0;
Delay_us(1000);
}
void TxPacket(uint dat) //NRF905发送程序
{
PWR_UP=1;
TX_EN=1;
TRX_CE=0;
Delay_us(2);
CSN=0;
SpiWrite(WTA); //写发送地址,后面跟4字节地址//
SpiWrite(0xCC);
SpiWrite(0xCC);
SpiWrite(0xCC);
SpiWrite(0xCC);
CSN=1;
Delay_us(2);
CSN=0;
SpiWrite(WTP); //写发送数据命令,后面跟一字节数据//
SpiWrite(dat);
CSN=1;
Delay_us(5);
TRX_CE=1; //使能发射模式//
Delay_us(500); //等带发送完成//
TRX_CE=0;
while(DR);
}
/****************************************
主函数
/****************************************/
void main(void)
{
uchar error_num = 0;
Uart_Init(); //初始化串口
Lcd_Init(); //初始化LCD
GPS_Init(); //初始化GPS
Ini_System();
rev_stop=0;
REV_NO;
while(1)
{
led1 = 0;
led2 = 0;
led3 = 0;
if (rev_stop) //如果接收完一行
{
TR0 = 1; //开启定时器,每隔10秒换页
REV_YES; //成功接收到数据
if (change_page % 2 == 1) //换页
{
if (GPS_GGA_Parse(rev_buf, &GPS)) //解析GPGGA
{
GGA_YES;
GPS_DisplayTwo(); //显示第二页信息
error_num = 0;
gps_flag = 0;
rev_stop = 0;
REV_NO;
}
else
{
error_num++;
if (error_num >= 20) //如果数据无效超过20次
{
GGA_NO;
error_num = 20;
GPS_Init(); //返回初始化
}
gps_flag = 0;
rev_stop = 0;
REV_NO;
}
}
else
{
if (GPS_RMC_Parse(rev_buf, &GPS)) //解析GPRMC
{
RMC_YES;
GPS_DisplayOne(); //显示GPS第一页信息
error_num = 0;
gps_flag = 0;
rev_stop = 0;
led1 = 1;
}
else
{
error_num++;
if (error_num >= 20) //如果数据无效超过20次
{
RMC_NO;
error_num = 20;
GPS_Init(); //返回初始化
}
gps_flag = 0;
rev_stop = 0;
REV_NO;
}
}
}
}
}
/****************************************
定时器中断 (每隔10秒换页)
/****************************************/
void timer0(void) interrupt 1
{
static uchar count = 0;
TH0 = 0x3c;
TL0 = 0xb0; //50000
count++;
if (count == 200) //2*5秒钟
{
count = 0;
change_page++; //换页
if (change_page == 10)
change_page = 0;
}
}
/****************************************
串口接收中断
/****************************************/
void Uart_Receive(void) interrupt 4
{
uchar ch;
ES = 0
if (RI);
{
ch = SBUF;
if ((ch == '$') && (gps_flag == 0)) //如果收到字符'$',便开始接收
{
rev_start = 1;
rev_stop = 0;
}
if (rev_start == 1) //标志位为1,开始接收
{
rev_buf[num++] = ch; //字符存到数组中
TxPacket(ch);
if (ch == '\n') //如果接收到换行
{
rev_buf[num] = '\0';
rev_start = 0;
rev_stop = 1;
gps_flag = 1; //开始GPS处理
num = 0;
}
}
}
RI = 0; //RI清0,重新接收
ES = 1;
}
|
|