痞酷網_PIGOO

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

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

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

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

謝謝!
12
返回列表 發新帖
樓主: antlu

簡易型 GPS 時鐘

  [複製鏈接]
 樓主| 發表於 2012-8-17 17:27:11 | 顯示全部樓層
forest162 發表於 2012-8-17 11:07 AM static/image/common/back.gif
所以電路改成這樣對吧?:

forest162 大:
  排組一般都是8個一組(9隻腳) 也有7個一組的吧!(8隻腳) 它的作用主要是要把 ULN2003 拉高電位用!沒有它可是不行的!!
我記得限流電阻不需要再加電晶體,你上 GOOGLE 抓圖片,7段顯示線路上面都會有!!
發表於 2012-8-17 17:28:21 | 顯示全部樓層
看了第一張電路圖之後,
我發表一下,我的劣見,正不正確就要有高人來看了,

我的想法是應該在7805之前串上四個1N4007,先壓降然後7805功耗損就低了些了,熱量就沒那麼高了,
還有ULN2003的COMMON極應該接上7812後的輸出,然後每段LED後再串上限流電阻,

這樣的電路會不會比較好點!
請各位先進看看啦!
 樓主| 發表於 2012-8-17 17:40:03 | 顯示全部樓層
fatzeros 發表於 2012-8-17 05:28 PM static/image/common/back.gif
看了第一張電路圖之後,
我發表一下,我的劣見,正不正確就要有高人來看了,

FATZEROS大:
   感謝指正!! 因為我的小綠人 每一節都有一個限流電阻 110歐姆,我忘了劃出來!! 串上幾個1N4007降壓這點子很好!!
 樓主| 發表於 2012-8-17 17:44:20 | 顯示全部樓層
本帖最後由 antlu 於 2012-8-17 10:59 PM 編輯

今天問過 朋友以前在長天科技 他說 GPS 接收模組價格大量約 6~7 美金,但是少量可能要 20美金喔!!
http://goods.ruten.com.tw/item/qa?11080702878833#qna 網路有賣!!


rs232 轉 TTL 位準 可以成功轉換
rs232ttl.jpg
發表於 2012-8-18 10:02:46 | 顯示全部樓層
antlu 發表於 2012-8-17 05:27 PM static/image/common/back.gif
forest162 大:
  排組一般都是8個一組(9隻腳) 也有7個一組的吧!(8隻腳) 它的作用主要是要把 ULN2003 拉高 ...

所以排阻是接在ULN2003那7隻input腳,com點接Vcc?
 樓主| 發表於 2012-8-18 13:11:21 | 顯示全部樓層
forest162 發表於 2012-8-18 10:02 AM static/image/common/back.gif
所以排阻是接在ULN2003那7隻input腳,com點接Vcc?

是的沒錯!! 記得第一次沒接排阻 總是顯示的亂七八糟,結果排阻一接就OK了!! 還有 1602也要接排阻在 P0上!!
發表於 2012-8-18 21:35:16 | 顯示全部樓層
antlu 發表於 2012-8-18 01:11 PM static/image/common/back.gif
是的沒錯!! 記得第一次沒接排阻 總是顯示的亂七八糟,結果排阻一接就OK了!! 還有 1602也要接排阻在 P0上!! ...

antlu大大您好!!

小弟最近在研讀"單晶片"方面的書籍......針對這個回答有一點疑問??
您是不是都接在  P0 端當輸出??
51單晶片的P0是構造是"開路汲極"(Open Drain )....當做I/O時就必須接一組"提升電阻"(2K~10K)...
以避免準位不確定!!....其他的 P1.P2.P3端 就不用接提升電阻(內部已有設計...20k~30k)
應該不是只有外接ULN2003或 1602 的關係吧??
(若有錯誤....還請各位大大指正!!)
 樓主| 發表於 2012-8-19 11:57:10 | 顯示全部樓層
arthur0518 發表於 2012-8-18 09:35 PM static/image/common/back.gif
antlu大大您好!!

小弟最近在研讀"單晶片"方面的書籍......針對這個回答有一點疑問??

arthur大:
   應該是沒錯啦!! 習慣都以 P0作為 基本輸出!! 所以提醒有這樣的經驗!!
發表於 2012-8-19 19:34:03 | 顯示全部樓層
antlu 發表於 2012-8-18 01:11 PM static/image/common/back.gif
是的沒錯!! 記得第一次沒接排阻 總是顯示的亂七八糟,結果排阻一接就OK了!! 還有 1602也要接排阻在 P0上!! ...

阿乾大,三星GPS模塊他說沒貨,改為這個ok嗎?
http://item.taobao.com/item.htm?id=14950117647&
 樓主| 發表於 2012-8-19 19:38:11 | 顯示全部樓層
forest162 發表於 2012-8-19 07:34 PM static/image/common/back.gif
阿乾大,三星GPS模塊他說沒貨,改為這個ok嗎?
http://item.taobao.com/item.htm?id=14950117647& ...

forest162大:
   OK!!  感謝!!
 樓主| 發表於 2012-8-19 23:03:13 | 顯示全部樓層
更新 latch 版本 可以顯示 時 分 秒  在50~59秒時顯示 月 日 年,有興趣的請笑納!!


//20120808 modify OK  while(rec==0); 等待直到1才跳離 實驗板電路 ,7段顯示用

#include<reg52.h>
#define DataPort P0 // display LED segment
#define DrivePort P1 //display LED digit
//unsigned char code GPS_ASC[]="GPRMC,";
unsigned char CLCK[6];//時分秒存放={1,2,3,4,5,6}
unsigned char YMD[6]={1,2,0,8,1,9};//年月日存放
unsigned char Gok;// "$GPRMC," 確認完成
sbit Gok_LED =P1^2;// 收到"$GPRMC,"送出LED
sbit rec_led =P1^3;
bit rec;  // receive rs232 OK_flag
unsigned char REV_DATA;//儲存RS232緩衝區的暫存變數
void Init_Timer0(void);//定时器初始化
#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
sbit LATCH1=P2^2;//定义锁存使能端口 段锁存
sbit LATCH2=P2^3;//                 位锁存

unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
unsigned char TempData[8]; //存储显示值的全局变量
void CLCKFL(unsigned char CLCKCT);//簡化時分秒的儲存程式
void JPDM(unsigned char DM);//跳過幾個',"號


void Display(unsigned char FirstBit,unsigned char Num)
{
      static unsigned char i=0;
          

           DataPort=0;   //清空数据,防止有交替重影
       LATCH1=1;     //段锁存
       LATCH1=0;

       DataPort=dofly_WeiMa[i+FirstBit]; //取位码
       LATCH2=1;     //位锁存
       LATCH2=0;

       DataPort=TempData[i]; //取显示数据,段码
       LATCH1=1;     //段锁存
       LATCH1=0;
      
           i++;
       if(i==Num)
              i=0;


}

void Init_Timer0(void)
{
TMOD |= 0x01;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响                     
EA=1;            //总中断打开
ET0=1;           //定时器中断打开
TR0=1;           //定时器开关打开
}

void Timer0_isr(void) interrupt 1
{
// static unsigned int count;
TH0=(65536-2010)/256;//0xd8;                  //重新赋值 2ms
TL0=(65536-2010)%256; //0xf0;

    Display(0,6);
   
}

void UART_Init(void)
{
    SCON  = 0x50;                        // SCON: 模式 1, 8-bit UART, 使能接收  
    TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重装
    TH1   = 0xFA;               // TH1:  重装值 4800 11.0592MHz  
    TR1   = 1;                  // TR1:  timer 1 打开                        
    EA    = 1;                  //打开总中断
    ES    = 1;                  //打开串口中断
}

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

void CLCKFL(unsigned char CLCKCT)
{
  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)
{
// unsigned char dmt=0;
  rec=0;
  while(DM)//>dmt
   {
    while(rec==0);
        if (rec==1)
         {
     if(REV_DATA == ',')
         {
         rec=0;
         DM--;//dmt++
         }
         }
   }
}



//-------------------

unsigned char GPRMC_K(void)//比較 $GPRMC
{
unsigned char TT;//轉換用
          while(rec==0);
        if(rec==1)
              if(REV_DATA == 'G')//一路比較下去全部要相同 "GPRMC,"
                    rec=0;
                   else
                 return 0;
          while(rec==0);        
        if(rec==1)             
          if(REV_DATA == 'P')           
                        rec=0;   

                     while(rec==0);        
        if(rec==1)             
          if(REV_DATA == 'R')//一路比較下去全部要相同 "GPRMC,"           
                        rec=0;         
                  else
                    return 0;                 
      
                     while(rec==0);        
        if(rec==1)             
          if(REV_DATA == 'M')//一路比較下去全部要相同 "GPRMC,"           
                        rec=0;
           
                 
      
                     while(rec==0);        
        if(rec==1)             
          if(REV_DATA == 'C')//一路比較下去全部要相同 "GPRMC,"           
                        rec=0;


          while(rec==0);     
        if(rec==1)     
          if(REV_DATA == ',')//一路比較下去全部要相同 "GPRMC,"
                   rec=0;
                  else
                    return 0;

    CLCKFL(6);//取 時分秒
    JPDM(8);//跳過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;
  }



void Get_Gps(void)
{
if(rec==1)
  {
    rec=0;//清除授信旗標
    if(REV_DATA == '$')
     {
          Gok=GPRMC_K();//確認收到 "GPRMC," 字元
      }
    }
  }


void Dis_tr(void)//轉換相關值到顯示
{
unsigned j;
for(j=0;j<6;j++)
  {
   if(CLCK[4]==5)//50~59秒顯示年 月 日
   TempData[j]=dofly_DuanMa[YMD[j]];//CLCK
   else
   TempData[j]=dofly_DuanMa[CLCK[j]];//
  }
}


void main(void)
{
Init_Timer0();
UART_Init();
while(1)
{
Get_Gps();
  if(Gok==1)
      {
     Dis_tr();//轉換相關值到顯示
           }

  }
}
發表於 2012-8-22 10:49:37 | 顯示全部樓層
太厲害了
太複雜了
感謝分享IDER
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

關閉

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

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

GMT+8, 2024-12-19 05:04 AM , Processed in 0.059563 second(s), 16 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.