PDA

View Full Version : mọi người giúp đỡ với


phamngocthanh87
17-03-2009, 11:35 PM
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:
#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,bi ts=8)
#include <string.h>
int16 MAP[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x9 0};
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 :
#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,bi ts=8)
#include <string.h>
#include <stdlib.h>
int16 MAP[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x9 0};
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.
#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,bi ts=8)
#include <string.h>
int16 MAP[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x9 0};
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
em đã gửi và nhận đúng rồi ! cảm ơn các bác nhiều !