引用 | 編輯
u955067
2009-05-08 19:00 |
樓主
▼ |
||
x0
各位大大好!!小弟想要用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 .. 訪客只能看到部份內容,免費 加入會員 x0
|
引用 | 編輯
jason-poul
2009-05-10 00:46 |
1樓
▲ ▼ |
在這部分,
不管是使用 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). } } x0 |
引用 | 編輯
u955067
2009-05-12 01:24 |
3樓
▲ ▼ |
我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 |
引用 | 編輯
㊣小天㊣
2009-06-11 14:16 |
4樓
▲ ▼ |
在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 |