痞酷網_PIGOO

 找回密碼
 立即註冊
!!! [系統偵測到廣告阻擋軟體] !!!

如果您覺得痞酷網對您有些許幫助,或者您認同痞酷網的理想,

那麼希望您將痞酷網設定為白名單.

並請在上論壇的時候,動動您的手指,用行動支持我們.

謝謝!
查看: 6153|回復: 22

【分享】淘寶買電子LED時鐘

[複製鏈接]
發表於 2015-7-9 09:22:22 | 顯示全部樓層 |閱讀模式
本文章最後由 小蟲弟 於 2015-7-9 09:46 AM 編輯

由於小弟覺得它的外型還滿漂亮的!還有壓克力外殼!所以小弟就請朋友代買了一個翠綠的(花了$280元+CR1220 3V電池 $35元)
20150704_192202.jpg

他的外殼最後面那片給錯了!所以又找了兩個朋友一起多買了兩套讓老闆補寄我的背蓋
20150704_205711.jpg

這是成品(未加殼)
20150704_220037.jpg

這是成品(加殼)
FB_IMG_1436072263849.jpg

這是背後電路板
20150709_093521.jpg

這是老闆給的程式碼!提供給各位大大使用
1寸大钟1_ok程序.rar (89.3 KB, 下載次數: 39)


可以請問一下有大大知道這個藍芽太陽能GPS接收器要如何找到他的RS232/TTL腳位在哪裡呢?
我想要學阿乾大大的使用GPS去校正時間
20150627_203105.jpg
20150627_203141.jpg

評分

5

查看全部評分

發表於 2015-7-11 06:35:09 | 顯示全部樓層
讚~
發表於 2015-7-11 17:17:33 | 顯示全部樓層
要找 GPS 模組的 TTL TX 輸出腳有四種方法。

1. 看模組型號找資料,但這鐵殼上沒有可以幫的上忙的文字。
2. 用示波器找 TX 接腳,因為是輸出串列數位信號即使沒有衛星信號也能輸出所以很快就能找到。
3. 沒有示波器但有邏輯筆,看上頭的脈波燈有亮時那隻腳就是了。
4. 只有電腦但還是需要 USB TTL 介面轉換線,開啟終端機程式後先設 4800 8 N 1,以 TTL 介面上的 RX 接腳去找,找到螢幕有文字一直行列出來的就是了,如果文字是亂碼就改速率為 9600。

評分

3

查看全部評分

發表於 2015-7-12 13:52:46 | 顯示全部樓層
GPS版子上的 藍牙模組外接的信號中,或許可以找到 TX RX的信號!!
 樓主| 發表於 2015-7-13 09:04:00 | 顯示全部樓層
本文章最後由 小蟲弟 於 2015-7-13 09:05 AM 編輯
duke83 發表於 2015-7-11 05:17 PM
要找 GPS 模組的 TTL TX 輸出腳有四種方法。

1. 看模組型號找資料,但這鐵殼上沒有可以幫的上忙的文字。


duke83大大~
1.是不是那個鐵殼要拆開呢?
2.我沒有示波器!可能要跟朋友借
3.邏輯筆也是沒有
4.ttl我有~我再試試看!是在mini usb口去找?

謝謝您!
 樓主| 發表於 2015-7-13 09:05:08 | 顯示全部樓層
antlu 發表於 2015-7-12 01:52 PM
GPS版子上的 藍牙模組外接的信號中,或許可以找到 TX RX的信號!!


阿乾大~我那天在網路上好像有搜尋到藍芽模組蒂幾根腳是ttl,我再研究看看!只是目前好像沒有找到我那張藍芽

謝謝您!
發表於 2015-7-13 12:16:48 | 顯示全部樓層
小蟲弟 發表於 2015-7-13 09:04 AM
duke83大大~
1.是不是那個鐵殼要拆開呢?
2.我沒有示波器!可能要跟朋友借

紅框內的接點去量。
1.jpg

用 TTL 介面內的 RX 那一根接腳去碰紅框內的接點,地線也要連接。
可以先用電表去量接點電壓,電壓介於電源電壓與 0 伏之間的接腳就有可能。
 樓主| 發表於 2015-7-13 13:51:30 | 顯示全部樓層
duke83 發表於 2015-7-13 12:16 PM
紅框內的接點去量。

duke83大大!
我大概了解您說的!就是先用rx去找哪一隻腳在傳輸就是tx~那rx該如何找呢?
還有我是否先拿電表!將負極接著~找出哪一腳是正~不要用rx去接到呢?
量電壓也是將負先接再板子上的負~再用正去找哪一個是您說的電源電壓介於電壓與0v之間呢?
麻煩您了~
發表於 2015-7-13 15:20:42 | 顯示全部樓層
小蟲弟 發表於 2015-7-13 01:51 PM
duke83大大!
我大概了解您說的!就是先用rx去找哪一隻腳在傳輸就是tx~那rx該如何找呢?
還有我是否先拿電表 ...

GPS 模組上的 RX 腳不必接,除非你要對這顆 GPS 模組做設定,如要設定就會更麻煩所以就不要管他。

用電表量數位信號的電壓值高低跟脈波寬度有關,正脈波越多電壓也就越高,可以先排除電源接腳與空腳。
 樓主| 發表於 2015-7-13 16:08:25 | 顯示全部樓層
duke83 發表於 2015-7-13 03:20 PM
GPS 模組上的 RX 腳不必接,除非你要對這顆 GPS 模組做設定,如要設定就會更麻煩所以就不要管他。

用電 ...

對吼~我忘記我只是要讀取資料!謝謝duke83大大提醒~
感謝大大~我會找時間試試看的!有問題可能要再麻煩各位
 樓主| 發表於 2015-7-14 21:12:00 | 顯示全部樓層
本文章最後由 小蟲弟 於 2015-7-14 09:16 PM 編輯
duke83 發表於 2015-7-13 03:20 PM
GPS 模組上的 RX 腳不必接,除非你要對這顆 GPS 模組做設定,如要設定就會更麻煩所以就不要管他。

用電 ...


duke83大大~我有找到TX了!!
是這一個腳~
092834qfu9fqt98qiqqgiu.jpg
我的泰康串口大師在家裡不能選擇com12(會說開啟com12失敗),在學校可以!
串口大師是只有com1可以選擇
所以我是用超級終端機去讀取的!
有讀到這些

$PMTK010,001*2E               
$GPGGA,235946.006,8960.000000,N,00000.000000,E,0,0,,137.000,M,13.000,M,,*4A                                                                           
$GPGSA,A,1,,,,,,,,,,,,,,,*1E                           
$GPRMC,235946.006,V,8960.000000,N,00000.000000,E,0.000,0.00,050180,,,N*44                                                                        
$GPVTG,0.00,T,,M,0.000,N,0.000,K,N*32                                    
$GPGGA,235947.006,8960.000000,N,00000.000000,E,0,0,,137.000,M,13.000,M,,*4B                                                                           
$GPGSA,A,1,,,,,,,,,,,,,,,*1E                           
$GPRMC,235947.006,V,8960.000000,N,00000.000000,E,0.000,0.00,050180,,,N*45                                                                        
$GPVTG,0.00,T,,M,0.000,N,0.000,K,N*32                                    
$GPGGA,235948.005,8960.000000,N,00000.000000,E,0,0,,137.000,M,13.00                                                                 
$GPGSA,A,1,,,,,,,,,,,,,,,*1E                           
$GPRMC,235948.005,V,8960.000000,N,00000.000000,E,0.000,0.00,050180,,,N*49                                                                        
$GPVTG,0.00,T,,M,0.000,N,0.000,K,N*32                                    
$GPGGA,235949.005,8960.000000,N,00000.000000,E,0,0,,137.000,M,13.000,M,,*46                                                                           
$GPGSA,A,1,,,,,,,,,,,,,,,*1E                           
$GPRMC,235949.005,V,8960.000000,N,00000.000000,E,0.000,0.00,050180,,,N*48                                                                        
$GPVTG,0.00,T,,M,0.000,N,0.000,K,N*32                                    
$GPGGA,235950.006,8960.000000,N,00000.000000,E,0,0,,137.000,M,13.000,M,,*4D                                                                           
$GPGSA,A,1,,,,,,,,,,,,,,,*1E                           
$GPGSV,1,1,00*79

可以請問接下來我該如何使用嗎?
感謝~
發表於 2015-7-14 21:46:59 | 顯示全部樓層
寫程式把它解出來!! 以前 LEGION大有用 ASM 做出來,我後來把它改成C ...


//   LCM GPS時鐘有 1302
/*-----------------------------------------------
  20120915 要改寫程式 目標 加上DS1302 作為 REALTIME CLOCK, 當 GPS信號為 A 時候 更新 DS1302裡面的資料,平常由 DS1302來計時,要校正的時候,只要把 GPS 供電,這時候GPS信號達到水準就可以.
  20120918 增加 p1^1 LO動作 強迫校時 時間約 25分鐘讀取 gps 訊號
------------------------------------------------*/

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include <stdio.h>
sbit SCK=P1^4;        //ds1302 時鐘       
sbit SDA=P1^5;               
sbit RST=P1^6;
bit ReadTimeFlag;//定义读时间标志
bit ReadTempFlag;
bit SetFlag;     //更新时间标志位
float temperature;
unsigned char temp[20];
sbit DQ=P1^3;//ds18b20 端口
sbit RS = P2^4;   //定义端口 ds1602 LCM
sbit RW = P2^5;
sbit EN = P2^6;
sbit FCUPSW = P1^1;//LO動作
//DS1602
#define RS_CLR RS=0
#define RS_SET RS=1
#define RW_CLR RW=0
#define RW_SET RW=1
#define EN_CLR EN=0
#define EN_SET EN=1
#define DataPort P0
//新增GPS部分
unsigned char REV_DATA,Gok;//GPS_ST 存放 a v 狀態
unsigned char FCUDT;//強迫更新時間計時 15分
bit rec;
unsigned char CLCK[6];//GPS hr min sec store
unsigned char GPS_AV;//GPS 信號 A強  V弱
unsigned char YMD[6];//年月日存放
unsigned char dca,dcb,dcc,ms2,ms3;// time counter SEC MIN HR
unsigned char time_buf1[8];//空年月日时分秒周 extern
void DelayMs(unsigned char t);
bit LCD_Check_Busy(void) ;
void LCD_Write_Com(unsigned char com) ;
void LCD_Write_Data(unsigned char Data) ;
void LCD_Clear(void) ;
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) ;
void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) ;
void LCD_Init(void) ;
void Init_Timer0(void);//定时器初始化
void UART_Init(void);
void GPS_Write(void);//把 GPS 的時間寫入 DS1302
// void Adj( void);
//----------------************----------------------------
//DS1302复位脚
#define RST_CLR        RST=0//电平置低
#define RST_SET        RST=1//电平置高
#define IO_CLR        SDA=0//电平置低
#define IO_SET        SDA=1//电平置高
#define IO_R        SDA  //电平读取
#define SCK_CLR        SCK=0//时钟信号
#define SCK_SET        SCK=1//电平置高


#define ds1302_sec_add                        0x80                //秒数据地址
#define ds1302_min_add                        0x82                //分数据地址
#define ds1302_hr_add                        0x84                //时数据地址
#define ds1302_date_add                        0x86                //日数据地址
#define ds1302_month_add                0x88                //月数据地址
#define ds1302_day_add                        0x8a                //星期数据地址
#define ds1302_year_add                        0x8c                //年数据地址
#define ds1302_control_add                0x8e                //控制数据地址
#define ds1302_charger_add                0x90                                          
#define ds1302_clkburst_add                0xbe

extern unsigned char time_buf[8] ;//空年月日时分秒周
void Ds1302_Write_Byte(unsigned char addr, unsigned char d);
unsigned char Ds1302_Read_Byte(unsigned char addr) ;
void Ds1302_Write_Time(void) ;
void Ds1302_Read_Time(void)  ;
void Ds1302_Init(void);

//-----------------**************-----------------------

/*------------------------------------------------
              串口通讯初始化
------------------------------------------------*/
void UART_Init(void)
{
    SCON  = 0x50;                        // SCON: 模式 1, 8-bit UART, 使能接收  
//    TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重装----4800 only
//    TH1   = 0xfa;               // TH1:  重装值 GPS 4800 波特率 晶振 11.0592MHz ---4800 only
    T2CON = 0x34;  // timer2 parameter set ---38400 only
    RCAP2H = 0xff; //set uart baud rate 38400---38400 only
        RCAP2L = 0xf7;//  --------------------------38400 only
    ET2 = 1;// enable timer2 overflow flag -----38400 only
        TR2 = 1;// timer2 enable  ------------------38400 only            
//   TR1   = 1;                  // TR1:  timer 1 打开 ------------------ ?4800 only                        
    EA    = 1;                  //打开总中断
    ES    = 1;                  //打开串口中断
}

/*------------------------------------------------
                    定时器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{
TMOD |= 0x01;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响                     
//TH0=0x00;              //给定初值
//TL0=0x00;
EA=1;            //总中断打开
ET0=1;           //定时器中断打开
TR0=1;           //定时器开关打开
}
/*------------------------------------------------
                 定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1
{
TH0=(65536-2010)/256;                  //重新赋值 2ms
TL0=(65536-2010)%256;  
   if(dca==20)        //20sec 讀取溫度1次
      {
       ReadTempFlag=1;//读标志位置1
          }
   ms2++;// 2ms setflag
   if(ms2>150)//2*74=200ms
    {
     ms2=0;
         ReadTimeFlag=1;
     ms3++;//-------------------------
    }
   if(ms3>3)//5
     {
      ms3=0;
          dca++;//dca=1sec count
     }
   if(dca>59)
         {       
      dcb++;
          dca=0;
          if(FCUPSW==0)//P1^1 sw lo動作
          {
            FCUDT++;//強迫更新時間
          }
         }
   if(dcb>59)
     {
      dcb=0;
      dcc++;
     }
   if(dcc>23)
     {
      dcc=0;
     }
  

}



//GPS 部分

void UART_SER (void) interrupt 4 //來自GPS 程式
{
     if(RI)                        //判断是接收中断产生
     {
          RI=0;                      //标志位清零
          REV_DATA =SBUF;                 //读入缓冲区的值
      rec=1;
         }
   if(TI)  //如果是发送标志位,清零
     TI=0;
}


void CLCKFL(unsigned char CLCKCT)//填入6個時 分 秒資料
{
  unsigned char ct=0;
  rec=0;//必要的
   while(CLCKCT>ct)//儲存數量
   {
    while(rec==0);
        if(rec==1)
         {
          CLCK[ct]=REV_DATA-0x30;
      rec=0;
          ct++;
          }
        }
}

//0819 填入6個年月日資料
void YMDFL(unsigned char YMDCT)
{
  unsigned char yt=0;
  rec=0;//必要的
   while(YMDCT>yt)//儲存數量
   {
    while(rec==0);
        if(rec==1)
         {
          YMD[yt]=REV_DATA-0x30;
      rec=0;
          yt++;
          }
        }
}


//0819 跳過幾個逗號

void JPDM(unsigned char DM)
{
  rec=0;
  while(DM)//>dmt
   {
    while(rec==0);
//        if (rec==1)
         {
     if(REV_DATA == ',')
         {
         rec=0;
         DM--;//dmt++
         }
         }
   }
}


void GPS_Write(void)//把 GPS 的時間寫入 DS1302
    {
                time_buf1[3]=YMD[0]*10+YMD[1];//日
        time_buf1[2]=YMD[2]*10+YMD[3];// 月  
                time_buf1[1]=YMD[4]*10+YMD[5];//  年
        time_buf1[4]=CLCK[0]*10+CLCK[1];//HR
                time_buf1[5]=CLCK[2]*10+CLCK[3];// min
                time_buf1[6]=CLCK[4]*10+CLCK[5];// sec
        Ds1302_Write_Time();
    }






unsigned char  Get_Gps(void)//改寫 gps 讀取程式 把 Gok=GPRMC_K() 取消
{
unsigned char TT;
  if(rec==1)
    {
    if(REV_DATA == '$')
     {
      rec=0;
     }
         }
         else
         {
         return 0;
         }
         while(rec==0);
     if(REV_DATA == 'G')
                  {
          rec=0;
          }
         while(rec==0);      
     if(REV_DATA == 'P')           
                {
        rec=0;
        }
         while(rec==0);        
     if(REV_DATA == 'R')//一路比較下去全部要相同 "GPRMC,"           
                  {
          rec=0;
          }
                   else
          {
                 return 0;     
           }
                     while(rec==0);        
          if(REV_DATA == 'M')//一路比較下去全部要相同 "GPRMC,"   
           {      
                        rec=0;     
           }
                     while(rec==0);      
          if(REV_DATA == 'C')//一路比較下去全部要相同 "GPRMC,"           
                   {
                 rec=0;
            }
          while(rec==0);     
          if(REV_DATA == ',')//一路比較下去全部要相同 "GPRMC,"
                   {
             rec=0;
             }
                  else
                    {
              return 0;
            }

    CLCKFL(6);//取 時分秒

    JPDM(1);
        while(rec==0);
        {
    GPS_AV = REV_DATA;
        }
   
    JPDM(7);//跳過8個逗號
        YMDFL(6);//取 年月日

  TT=CLCK[0]*10+CLCK[1]+8;
  if(TT>23)
     TT-=24;
         CLCK[0]=TT/10;
         CLCK[1]=TT%10;

  return 1;
  
  }


/*------------------------------------------------
              判忙函数
------------------------------------------------*/
bit LCD_Check_Busy(void)
{
DataPort= 0xFF;
RS_CLR;
RW_SET;
EN_CLR;
//nop_();
EN_SET;
return (bit)(DataPort & 0x80);
}
/*------------------------------------------------
              写入命令函数
------------------------------------------------*/
void LCD_Write_Com(unsigned char com)
{  
while(LCD_Check_Busy()); //忙则等待
RS_CLR;
RW_CLR;
EN_SET;
DataPort= com;
//_nop_();
EN_CLR;
}
/*------------------------------------------------
              写入数据函数
------------------------------------------------*/
void LCD_Write_Data(unsigned char Data)
{
while(LCD_Check_Busy()); //忙则等待
RS_SET;
RW_CLR;
EN_SET;
DataPort= Data;
// _nop_();
EN_CLR;
}

/*------------------------------------------------
                清屏函数
------------------------------------------------*/
void LCD_Clear(void)
{
LCD_Write_Com(0x01);
DelayMs(5);
}
/*------------------------------------------------
              写入字符串函数
------------------------------------------------*/
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
{     
if (y == 0)
        {     
         LCD_Write_Com(0x80 + x);     //表示第一行
        }
else
        {      
        LCD_Write_Com(0xC0 + x);      //表示第二行
        }        
while (*s)
        {     
LCD_Write_Data( *s);     
s ++;     
        }
}

/*------------------------------------------------
              写入字符函数
------------------------------------------------*/
/*
void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
{     
if (y == 0)
        {     
        LCD_Write_Com(0x80 + x);     
        }   
else
        {     
        LCD_Write_Com(0xC0 + x);     
        }        
LCD_Write_Data( Data);  
}
*/
/*------------------------------------------------
              初始化函数
------------------------------------------------*/
void LCD_Init(void)
{
   LCD_Write_Com(0x38);    /*显示模式设置*/
   DelayMs(5);
   LCD_Write_Com(0x38);
   DelayMs(5);
   LCD_Write_Com(0x38);
   DelayMs(5);
   LCD_Write_Com(0x38);  
   LCD_Write_Com(0x08);    /*显示关闭*/
   LCD_Write_Com(0x01);    /*显示清屏*/
   LCD_Write_Com(0x06);    /*显示光标移动设置*/
   DelayMs(5);
   LCD_Write_Com(0x0C);    /*显示开及光标设置*/
   }

void DelayUs2x(unsigned char t)
{   
while(--t);
}

void DelayMs(unsigned char t)
{
     
while(t--)
{
     DelayUs2x(245);
         DelayUs2x(245);
}
}


unsigned char time_buf[8] ;                         //空年月日时分秒周
/*------------------------------------------------
           向DS1302写入一字节数据
------------------------------------------------*/
void Ds1302_Write_Byte(unsigned char addr, unsigned char d)
{

        unsigned char i;
        RST_SET;       
       
        //写入目标地址:addr
        addr = addr & 0xFE;     //最低位置零
        for (i = 0; i < 8; i ++)
            {
                if (addr & 0x01)
                    {
                        IO_SET;
                        }
                else
                    {
                        IO_CLR;
                        }
                SCK_SET;
                SCK_CLR;
                addr = addr >> 1;
                }
       
        //写入数据:d
        for (i = 0; i < 8; i ++)
           {
                if (d & 0x01)
                    {
                        IO_SET;
                        }
                else
                    {
                        IO_CLR;
                        }
                SCK_SET;
                SCK_CLR;
                d = d >> 1;
                }
        RST_CLR;                                        //停止DS1302总线
}
/*------------------------------------------------
           从DS1302读出一字节数据
------------------------------------------------*/

unsigned char Ds1302_Read_Byte(unsigned char addr)
{

        unsigned char i;
        unsigned char temp;
        RST_SET;       

        //写入目标地址:addr
        addr = addr | 0x01;//最低位置高
        for (i = 0; i < 8; i ++)
            {
             
                if (addr & 0x01)
                   {
                        IO_SET;
                        }
                else
                    {
                        IO_CLR;
                        }
                SCK_SET;
                SCK_CLR;
                addr = addr >> 1;
                }
       
        //输出数据:temp
        for (i = 0; i < 8; i ++)
            {
                temp = temp >> 1;
                if (IO_R)
                   {
                        temp |= 0x80;
                        }
                else
                   {
                        temp &= 0x7F;
                        }
                SCK_SET;
                SCK_CLR;
                }
       
        RST_CLR;        //停止DS1302总线
        return temp;
}

/*------------------------------------------------
           向DS1302写入时钟数据
------------------------------------------------*/
void Ds1302_Write_Time(void)
{
     
    unsigned char i,tmp;
        for(i=0;i<8;i++)
            {                  //BCD处理
                tmp=time_buf1[i]/10;
                time_buf[i]=time_buf1[i]%10;
                time_buf[i]=time_buf[i]+tmp*16;
            }
        Ds1302_Write_Byte(ds1302_control_add,0x00);                        //关闭写保护
        Ds1302_Write_Byte(ds1302_sec_add,0x80);                                //暂停
        //Ds1302_Write_Byte(ds1302_charger_add,0xa9);                        //涓流充电
        Ds1302_Write_Byte(ds1302_year_add,time_buf[1]);                //年
        Ds1302_Write_Byte(ds1302_month_add,time_buf[2]);        //月
        Ds1302_Write_Byte(ds1302_date_add,time_buf[3]);                //日
        Ds1302_Write_Byte(ds1302_day_add,time_buf[7]);                //周
        Ds1302_Write_Byte(ds1302_hr_add,time_buf[4]);                //时
        Ds1302_Write_Byte(ds1302_min_add,time_buf[5]);                //分
        Ds1302_Write_Byte(ds1302_sec_add,time_buf[6]);                //秒
        Ds1302_Write_Byte(ds1302_day_add,time_buf[7]);                //周
        Ds1302_Write_Byte(ds1302_control_add,0x80);                        //打开写保护
}

/*------------------------------------------------
           从DS1302读出时钟数据
------------------------------------------------*/
void Ds1302_Read_Time(void)  
{
               unsigned char i,tmp;
        time_buf[1]=Ds1302_Read_Byte(ds1302_year_add);                //年
        time_buf[2]=Ds1302_Read_Byte(ds1302_month_add);                //月
        time_buf[3]=Ds1302_Read_Byte(ds1302_date_add);                //日
        time_buf[4]=Ds1302_Read_Byte(ds1302_hr_add);                //时
        time_buf[5]=Ds1302_Read_Byte(ds1302_min_add);                //分
        time_buf[6]=(Ds1302_Read_Byte(ds1302_sec_add))&0x7F;//秒
        time_buf[7]=Ds1302_Read_Byte(ds1302_day_add);                //周


        for(i=0;i<8;i++)
           {           //BCD处理
                tmp=time_buf[i]/16;
                time_buf1[i]=time_buf[i]%16;
                time_buf1[i]=time_buf1[i]+tmp*10;
           }
}

/*------------------------------------------------
                DS1302初始化
------------------------------------------------*/
void Ds1302_Init(void)
{
       
        RST_CLR;                        //RST脚置低
        SCK_CLR;                        //SCK脚置低
    Ds1302_Write_Byte(ds1302_sec_add,0x00);                                 
}



/*------------------------------------------------
                    18b20初始化
------------------------------------------------*/
bit Init_DS18B20(void)
{
bit dat=0;
DQ = 1;    //DQ复位
DelayUs2x(5);   //稍做延时
DQ = 0;         //单片机将DQ拉低
DelayUs2x(200); //精确延时 大于 480us 小于960us
DelayUs2x(200);
DQ = 1;        //拉高总线
DelayUs2x(50); //15~60us 后 接收60-240us的存在脉冲
dat=DQ;        //如果x=0则初始化成功, x=1则初始化失败
DelayUs2x(25); //稍作延时返回
return dat;
}

/*------------------------------------------------
                    读取一个字节
------------------------------------------------*/
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
  DQ = 0; // 给脉冲信号
  dat>>=1;
  DQ = 1; // 给脉冲信号
  if(DQ)
   dat|=0x80;
  DelayUs2x(25);
}
return(dat);
}
/*------------------------------------------------
                    写入一个字节
------------------------------------------------*/
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
  DQ = 0;
  DQ = dat&0x01;
  DelayUs2x(25);
  DQ = 1;
  dat>>=1;
}
DelayUs2x(25);
}

/*------------------------------------------------
                    读取温度
------------------------------------------------*/
unsigned int ReadTemperature(void)
{
unsigned char a=0;
unsigned int b=0;
unsigned int t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
DelayMs(10);
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar();   //低位
b=ReadOneChar();   //高位

b<<=8;
t=a+b;

return(t);
}




void Normal_dsp(void)//正常顯示模式 放在主程式裡
{
    int atemp;
    if(ReadTempFlag==1)//讀取溫度 放到temperature
    {
     ReadTempFlag=0;
     atemp=ReadTemperature();
     temperature=(float)atemp*0.0625;
     }       
    if(ReadTimeFlag==1) //定时读取ds1302 定时时间到 则标志位置1,处理过时间参数标志位清零
     {
     ReadTimeFlag=0;  //标志位清零
     Ds1302_Read_Time();//读取时间参数

     sprintf(temp,"DC 20%02d-%02d-%02d %02c",(int)time_buf1[1],(int)time_buf1[2],(int)time_buf1[3],(char)GPS_AV );//年月日周
      LCD_Write_String(0,0,temp);//显示第一行
     sprintf(temp," %02d:%02d:%02d  %04.2f'C",(int)time_buf1[4],(int)time_buf1[5],(int)time_buf1[6],(float)temperature);//时分秒
      LCD_Write_String(0,1,temp);//显示第二行
      }
   }       



void main (void)
{
LCD_Init();           //初始化液晶
DelayMs(20);          //延时有助于稳定
LCD_Clear();          //清屏
Init_Timer0();        //定时器0初始化
Ds1302_Init();        //ds1302初始化
Init_DS18B20();
UART_Init();          //串口初始化
Ds1302_Read_Time();   //首次读取时间
//if((time_buf1[2]+time_buf1[7])==0) //如果所有参数都为0,写入一个初始值
//   Ds1302_Write_Time();

while (1)         //主循环
  {     
           Gok= Get_Gps();//取GPS信號
       if(Gok==1)
        {
         
          if(GPS_AV=='A')
           {
            GPS_Write();
                        Gok=0;
           }
         }
        if(FCUDT==25)//此一動作為長久收不到4個衛星信號強迫寫入時間
                {
         GPS_Write();
         FCUDT=0;
                }


            Normal_dsp();//一般正常的顯示
   }
}

評分

3

查看全部評分

發表於 2015-7-14 21:54:24 | 顯示全部樓層
只要讀 $GPRMC 這行就夠了,要讀 $GPGGA 也可。
例如你擷取中的這行 $GPRMC,235948.005,V,8960.000000,N,00000.000000,E,0.000,0.00,050180,,,N*49
接在 $GPRMC 後面就是時間了,這段字串 235948.005 就代表 23 點 59 分 48.005 秒。
這是 UTC 或稱 GMT 時間,台灣時間要在程式中加上時區 +8,更精確的計算要算進 4800 BPS 的時間延遲。
再更理想的就是去讀 1PPS 的同步脈衝,這個同步脈衝的同步精確度達到 1uS 以內,1Hz 的頻率誤差也在 1ppm 以內,GPS 模組接腳內就有這 PPS 信號等你去發掘。

後頭的寫程式我就沒辦法,請自行研究。

評分

1

查看全部評分

 樓主| 發表於 2015-7-15 10:54:06 | 顯示全部樓層
antlu 發表於 2015-7-14 09:46 PM
寫程式把它解出來!! 以前 LEGION大有用 ASM 做出來,我後來把它改成C ...

謝謝阿乾大大提供~
這一些程式碼可能要慢慢研究了!!對c不是很熟!
可以請問一下這個程式碼跟廠商給我的程式碼要合併嗎?還是一個一個燒進去stc單片機裡面呢?還是ds1302呢?
不好意思!!一直麻煩你們
 樓主| 發表於 2015-7-15 11:02:09 | 顯示全部樓層
duke83 發表於 2015-7-14 09:54 PM
只要讀 $GPRMC 這行就夠了,要讀 $GPGGA 也可。
例如你擷取中的這行 $GPRMC,235948.005,V,8960.000000,N,00 ...

謝謝duke83大大!
我大致上了解您說的了~那個數字就是時間的部分!
大大 請問$GPRMC出現的050180就是日期嗎?
發表於 2015-7-15 19:47:15 | 顯示全部樓層
小蟲弟 發表於 2015-7-15 11:02 AM
謝謝duke83大大!
我大致上了解您說的了~那個數字就是時間的部分!
大大 請問$GPRMC出現的050180就是日期嗎 ...

這些電碼內都沒有日期,電子鐘如要顯示日期要自己寫算萬年曆的程式。
或是想辦法去下指令去讓 GPS 模組能夠輸出 $GPZDA 字串,裡面除了時間與日期外還有星期幾。
 樓主| 發表於 2015-7-15 21:39:32 | 顯示全部樓層
duke83 發表於 2015-7-15 07:47 PM
這些電碼內都沒有日期,電子鐘如要顯示日期要自己寫算萬年曆的程式。
或是想辦法去下指令去讓 GPS 模組能 ...

了解~感謝duke83大大!
我會慢慢研究的!謝謝
 樓主| 發表於 2015-7-17 23:03:17 | 顯示全部樓層
不好意思,在請問各位大大,有人知道程式碼裡面哪裡是寫整點提示音的嗎?因為最近發現有時叫2聲有時4聲有時6聲,好像都是隨便叫,還有我沒有設定晚上12點叫,連續好幾天睡著後叫的…
麻煩各位大大幫小弟解答了!
發表於 2015-7-18 07:43:31 | 顯示全部樓層
很漂亮、實用的套件,感謝分享!
發表於 2015-7-19 21:27:23 | 顯示全部樓層
小蟲弟 發表於 2015-7-15 10:54 AM
謝謝阿乾大大提供~
這一些程式碼可能要慢慢研究了!!對c不是很熟!
可以請問一下這個程式碼跟廠商給我的程 ...

小蟲弟:
   STC 單晶片有它的 C語言編譯器,你可以練習練習,就知道怎麼做!! 我也是胡亂的抄網路的例子,一般最好有經驗的程式師幫忙指導,這樣就可以有正確的概念!!
   所有的功能可以合併一起也可以分開最後再連結起來!!
 樓主| 發表於 2015-7-19 21:48:53 | 顯示全部樓層
antlu 發表於 2015-7-19 09:27 PM
小蟲弟:
   STC 單晶片有它的 C語言編譯器,你可以練習練習,就知道怎麼做!! 我也是胡亂的抄網路的例子,一 ...

阿乾大!
了解了~就是要先將C語言編譯成機器碼~再上傳!我會研究看看的~
謝謝您!
發表於 2015-7-20 10:57:52 | 顯示全部樓層
本文章最後由 jason680 於 2015-7-20 04:00 PM 編輯
小蟲弟 發表於 2015-7-17 11:03 PM
不好意思,在請問各位大大,有人知道程式碼裡面哪裡是寫整點提示音的嗎?因為最近發現有時叫2聲有時4聲有時 ...


0. 基本上,這一整個就是!@#$%^&*()...
1. 整點報時程式在 main.c 695行開始
2. 整點的聲響是 bell()副程式 在ds1302.c 126行

只能說bug一堆,為什麼有bug一堆的起因在程式架構
及變數命名都有很大的問題...

舉一個簡單的例子:
時鐘的時間是由DS1302為主,因此 時,分,秒 合理的組合為
Hour, Minute, Second 加 ds1302 關鍵字 組合而成...
他用了...
    H_1302  ( Hour的H 加 DS1302的1302) <===這樣是OK,沒問題的...)
那依此類推 分跟秒應為
   M_1302  (Minute的M +1302)
   S_1302  (Second的S +1302)

但不知什麼原因...(猜測是 不懂英文,又初學(沒經驗)的Programmer...)
  用了 S_1302 為分, S1_1302為秒...

另外,它的整點報時,大有問題...所以你的整點報時大有問題...
H_1302是跟小時有關, 但 S_time跟小時無關...
if((H_1302 >=H_time )&&(H_1302<=S_time))

真正要解決問題,要一一的慢慢的 全部改過來...


 樓主| 發表於 2015-7-20 14:49:32 | 顯示全部樓層
jason680 發表於 2015-7-20 10:57 AM
0. 基本上,這一整個就是...
1. 整點報時程式在 main.c 695行開始
2. 整點的聲響是 bell()副程式 在ds1302 ...

jason680大大
原來程式大有問題~
看來要好好研究他的程式碼了~
s_time是否跟設定的時間有關呢?(因為他是設定幾點到幾點有開啟整點報時)
只是小弟才學疏淺!不知道是否找得出問題點
謝謝大大指導~
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

關閉

站長小叮嚀上一條 /1 下一條

禁閉室|手機版|連繫我們|痞酷網電子技術論壇

GMT+8, 2024-3-28 06:47 PM , Processed in 0.194414 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.