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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1157|回復: 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 單片機教程網

快速回復 返回頂部 返回列表