一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 2600|回复: 18

[其他综合] GPS时钟串口中断问题

[复制链接]
发表于 2014-5-30 14:54 | 显示全部楼层 |阅读模式
          各位坛友好,我碰到一个问题想请教大家。
          我手里有两块熊那里淘来的GPS头,现在想做一个GPS校准母钟,用无线发送校准子钟,现在在母钟编程序的时候碰到一个问题,母钟上有块cog12864显示时钟信息,在没有串口输入(p3.0)gps信号的时候,液晶显示一切正常,有信号输入后, main主程序老是自动重启,液晶上显示一会儿有一会儿没有,过几秒又闪几下如此往复,p3.0脚切断信号显示恢复正常。
搞了一天了找不到原因,在这里请教各位高手了!!!
发表于 2014-5-30 15:09 | 显示全部楼层
上代码看看呗
回复

使用道具 举报

 楼主| 发表于 2014-5-30 15:18 | 显示全部楼层
void uart(void) interrupt 4                                //GPS接收中断
{
    unsigned char tmp;
    if(RI)
            {
        tmp=SBUF;
        switch(tmp)
        {
            case '$':
                cmd_number=0;        //命令类型清空
                mode=1;                //接收命令模式
                byte_count=0;        //接收位数清空
                break;
            case ',':
                seg_count++;        //逗号计数加1
                byte_count=0;
                break;
            case '*':
                switch(cmd_number)
                {
                    case 3:
                        buf_full=1;
                        break;
                }
                mode=0;
                break;
            default:
                if(mode==1)                   //命令种类判断
                {
                    cmd[byte_count]=tmp;            //接收字符放入类型缓存
                    if(byte_count>=4)
                            {                //如果类型数据接收完毕,判断类型
                        if(cmd[0]=='G')
                                {
                            if(cmd[1]=='P')
                                    {
                               if(cmd[2]=='R')
                                        {
                                    if(cmd[3]=='M')
                                            {
                                        if(cmd[4]=='C')
                                                {
                                            cmd_number=3;
                                            mode=2;
                                            seg_count=0;
                                            byte_count=0;
                                                }
                                            }
                                         }
                               }
                          }
                      }
                  }
                else if(mode==2)                          //接收数据处理
                {
                    switch(seg_count)                                           //GPRMC
                    {
                        case 1:
                            if(byte_count<6)                        
                              time[byte_count]=tmp;        //时间处理
                            break;
                        case 2:
                            if(byte_count<1)               
                                lock=tmp;      //定位判断
                            break;
                                           case 9:                                
                            if(byte_count<6)
                                time1[byte_count]=tmp;           //日期处理
                            break;
                    }
                }
            byte_count++;        //接收数位加1
            break;
        }
    }
    RI=0;
}
回复

使用道具 举报

 楼主| 发表于 2014-5-30 15:20 | 显示全部楼层
main()
{
    sys_init();

        delay2(100);
    while(1)
    {
                      char Bhour;
                                 if(buf_full==1)
                           {
                   Bhour=((time[0]-0x30)*10+time[1]-0x30)+TIME_AREA;
                    if(Bhour>=24)
                        Bhour-=24;
                    else if(Bhour<0)
                        Bhour+=24;                  
                                        if(lock==0x41)
                                                LcmPutChar(70,2,13);
                                        else
                                                LcmPutChar(70,2,14);
                                        LcmPutChar(50,4,Bhour/10);
                                        LcmPutChar(59,4,Bhour%10);
                                        LcmPutChar(74,4,time[2]-0x30);
                                        LcmPutChar(83,4,time[3]-0x30);
                                        LcmPutChar(98,4,time[4]-0x30);
                                        LcmPutChar(107,4,time[5]-0x30);

                                        LcmPutChar(58,6,time1[4]-0x30);
                                        LcmPutChar(67,6,time1[5]-0x30);
                                        LcmPutChar(82,6,time1[2]-0x30);
                                        LcmPutChar(91,6,time1[3]-0x30);
                                        LcmPutChar(106,6,time1[0]-0x30);
                                        LcmPutChar(115,6,time1[1]-0x30);

                                         buf_full=0;
                                   }  
    }               
}

回复

使用道具 举报

 楼主| 发表于 2014-5-30 15:22 | 显示全部楼层
void sys_init()                         //系统初始化
{
    TMOD = 0x20;
    SCON = 0x50;
    TH1 = 0xFA;
    TL1 = TH1;
    EA = 1;
    ES = 1;
        TR1=1;       
        lcd_init ();        
        LcmClear( );         
}


回复

使用道具 举报

 楼主| 发表于 2014-5-30 15:59 | 显示全部楼层
给点意见
回复

使用道具 举报

发表于 2014-5-30 16:00 | 显示全部楼层
看到你的代码,我大概知道了,以前我也碰到过,你在buf_full=0后加个延时代码看看有没有减轻这种故障
延时少了的话时不时还是会闪,大了的话秒数就不能正常更新
回复

使用道具 举报

 楼主| 发表于 2014-5-30 16:03 | 显示全部楼层
那是什么问题引起的呢
回复

使用道具 举报

 楼主| 发表于 2014-5-30 16:04 | 显示全部楼层
能说说原因吗
回复

使用道具 举报

发表于 2014-5-30 16:45 | 显示全部楼层
不知道,估计是buf_full=0没有起作用把,或者单片机速度太快,接受的时候刚好跳过了gps发送$,单片机就任认为没接受到数据
回复

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-10-31 18:28 , Processed in 0.033970 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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