廣告廣告
  加入我的最愛 設為首頁 風格修改
首頁 首尾
 手機版   訂閱   地圖  簡體 
您是第 20255 個閱讀者
 
發表文章 發表投票 回覆文章
  可列印版   加為IE收藏   收藏主題   上一主題 | 下一主題   
u955067
數位造型
個人文章 個人相簿 個人日記 個人地圖
路人甲
級別: 路人甲 該用戶目前不上站
推文 x0 鮮花 x0
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片
推文 x0
[求助] 8051如何接收RS232資料
各位大大好!!
小弟想要用8051擷取GPS資料
8051 -> RS-232 -> GPS -> 資料顯示在LCD模組
GPS是USB 轉 RS-232
小弟之前是用PC -> USB -> GPS 來擷取資料
程式是用VB寫的
現在想用8051(因為比較輕便,而且用PC在家中會抓不到經緯度)
對於組合語言極度不熟,只有以前在學校玩過8051的LED

==============用PC擷取出來的資料==============
$GPGGA,000357.039,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*7D

$GPGGA,000358.030,000 ..

訪客只能看到部份內容,免費 加入會員 或由臉書 Google 可以看到全部內容



獻花 x0 回到頂端 [樓 主] From:歐洲 | Posted:2009-05-08 19:00 |
jason-poul 手機
個人文章 個人相簿 個人日記 個人地圖
小人物
級別: 小人物 該用戶目前不上站
推文 x1 鮮花 x26
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

在這部分,
不管是使用 assembly / C 都應該不會有多少差異,
因為不會因為語法的不同而導致你的Uart不能動!!

一般使用到RS-232(即Uart),
則會有Baud Rate的問題,
要先設好Buad Rate(看你是使用9600/14400/19200/38400/57600/115200... ...),
接者就要看你的datasheet,
你可以到那家廠商的網站下載sampo code,
一般就uart的部分,
都有完整的sampo code。

我有一些code可以給你參考,
其餘就靠你努力了!!

#define Uart_19200 0xEE // 19200 Bps, At 11.0592 Meg.
#define Uart_38400 0xF7 // 38400 Bps, At 11.0592 Meg.
#define Uart_57600 0xFA // 57600 Bps, At 11.0592 Meg.
#define Uart_115200 0xFD // 115200 Bps, At 11.0592 Meg

// Name : Uart_Select_Baud_Rate
// US_Baud_Rate. (Can Be Uart_19200/Uart_38400/Uart_57600/Uart_115200)
void Uart_Select(unsigned char US_Baud_Rate)
{
T2CON = 0x34; // 0011 1000,
                // TF2 = 0, EXF2 = 0, RCLK = 1, TCLK = 1,
                // EXEN2 = 1, TR2 = 0, C/T2 = 0, CP/RL2 = 0.
TL2 = US_Baud_Rate; // Set Count.
TH2 = 0xFF;       // Set Up Count.
RCAP2L = US_Baud_Rate; // Set Count.
RCAP2H = 0xFF;       // Set Up Count.
SCON = 0x50; // 0101 0000,
// SM0 = 0, SM1 = 1 (8 BIT VARIABLE), SM2 = 0 (NO MULTIMODE), REN = 1 (SERIAL RECEPTION),
// TB8 = 0, RB8 = 0, TI = 0, RI = 0.
ES = 1; // Enable Uart Interrupt.
EA = 1; // Global Int Enable.
TR2 = 1; // Timer 2 Enable.
}

// Local Variable Definition
#define Receive_Buffer_Size 128 // Receive Buffer Size. (0 - 255)
bit Receive_Get = 0;
unsigned char xdata Receive_Buffer_Index = 0;
unsigned char xdata Receive_Buffer[Receive_Buffer_Size] = {0}; // Receive_Buffer.

// Name : Uart_Interrupt
void Uart_Interrupt(void) interrupt 4
{
if (RI == 1)
{
  if (Receive_Get == 0) // If Receive_Buffer Not Full.
  {
    if ((SBUF >= 0x21) && (SBUF <= 0x7E)) // Only ASCII From 0x21 To 0x7E Into Receive_Buffer.
    {
      Receive_Buffer[Receive_Buffer_Index] = SBUF;
      Receive_Buffer_Index++;

      if (Receive_Buffer_Index == Receive_Buffer_Size)
      Receive_Get = 1;
    }
  }

  RI = 0; // Clear RI (Receive Interrupt).
}
if (TI == 1)
{
  Transmit_Busy = 0; // Mark Transmit Not Busy.
  TI = 0; // Clear TI (Transmit Interrupt).
}      
}


[ 此文章被jason-poul在2009-05-10 01:00重新編輯 ]

此文章被評分,最近評分記錄
財富:20 (by 三仙) | 理由: 因為您的參與,讓程式設計更容易!!


獻花 x0 回到頂端 [1 樓] From:歐洲 | Posted:2009-05-10 00:46 |
u955067
數位造型
個人文章 個人相簿 個人日記 個人地圖
路人甲
級別: 路人甲 該用戶目前不上站
推文 x0 鮮花 x0
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

感謝jason-poul兄
雖然沒有很懂 但我看得懂部分
我繼續研究 若有不懂 再來請教


獻花 x0 回到頂端 [2 樓] From:臺灣中華電信 | Posted:2009-05-11 08:59 |
u955067
數位造型
個人文章 個人相簿 個人日記 個人地圖
路人甲
級別: 路人甲 該用戶目前不上站
推文 x0 鮮花 x0
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

我GPS的鮑率是4800
我想用組合語言寫
==========我的程式碼如下==========
     org      0
     jmp      Start
Start:      
     mov      sp,#6fh
     mov      tmod,#00100000b
     anl      pcon,#01111111b
     mov      th1,#250      ;鮑率4800
     setb      tr1
     mov      scon,#01010000b      ;設定UART工作再Mode1的接收模式
     clr      ri            ;清除接收完畢旗標
Receive_Wait:
     jbc      ri,Receive_Ok      ;檢查UART是否將8bit的資料接收完畢,若還沒完畢(RI=0)則繼續,完畢(RI=1)則跳至Receive_Ok且清除RI=0
     jmp      Receive_Wait      ;跳至Receive_Wait檢查RI位元
Receive_Ok:
     mov      a,sbuf            ;接收到的資料
     cpl      a
     mov      p0,a            ;LED顯示出來
     jmp      Receive_Wait      ;接收完畢跳至Receive_Wait繼續
     .end
這些是我的想法,還沒測試
我想問怎麼在組合語言上直接做篩選的動作??
我只要開頭$GPGGA的資料,組合語言能做到嗎?


獻花 x0 回到頂端 [3 樓] From:歐洲 | Posted:2009-05-12 01:24 |
㊣小天㊣
數位造型
個人文章 個人相簿 個人日記 個人地圖
路人甲
級別: 路人甲 該用戶目前不上站
推文 x0 鮮花 x2
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

在8051裡有Serial interrupt,就是當程式接收到值或送出值都會產生interrupt。
而Serial port要溝通的話必須要先設定相同的Baud Rate才能互相溝通。
以下是Baud Rate的設定表。
========================
Baud Rate     TH1     SMOD
========================
1200           0xE8     0
2400           0xF4     0
4800           0xFA     0
9600           0xFD     0
19200         0xFD     1
========================

設定的程式如下:(以9600 Baud Rate為例)
void main()
{
  Byte t;
  EA=0;
  SCON=0x50;      
  TMOD=0x21;      
  ES=1;            
  TH1=0xFD;
  SMOD=0;      
  TR1=1;
  EA=1;

  //送出資料,以 t 為送出資料的變數
  SBUF=t;
  while(1)
  {
   
  }            
}

void com_isr(void) interrupt 4 using 1
{
  Byte r;
  //接收資料,以 r 為接收資料的變數
  if (RI)
  {
    r=SBUF;
    RI=0;
    return;
  }
 
  if (TI!=0) TI=0;
}



獻花 x0 回到頂端 [4 樓] From:臺灣中華HiNet | Posted:2009-06-11 14:16 |
y6109971
數位造型
個人文章 個人相簿 個人日記 個人地圖
路人甲
級別: 路人甲 該用戶目前不上站
推文 x0 鮮花 x1
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

那如果我想要從PC裡抓衛星訊號在遊PC 藍芽傳入PDA內的衛星導航要怎麼寫那程式


獻花 x0 回到頂端 [5 樓] From:臺灣中華電信 | Posted:2009-06-13 09:37 |

首頁  發表文章 發表投票 回覆文章
Powered by PHPWind v1.3.6
Copyright © 2003-04 PHPWind
Processed in 0.059342 second(s),query:16 Gzip disabled
本站由 瀛睿律師事務所 擔任常年法律顧問 | 免責聲明 | 本網站已依台灣網站內容分級規定處理 | 連絡我們 | 訪客留言