找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 76|回复: 2
打印 上一主题 下一主题
收起左侧

STC8F单片机的GPS时钟程序求助,时钟正常接收不了GPS

[复制链接]
跳转到指定楼层
楼主


  1. #include <bianliang.h>
  2. #include <EEPROM.H>

  3. #include <Uart.h>
  4. #include <zk.h>
  5. #include <ir_nec.h>
  6. #include <DS3231.h>
  7. #include "nongli.h"
  8. #include <DS18b20.h>
  9. #include <lcd12864.h>
  10. #include <xianshi.h>
  11. #include <shizhong2.h>

  12. #include <key.h>


  13. /*******读取当前时间*********/
  14. void GetAllTime()
  15. {
  16.     uchar temp;

  17.     miao=temp=read_random(DS3231_SECOND);       //秒
  18.     miao1=temp/10;
  19.     miao2=temp%10;

  20.     fen=temp=read_random(DS3231_MINUTE);       //分
  21.     fen1=temp/10;
  22.     fen2=temp%10;

  23.     shi=temp=read_random(DS3231_HOUR);       //时
  24.     shi1=temp/10;
  25.     shi2=temp%10;

  26.     ri=temp=read_random(DS3231_DAY);       //日
  27.     ri1=temp/10;
  28.     ri2=temp%10;

  29.     yue=temp=read_random(DS3231_MONTH);       //月
  30.     yue1=temp/10;
  31.     yue2=temp%10;

  32.     nian=temp=read_random(DS3231_YEAR);       //年
  33.     nian1=temp/10;
  34.     nian2=temp%10;
  35.     //TH3231=    read_temp();
  36.     write_byte(0x0e,0x20);    //0x0e寄存器的CONV位置1开启温度转换
  37. }








  38. void main()
  39. {
  40.     P0M0 = 0x00;
  41.     P0M1 = 0x00;
  42.     P1M0 = 0x00;
  43.     P1M1 = 0x00;
  44.     P2M0 = 0x00;
  45.     P2M1 = 0x00;
  46.     P3M0 = 0x00;
  47.     P3M1 = 0x00;
  48.     P4M0 = 0x00;
  49.     P4M1 = 0x00;
  50.     P5M0 = 0x00;
  51.     P5M1 = 0x00;
  52.     P6M0 = 0x00;
  53.     P6M1 = 0x00;
  54.     P7M0 = 0x00;
  55.     P7M1 = 0x00;
  56.     P2M0 = 0x01;
  57.     WDT_CONTR=0x37;          //启动看门狗,64分频,约1s多
  58.     WDT_CONTR|=0x10;           //喂狗
  59.     P14=1;
  60.     P15=1;
  61.     P20=0;//开启背光
  62.     KEYS=KEYA=KEYD=KEYM=1;
  63.     xms(500);
  64.     P47=0;
  65.     xms(100);
  66.     P47=1;
  67.     lcd_init();
  68.      load_EEOROM();
  69.     UartInit();
  70.     IR_Init();//红外遥控触感初始化
  71.     Clean_12864_GDRAM();
  72.     Timer4Init();
  73.     WKTCL = 240;                     //设置唤醒周期为488us*(49+1) = 24.4ms
  74.     WKTCH = 0x80;                   //使能掉电唤醒定时器
  75. if(MODE==3)gpstip();if(MODE==4){gpstip2();Clean_12864_GDRAM();}if(MODE==5)x=0;

  76.     while (1)
  77.     {
  78.    WDT_CONTR|=0x10;           //喂狗
  79.    //PCON |= 0x02;           //将STOP(PCON.1)置1,MCU将进入掉电模式
  80.         if(MODE==1) {
  81.             if(DW_OK&&RX_over)GPSdata();
  82.             GetAllTime();
  83.             GetNL_ri();
  84.             Read18b20();
  85.             MODE1();
  86.                 if(fen==59&&miao==59){FMQ=0;}//整点报时
  87.         }

  88.         if(MODE==2) {
  89.             if(DW_OK&&RX_over)GPSdata();
  90.             GetAllTime();
  91.             GetNL_ri();
  92.             Read18b20();
  93.             MODE2();
  94.         }

  95.         if(MODE==3) {
  96.             MODE3();
  97.         }

  98.         if(MODE==4) {
  99.             MODE4();
  100.         }

  101.         if(MODE==5) {
  102.             MODE5();
  103.         }

  104.         if(MODE==10) {
  105.             MODE10();
  106.         }

  107.         if(scankey){scankey=0;keyscan();}


  108.     }
  109. }

复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:932645 发表于 2026-1-30 22:41 | 只看该作者
不知道怎么搞,有人知道吗
回复

使用道具 举报

板凳
ID:932645 发表于 2026-1-31 20:26 | 只看该作者

#include <string.h>



void UartInit4800(void)                //4800bps@30.000MHz
{
        SCON = 0x50;                //8位数据,可变波特率
        AUXR |= 0x40;                //定时器1时钟为Fosc,即1T
        AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
        TMOD &= 0x0F;                //设定定时器1为16位自动重装方式
        TL1 = 0xE5;                //设定定时初值
        TH1 = 0xF9;                //设定定时初值
        ET1 = 0;                //禁止定时器1中断
        TR1 = 1;                //启动定时器1
   ES = 1;                     //使能串口1中断
   EA = 1;
}



void UartInit9600(void)                //9600bps@30MHz
{
        SCON = 0x50;                //8位数据,可变波特率
        AUXR |= 0x40;                //定时器1时钟为Fosc,即1T
        AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
        TMOD &= 0x0F;                //设定定时器1为16位自动重装方式
        TL1 = 0xF3;                //设定定时初值
        TH1 = 0xFC;                //设定定时初值
        ET1 = 0;                //禁止定时器1中断
        TR1 = 1;                //启动定时器1
   ES = 1;                     //使能串口1中断
   EA = 1;
}



void UartInit1152(void)                //115200bps@30.000MHz
{
        SCON = 0x50;                //8位数据,可变波特率
        AUXR |= 0x40;                //定时器1时钟为Fosc,即1T
        AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
        TMOD &= 0x0F;                //设定定时器1为16位自动重装方式
        TL1 = 0xBF;                //设定定时初值
        TH1 = 0xFF;                //设定定时初值
        ET1 = 0;                //禁止定时器1中断
        TR1 = 1;                //启动定时器1
    ES = 1;                     //使能串口1中断
    EA = 1;
}


void UartInit(){
    switch(bps) {
    case 0://
        UartInit1152();
        break;
    case 1://
        UartInit9600();
        break;
    case 2://
        UartInit4800();
        break;
        default:
             UartInit1152();
                break;

    }

}


void Uart() interrupt 4 using 1
{   
        uchar data Rx_temp ;
        static uchar fg_count=0;        //数据间隔,计数
        static uchar Rx_count=0;
        static uchar n=0;                     //握手信号计数
        static uchar da_count=0;         //数据计数
        uchar idata GPRMC[6]={0x24,0x47,0x50,0x52,0x4D,0x43};    //GPS选择接收字符$GPRMC,
        uchar idata GPVTG[6]={0x24,0x47,0x50,0x56,0x54,0x47};    //GPS选择接收字符$GPVTG,
           if(RI)                                          
     {
                   RI=0;
                    Rx_temp=SBUF;

/******* 监控握手信号进行软件复位自动下载 ******/
              if(Rx_temp==0x7f)  
              {                                                   //STC下载指令是0x7f
                   n++;                                 
                   if(n>20)                      //如果连续收到20次0x7f
                   {
                               IAP_CONTR=0x60;  //复位至ISP区  
                                        n=0;   
                   }
              }
                  else
                          n=0;



/********* GPS数据处理 **************/
                  if(Rx_count<6)
                  {
                            if(Rx_temp==GPRMC[Rx_count])    //比较开始$GPRMC字符,     
                               Rx_count++;
                     else   
                                 Rx_count=0;        
                   }
                else  //找到GPRMC开始保存数据
                {
                         if(Rx_temp==',')                                //如果收到逗号,
                        {
                                fg_count++;                                        //计数增加
                                da_count=0;
                        }
                        else
                        {
                                 if(fg_count==1)                                //保存时间数据
                                {
                                        if(da_count<6)                   //只保存前6位时间数据
                                                SJ[da_count++]=Rx_temp;
                                }
                                else
                                        if(fg_count==2)                        //保存定位信息
                                        {       
                                                if(Rx_temp=='A')        //如果收到A
                                                        DW_OK=1;                //则定位成功
                                                else
                                                        DW_OK=0;
                                        }

/*****************************************************/
                                else  //纬度
                                        if(fg_count==3)                        //保存定位信息
                                        {       
                                                if(da_count<10)                   //只保存前10位时间数据
                                                weidu[da_count++]=Rx_temp;
                                        }

                                else  //纬度半球N(北半球)或S(南半球)
                                        if(fg_count==4)                        //保存定位信息
                                        {       
                                                NS=Rx_temp;
                                        }


                                else//经度
                                        if(fg_count==5)                        //保存定位信息
                                        {       
                                                if(da_count<10)                   //只保存前10位时间数据
                                                jindu[da_count++]=Rx_temp;
                                        }
  
                                else  //经度半球E(东经)或W(西经)
                                        if(fg_count==6)                        //保存定位信息
                                        {       
                                                EW=Rx_temp;
                                        }
                                else  //地面速率(000.0~999.9节,前面的0也将被传输)
                                        if(fg_count==7)                        //保存定位信息
                                        {       
                                                if(da_count<5)                   //只保存前10位时间数据
                                                shudu[da_count++]=Rx_temp;
                                        }


/*****************************************************/
                                        else
                                                if(fg_count==9)                                  //保存日期数据
                                                        RQ[da_count++]=Rx_temp;
                                                else
                                                        if(fg_count>9)                         //接收完毕
                                                        {
                                                                 RX_over=1;
                                                                fg_count=0;
                                                                da_count=0;
                                                                Rx_count=0;
                                                        }       
                        }       
                }       
               
/************************************************
                if (Rx_temp == '$')  //如果收到字符'$',便开始接收
                {
                        rev_start = 1;
                        rev_stop  = 0;
                }
       
                if (rev_start == 1)  //标志位为1,开始接收
                {
                        rev_buf[num++] = Rx_temp;  //字符存到数组中
                        if (Rx_temp == '\n')     //如果接收到换行
                        {
                                rev_buf[num] = '\0';
                                rev_start = 0;
                                rev_stop  = 1;
                                //gps_flag = 1;
                                num = 0;
                        }
                }
*************************************************/

        }

}

double Str_To_Double(char *buf)
{
        xdata double rev_d = 0;
        xdata uchar dat;
        xdata uchar integer = 1;
        xdata char *str = buf;
        xdata int i;
        while(*str != '\0')
        {
                switch(*str)
                {
                        case '0':
                                dat = 0;
                                break;
                        case '1':
                                dat = 1;
                                break;
                        case '2':
                                dat = 2;
                                break;               
                        case '3':
                                dat = 3;
                                break;
                        case '4':
                                dat = 4;
                                break;
                        case '5':
                                dat = 5;
                                break;
                        case '6':
                                dat = 6;
                                break;
                        case '7':
                                dat = 7;
                                break;
                        case '8':
                                dat = 8;
                                break;
                        case '9':
                                dat = 9;
                                break;
                        case '.':
                                dat = '.';
                                break;
                }
                if(dat == '.')
                {
                        integer = 0;
                        i = 1;
                        str ++;
                        continue;
                }
                if( integer == 1 )
                {
                        rev_d = rev_d * 10 + dat;
                }
                else
                {
                if(i<10000)
                rev_d = rev_d + dat / (10 * i);
                i = i * 10 ;
                }
                str ++;
        }
        return rev_d;
}


float Str_To_Float(char *buf)
{
        xdata float rev = 0;
        xdata uchar dat;
        xdata uchar integer = 1;
        xdata char *str = buf;
        xdata int i;
        while(*str != '\0')
        {
                switch(*str)
                {
                        case '0':
                                dat = 0;
                                break;
                        case '1':
                                dat = 1;
                                break;
                        case '2':
                                dat = 2;
                                break;               
                        case '3':
                                dat = 3;
                                break;
                        case '4':
                                dat = 4;
                                break;
                        case '5':
                                dat = 5;
                                break;
                        case '6':
                                dat = 6;
                                break;
                        case '7':
                                dat = 7;
                                break;
                        case '8':
                                dat = 8;
                                break;
                        case '9':
                                dat = 9;
                                break;
                        case '.':
                                dat = '.';
                                break;
                }
                if(dat == '.')
                {
                        integer = 0;
                        i = 1;
                        str ++;
                        continue;
                }
                if( integer == 1 )
                {
                        rev = rev * 10 + dat;
                }
                else
                {
                        rev = rev + dat / (10 * i);
                        i = i * 10 ;
                }
                str ++;
        }
        return rev;

}




void Int_To_Str(int x,char *Str)
{
        xdata int t;
        xdata char *Ptr,Buf[5];
        xdata int i = 0;
        Ptr = Str;
        if(x < 10)                // 当整数小于10时,转化为"0x"的格式
        {
                *Ptr ++ = '0';
                *Ptr ++ = x+0x30;
        }
        else
        {
                while(x > 0)
                {
                        t = x % 10;
                        x = x / 10;
                        Buf[i++] = t+0x30;        // 通过计算把数字转化成ASCII码形式
                }
                i -- ;
                for(;i >= 0;i --)                 // 将得到的字符串倒序
                {
                        *(Ptr++) = Buf[i];
                }
        }
        *Ptr = '\0';
}


void utc2btc(){

   uchar xdata max;

        shi=(SJ[0]-0x30)*10        + (SJ[1]-0x30);                 //时
        fen=(SJ[2]-0x30)*10        + (SJ[3]-0x30);                 //分
        miao=(SJ[4]-0x30)*10        + (SJ[5]-0x30);                 //秒
        ri=(RQ[0]-0x30)*10 + (RQ[1]-0x30);                 //日
        yue=(RQ[2]-0x30)*10 + (RQ[3]-0x30);                 //月
        nian=(RQ[4]-0x30)*10 + (RQ[5]-0x30);                 //年
                        shi+=8;                        //转换为北京时间 ,东8区要+8
                        if(shi>23)                //如果超过23则到了第二天
                        {   
                                shi-=24;        //
                                ri+=1;                //日+1
                                switch(yue)                //获取每月最大天数
                                {
                                         case 2:                         //2月
                                                if(nian%4==0)  //判断是否闰月,只取2000-2099年,因此简单的%4运算
                                                        max=29;                  //闰月29天
                                                else
                                                        max=28;                  //正常28天
                                                break;
                                        case 4:                case 6:         
                                        case 9:                case 11:     //4,6,9,11月
                                                max=30;                                 //30天
                                                break;
                                        default:
                                                max=31;                  //其他月份1,3,5,7,8,10,12月31天
                                        break;               
                                }
                                if(ri>max)
                                {
                                        yue+=1;
                                        ri=1;
                                        if(yue>12)
                                        {
                                                 nian+=1;
                                                yue=1;
                                        }
                                }
                        }
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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