PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > PIC - Thiết kế và Ứng dụng

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Tìm Kiếm Bài Trong Ngày Ðánh Dấu Ðã Ðọc Vi điều khiển

PIC - Thiết kế và Ứng dụng Ý tưởng cho các sản phẩm sử dụng PIC/dsPIC và các sản phẩm của Microchip

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 17-03-2009, 11:35 PM   #1
phamngocthanh87
Đệ tử 2 túi
 
Tham gia ngày: Jan 2009
Bài gửi: 29
:
Question 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);
      }
   }

thay đổi nội dung bởi: namqn, 18-03-2009 lúc 01:16 AM. Lý do: định dạng code
phamngocthanh87 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 18-03-2009, 01:28 AM   #2
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
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,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 19-03-2009, 09:42 AM   #3
phamngocthanh87
Đệ tử 2 túi
 
Tham gia ngày: Jan 2009
Bài gửi: 29
:
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é !

thay đổi nội dung bởi: namqn, 19-03-2009 lúc 03:42 PM. Lý do: định dạng code
phamngocthanh87 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 19-03-2009, 02:01 AM   #4
phamngocthanh87
Đệ tử 2 túi
 
Tham gia ngày: Jan 2009
Bài gửi: 29
:
cảm ơn anh Nam nhiều lắm ! đúng là em chưa đọc mấy cái hàm đó .
phamngocthanh87 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 19-03-2009, 10:52 AM   #5
longtu
Đệ tử 6 túi
 
longtu's Avatar
 
Tham gia ngày: Jul 2007
Bài gửi: 146
:
Send a message via Yahoo to longtu
[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
__________________
--------------------------------------------------------------------------------------
Phùng Minh Tuân
Email: tuan.phmt@gmail.com
"Cuộc đời sóng gió nuôi ta lớn
Bao lần thất bại dạy ta khôn".
longtu vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 21-03-2009, 08:31 AM   #6
phamngocthanh87
Đệ tử 2 túi
 
Tham gia ngày: Jan 2009
Bài gửi: 29
:
Post

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);
        
      
   }

thay đổi nội dung bởi: namqn, 21-03-2009 lúc 03:41 PM. Lý do: định dạng code
phamngocthanh87 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 22-03-2009, 11:34 PM   #7
phamngocthanh87
Đệ tử 2 túi
 
Tham gia ngày: Jan 2009
Bài gửi: 29
:
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 !
phamngocthanh87 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời

Ðiều Chỉnh
Xếp Bài

Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


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


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam