搜索
bottom↓
回复: 1

gps+无线模块的程序

[复制链接]

出0入0汤圆

发表于 2013-3-12 17:54:14 | 显示全部楼层 |阅读模式
大神们,现在我用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;       
}

出0入0汤圆

发表于 2013-3-12 23:02:01 | 显示全部楼层
顶 求解啊
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-30 06:11

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表