PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   PIC - Thiết kế và Ứng dụng (http://www.picvietnam.com/forum/forumdisplay.php?f=23)
-   -   mọi người giúp đỡ với (http://www.picvietnam.com/forum/showthread.php?t=3715)

phamngocthanh87 17-03-2009 11:35 PM

mọi người giúp đỡ với
 
em đang thực hiện một bài thực hành , thày giáo cho về . đề bài như sau : gửi một số thực từ trên máy tính tới vi điều khiển (ở đây là pic16f877a ) qua r232 bằng visual basic 6.0, hiển thị lên 2led 7 thanh(hiển thị số có hai chữ số) . nhưng theo em được biết thì vb chỉ gửi được kí tự . Mà mình muốn gửi một số chẳng hạn như số 89 xuống vi điều khiển thì vi điều khiển nhận được là xâu kí tự "89" tức là mã ascii của 8 và 9 . do đó mình phải có hàm chuyển đổi thành số 89 . em viết một chương trình nhưng nó không hiện đúng .mong các đại ca chỉ giúp !cảm ơn nhiều ! đây là chương trình do em viết trên ccs:
Code:

#include  <16f877a.h>
#include <def_877a.h>
#fuses  HS,NOLVP,NOWDT,PUT
#use delay (clock=4000000)  // defind crystal = 4MHz
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#include <string.h>
int16  MAP[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
int16 t[2]={0x01,0x02};
void hien(int16 x)
  {
  int8 i;
  int8 a[2]={0};
  a[0]=x%10;
  a[1]=x/10;
  for(i=0;i<2;i++)
      {
      porta=t[i];
      portd=MAP[(a[i])];
      delay_ms(2);
      }
  }
int16 tach(char *str)
  {
  int16 i,l,s;
  l=strlen(str);
  s=str[0]- 48;
  for(i=1;i<l;i++)
      {
      s=s*10+(str[i]- 48);
      }
  return s;
  }
void main()
  {
  char *k;
  int16  y;
  trisd=0x00;
  trisa=0x00;
  porta=0x00;
  portd=0x00;
  while(true)
      {
      if(kbhit())
        {
        k=getc();
        putc(k);
        y=tach(k);
        }
        hien(y);
      }
  }


namqn 18-03-2009 01:28 AM

Bạn không cần phải tự xây dựng hàm chuyển chuỗi ASCII thành số đâu, các hàm atoi(), atol(), và atof() trong thư viện của CCS C có thể thực hiện công việc đó. Hãy đọc tài liệu hướng dẫn của trình biên dịch trước khi viết code, để xem có cần phải "sáng chế lại cái bánh xe" hay không.

Thân,

phamngocthanh87 19-03-2009 02:01 AM

cảm ơn anh Nam nhiều lắm ! đúng là em chưa đọc mấy cái hàm đó .

phamngocthanh87 19-03-2009 09:42 AM

anh ơi ! em đã thử mấy cái hàm đó và thấy nó hiện đúng ! khi chưa gửi kí tự từ trên visual . ví dụ em khai báo :
char str[]="12";
int16 y;
y=atol(str);
hien(y);
thì nó hiện đúng .
Nhưng khi em gửi từ trên máy tính xuống thì nó lại hiện sai . chương trình của em như sau :
Code:

#include  <16f877a.h>
#include <def_877a.h>
#include <ctype.h>
#fuses  HS,NOLVP,NOWDT,PUT
#use delay (clock=4000000)  // defind crystal = 4MHz
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#include <string.h>
#include <stdlib.h>
int16  MAP[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
int16 t[2]={0x01,0x02};
void hien(int16 x)
  {
  int8 i;
  int8 a[2]={0};
  a[0]=x%10;
  a[1]=x/10;
  for(i=0;i<2;i++)
      {
      porta=t[i];
      portd=MAP[(a[i])];
      delay_ms(2);
      }
  }
void main()
  {
  char k[]="12";
  int16  y;
  trisd=0x00;
  trisa=0x00;
  porta=0x00;
  portd=0x00;
  while(true)
      {
      if(kbhit())
        {
        gets(k);
        puts(k);
        y=atol(k);
        }
        hien(y);
      }
  }

Anh xem hộ em gửi như vậy thì có vấn đề gì không ? cảm ơn anh trước nhé !

longtu 19-03-2009 10:52 AM

[QUOTE=phamngocthanh87;23658]em đang thực hiện một bài thực hành , thày giáo cho về . đề bài như sau : gửi một số thực từ trên máy tính tới vi điều khiển (ở đây là pic16f877a ) qua r232 bằng visual basic 6.0, hiển thị lên 2led 7 thanh(hiển thị số có hai chữ số) . nhưng theo em được biết thì vb chỉ gửi được kí tự . Mà mình muốn gửi một số chẳng hạn như số 89 xuống vi điều khiển thì vi điều khiển nhận được là xâu kí tự "89" tức là mã ascii của 8 và 9 . do đó mình phải có hàm chuyển đổi thành số 89 . em viết một chương trình nhưng nó không hiện đúng .mong các đại ca chỉ giúp !cảm ơn nhiều ! đây là chương trình do em viết trên ccs:

Trong Css co hàm Atoi(chuyển đổi chuổi Ascii thành số interger), bạn coi hàm này se giải quyết được vấn đề của bạn.

Thân

phamngocthanh87 21-03-2009 08:31 AM

mấy bác cho em hỏi cách gửi nhận chuỗi kí tự từ máy tính xuống vdk như thế này có đc không ? mà em thấy khi em gửi chuỗi số xuống nó hiển thị lên led không đúng . với cả khi em gửi lại kí tự lên visual lúc đc lúc không ?mong các bác chỉ giúp.
Code:

#include  <16f877a.h>
#include <def_877a.h>
#fuses  HS,NOLVP,NOWDT,PUT
#use delay (clock=4000000)  // defind crystal = 4MHz
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#include <string.h>
int16  MAP[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
int16 t[2]={0x01,0x02};
void hien(int16 x)
  {
  int8 i;
  int8 a[2]={0};
  a[0]=x%10;
  a[1]=x/10;
  for(i=0;i<2;i++)
      {
      porta=t[i];
      portd=MAP[(a[i])];
      delay_ms(2);
      }
  }
void main()
  {
  char *k;
  int16  y;
  trisd=0x00;
  trisa=0x00;
  porta=0x00;
  portd=0x00;
  while(true)
      {
      if(kbhit())
        {
        gets(k);
        puts(k);
        }
        y=atol(k);
        hien(y);
       
     
  }


phamngocthanh87 22-03-2009 11:34 PM

cảm ơn các bác đã giúp đỡ
 
em đã gửi và nhận đúng rồi ! cảm ơn các bác nhiều !


Múi giờ GMT. Hiện tại là 05:46 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam