欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

STC8F單片機(jī)的GPS時(shí)鐘程序求助,時(shí)鐘正常接收不了GPS

查看數(shù): 1176 | 評論數(shù): 2 | 收藏 0
關(guān)燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發(fā)布時(shí)間: 2026-1-30 14:08

正文摘要:

#include <bianliang.h> #include <EEPROM.H> #include <Uart.h> #include <zk.h> #include <ir_nec.h> #include <DS3231.h> #include "nongli.h" #include <DS18b20.h> #i ...

回復(fù)

ID:932645 發(fā)表于 2026-1-31 20:26

#include <string.h>



void UartInit4800(void)                //4800bps@30.000MHz
{
        SCON = 0x50;                //8位數(shù)據(jù),可變波特率
        AUXR |= 0x40;                //定時(shí)器1時(shí)鐘為Fosc,即1T
        AUXR &= 0xFE;                //串口1選擇定時(shí)器1為波特率發(fā)生器
        TMOD &= 0x0F;                //設(shè)定定時(shí)器1為16位自動(dòng)重裝方式
        TL1 = 0xE5;                //設(shè)定定時(shí)初值
        TH1 = 0xF9;                //設(shè)定定時(shí)初值
        ET1 = 0;                //禁止定時(shí)器1中斷
        TR1 = 1;                //啟動(dòng)定時(shí)器1
   ES = 1;                     //使能串口1中斷
   EA = 1;
}



void UartInit9600(void)                //9600bps@30MHz
{
        SCON = 0x50;                //8位數(shù)據(jù),可變波特率
        AUXR |= 0x40;                //定時(shí)器1時(shí)鐘為Fosc,即1T
        AUXR &= 0xFE;                //串口1選擇定時(shí)器1為波特率發(fā)生器
        TMOD &= 0x0F;                //設(shè)定定時(shí)器1為16位自動(dòng)重裝方式
        TL1 = 0xF3;                //設(shè)定定時(shí)初值
        TH1 = 0xFC;                //設(shè)定定時(shí)初值
        ET1 = 0;                //禁止定時(shí)器1中斷
        TR1 = 1;                //啟動(dòng)定時(shí)器1
   ES = 1;                     //使能串口1中斷
   EA = 1;
}



void UartInit1152(void)                //115200bps@30.000MHz
{
        SCON = 0x50;                //8位數(shù)據(jù),可變波特率
        AUXR |= 0x40;                //定時(shí)器1時(shí)鐘為Fosc,即1T
        AUXR &= 0xFE;                //串口1選擇定時(shí)器1為波特率發(fā)生器
        TMOD &= 0x0F;                //設(shè)定定時(shí)器1為16位自動(dòng)重裝方式
        TL1 = 0xBF;                //設(shè)定定時(shí)初值
        TH1 = 0xFF;                //設(shè)定定時(shí)初值
        ET1 = 0;                //禁止定時(shí)器1中斷
        TR1 = 1;                //啟動(dòng)定時(shí)器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;        //數(shù)據(jù)間隔,計(jì)數(shù)
        static uchar Rx_count=0;
        static uchar n=0;                     //握手信號計(jì)數(shù)
        static uchar da_count=0;         //數(shù)據(jù)計(jì)數(shù)
        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;

/******* 監(jiān)控握手信號進(jìn)行軟件復(fù)位自動(dòng)下載 ******/
              if(Rx_temp==0x7f)  
              {                                                   //STC下載指令是0x7f
                   n++;                                 
                   if(n>20)                      //如果連續(xù)收到20次0x7f
                   {
                               IAP_CONTR=0x60;  //復(fù)位至ISP區(qū)  
                                        n=0;   
                   }
              }
                  else
                          n=0;



/********* GPS數(shù)據(jù)處理 **************/
                  if(Rx_count<6)
                  {
                            if(Rx_temp==GPRMC[Rx_count])    //比較開始$GPRMC字符,     
                               Rx_count++;
                     else   
                                 Rx_count=0;        
                   }
                else  //找到GPRMC開始保存數(shù)據(jù)
                {
                         if(Rx_temp==',')                                //如果收到逗號,
                        {
                                fg_count++;                                        //計(jì)數(shù)增加
                                da_count=0;
                        }
                        else
                        {
                                 if(fg_count==1)                                //保存時(shí)間數(shù)據(jù)
                                {
                                        if(da_count<6)                   //只保存前6位時(shí)間數(shù)據(jù)
                                                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位時(shí)間數(shù)據(jù)
                                                weidu[da_count++]=Rx_temp;
                                        }

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


                                else//經(jīng)度
                                        if(fg_count==5)                        //保存定位信息
                                        {       
                                                if(da_count<10)                   //只保存前10位時(shí)間數(shù)據(jù)
                                                jindu[da_count++]=Rx_temp;
                                        }
  
                                else  //經(jīng)度半球E(東經(jīng))或W(西經(jīng))
                                        if(fg_count==6)                        //保存定位信息
                                        {       
                                                EW=Rx_temp;
                                        }
                                else  //地面速率(000.0~999.9節(jié),前面的0也將被傳輸)
                                        if(fg_count==7)                        //保存定位信息
                                        {       
                                                if(da_count<5)                   //只保存前10位時(shí)間數(shù)據(jù)
                                                shudu[da_count++]=Rx_temp;
                                        }


/*****************************************************/
                                        else
                                                if(fg_count==9)                                  //保存日期數(shù)據(jù)
                                                        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)  //標(biāo)志位為1,開始接收
                {
                        rev_buf[num++] = Rx_temp;  //字符存到數(shù)組中
                        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)                // 當(dāng)整數(shù)小于10時(shí),轉(zhuǎn)化為"0x"的格式
        {
                *Ptr ++ = '0';
                *Ptr ++ = x+0x30;
        }
        else
        {
                while(x > 0)
                {
                        t = x % 10;
                        x = x / 10;
                        Buf[i++] = t+0x30;        // 通過計(jì)算把數(shù)字轉(zhuǎn)化成ASCII碼形式
                }
                i -- ;
                for(;i >= 0;i --)                 // 將得到的字符串倒序
                {
                        *(Ptr++) = Buf[i];
                }
        }
        *Ptr = '\0';
}


void utc2btc(){

   uchar xdata max;

        shi=(SJ[0]-0x30)*10        + (SJ[1]-0x30);                 //時(shí)
        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;                        //轉(zhuǎn)換為北京時(shí)間 ,東8區(qū)要+8
                        if(shi>23)                //如果超過23則到了第二天
                        {   
                                shi-=24;        //
                                ri+=1;                //日+1
                                switch(yue)                //獲取每月最大天數(shù)
                                {
                                         case 2:                         //2月
                                                if(nian%4==0)  //判斷是否閏月,只取2000-2099年,因此簡單的%4運(yùn)算
                                                        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;
                                        }
                                }
                        }
}
ID:932645 發(fā)表于 2026-1-30 22:41
不知道怎么搞,有人知道嗎

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表