广告广告
  加入我的最爱 设为首页 风格修改
首页 首尾
 手机版   订阅   地图  繁体 
您是第 19944 个阅读者
 
发表文章 发表投票 回覆文章
  可列印版   加为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.031391 second(s),query:16 Gzip disabled
本站由 瀛睿律师事务所 担任常年法律顾问 | 免责声明 | 本网站已依台湾网站内容分级规定处理 | 连络我们 | 访客留言