Hvordan sender man en række data fra PC til 89C51 via RS232?

E

elchula

Guest
Hjælp mig.Jeg vil sende en række data til 89C51 fra PC via RS232, derefter eksportere disse data til P1 ... Jeg er en nybegynder, så jeg ved ikke, hvordan man gør !!!!!!.

 
DirectX to technologia, bez której nie mogą obejść się współczesne gry oraz większość aplikacji do obróbki multimediów. Intel zaprezentował właśnie, jak sprawuje się w praktyce wersja z numerem 12.

Read more...
 
Vejret du sender en vifte af numeriske data eller fletninger ..er altid den samme.
På dette niveau, du har at gøre med en seriel kommunikations-kanal, der sender kun bytes .. Så du er nødt til at gennemføre en protokol, kan det være meget simpelt som en overskrift, der beskriver først, hvad du vil sende, og hvor mange bytes du vil der venter.Hvis der er et problem, og de data, der ikke er i overensstemmelse med overskriften .. derefter på din tur, kan du sende en besked mundheld sende igen. Eller overfoersel ok .. er op til dig hvordan man organiserer det ..
en Overskrift kan være en byte eller flere afhængigt af, hvor mange bytes du SPECT at sende. i denne header du kan også specificere, hvordan data kan inddrives
som tegn,, INTS længes, etc.
koden i en header er op til dig, for ex 77 = char, kan 33 være osv.

 
Protokol, åh, jeg ved ikke, hvordan man skaber det, kan du hjælpe mig?.

 
elchula skrev:

Protokol, åh, jeg ved ikke, hvordan man skaber det, kan du hjælpe mig?.
 
Du kan forklare klart for mig, har jeg endnu ikke gøre dette.

Du har linket til "de 8.051 og indlejrede system"?Send det til mig.Thanx

 
Hi elchula,
Venligst visite denne lionk, tror jeg det godt
http://chaokhun.kmitl.ac.th/ ~ kswichitSiswanto

 
Hic, kan jeg ikke finde de oplysninger, jeg vil gerne vide!

 
Hej der er mange måde at orgenize det ..
For eksempel kan du bruge alle charactor at definere som en start charactor strøm og derefter programmet til at tælle størrelsen af byte til at modtage og sætte de enkelte data til array eller havn ..Du kan også bruge seriel afbryder for bedre modtagelse af data stream

 
elchula skrev:

Du kan forklare klart for mig, har jeg endnu ikke gøre dette.Du har linket til "de 8.051 og indlejrede system"?
Send det til mig.
Thanx
 
Citat:

Hjælp mig.
Jeg vil sende en række data til 89C51 fra PC via RS232, derefter eksportere disse data til P1
 
Hic, jeg skriver dette program ved C-sprog, og min kode er fulgt:

---------------------------------------
# include <AT89S53.h>
unsigned char chr, h;
unsigned char s [8];
void delay (unsigned char k);
void delay1 ();
char getchr (void);
void sendchr (char CHR);
unsigned int array (unsigned char CHR);

void main ()
(
SCON = 0x50;
TMOD = 0x20;
Th1 = 0xFD; / / 9600 Baud
TR1 = 1;
TI = 1;
P1 = 0xff;
while (1)
(
for (h = 15 h> = 0; h -)
(
chr = getchr ();
array (CHR); / / modtage en vifte fra COM-port
P0 = P2 = chr; / / send til lysdioder.
P1 = h; / / skift.
delay1 ();
)
)
)

char getchr (void)
(
char chr;
(
chr = SBUF;
DI = 0;
return (CHR);
) while (DI! = 1);
)

void sendchr (char CHR)
(
if (chr == '\ r') chr = '\ n';
(
TI = 0;
SBUF = chr;
return;
) while (TI! = 1);
)

void delay1 ()
(
unsigned int i;
for (i = 0; i <40000; i );
)

void delay (unsigned int k)
(
unsigned int i;
for (i = 0; i <= k; i );
)

unsigned int array (unsigned char CHR)
(
unsigned char s [8];
unsigned char i;
i = 0;
while (buffull! = 0)
(
for (i = 0; chr! = 0xa; i )
(
chr = getchr ();
s = chr;
)
s [i - 1] = 0;
return;
)
)Men, når jeg sender en karakter, det gør godt, og så vil jeg sende en 8 tegn - array, det er forkert.Kan du forklare, og finde min fejl.Thanx!

 
Sikke en terible rod!At det er hans lektier?

while (TI! = 1), og mens (RI! = 1); placeret efter hjemkomsten erklæring.
ukendt identifikator buffull.sandsynligvis buffer fuld for at modtage.
manglende tilbagevenden til udtryk i funktion array (det var ikke anmeldt som vender tilbage ugyldig, men unsigned int)
en unsigned char s [8] erklæret inde funktion array overensstemmelse med anvendelsesområdet funktion regler, det er skjult for omverdenen.
Han forventer at bruge array s som global variabel (angivet øverst program) til at sende 8 tegn modtaget fra PC til havn P0 og P2.
Han ender ved ingen hjælp på alle s vifte, og han spørger hvor 8 tegn sendt er gået, og hvorfor ikke figurerer på P0 når P0 = P2 = chr;.
En sendchr funktion aldrig brugt.
P1 = h; / / skift hvilken slags skifteholdsarbejde er ved at sende numre fra 15 downto 0 på lav nippe af P1?
i = 0; lige før mens (buffull! = 0), hvorfor siden er initialiseret ved start løkke for (det er ikke en stor fejl, men hvordan kan du fortælle ham om disse små harmløse ting)

Han forsøgte at kompilere programmet, før du sender her?
Fordi han nemt kunne finde ud af, hvad der ikke fungerer.

Nogle gange kan jeg ikke hjælpe mig og spørger, hvordan kan virkelig hjælpe en nybegynder.
At udføre sit arbejde?

Kig på koden sendt af suromenggolo.
Han forsøgte så venlig at hjælpe elchula.
Han vidste ikke, at elchula hader assembler, men elsker mere C, som ikke forstod alt for mange ting indtil nu.

 
kan være problemet ved forsinkelse procedure.Hvis du sender 8 karakter, er det modtager første tegn hurtigt til array og P0, P2.
efter indtaste forsinkelse, modtager andet tegn stadig vente forsinkelse, før der gemmes til array, så 3rd, 4th ....kan stiill udføre forsinkelse procedure

Jeg tror, du skal bruge seriel afbryde for dette er, eller om forsinkelse procedure sted DI check kode, hvis en data har modtager.

 
suromenggolo skrev:

kan være problemet ved forsinkelse procedure.
Hvis du sender 8 karakter, er det modtager første tegn hurtigt til array og P0, P2.

efter indtaste forsinkelse, modtager andet tegn stadig vente forsinkelse, før der gemmes til array, så 3rd, 4th ....
kan stiill udføre forsinkelse procedureJeg tror, du skal bruge seriel afbryde for dette er, eller om forsinkelse procedure sted DI check kode, hvis en data har modtager.
 
elchula skrev:

Hjælp mig.
Jeg vil sende en række data til 89C51 fra PC via RS232, derefter eksportere disse data til P1 ... Jeg er en nybegynder, så jeg ved ikke, hvordan man gør !!!!!!.
 
Er du behøver kun at sende en værdi til Port af 8.051 via Hyper terminal?.
I øjeblikket skriver jeg C-8051 i Keil kun, ikke noget problem med dig?.

bsiswoyo

 
Hej,
Jeg skriver et lille program ved hjælp af C51 Keil uVision og Bascom-51.
Dette program vil sætte P0, P1, P2, P3 ved at skrive streng fra serie-eller fjern program som Visual Basic.

8051-MCU fra RX-pin vil læse linje streng med følgende format:
PX = nnn [CR] -> X er portnummer 0 .. 3 og nnn er 0 .. 255 (decimal format)

eksempler:

P0 = 15
alle P0 (lav nyble) bliver sat til høj

P1 = 255
alle P1 (byte) bliver sat til høj

For at teste dette program, skal du bruge hyper terminal med 9600, N, 8,1 indstilling.

Kommandoen format, der ikke er fastsat Port som simultan men der er én efter én.
Til simultan kan bruge [Pnnn, nnn, nnn, nnn] kommando.

Følgende liste er skrevet i C51 ved hjælp Keil uVision:

/************************************************* *****************************/
/ * HOWTO SET PORT 8.051 FROM HYPER TERMINAL (Remote Program) * /
/ * Skrevet af Bambang SISWOYO (http://www.bsiswoyo.com) * /
/ * * /
/ * Brug C51 Keil software * /
/ * Dedikeret til EDABOARD.COM TIL TUTORIAL * /
/ * * /
/ * PROTOKOL: * /
/ * 1.8.051 RX vente string PX = nnn [CR] -> X: 0 .. 3, nnn: 0 .. 255 * /
/ * 2.Den anden char er portnummer at tildele en værdi nnn * /
/ * 3.Strengen er kontrolleret og streng værdi konvertere til byte og tildele til port * /
/ * 4.Send 'OK', hvis Okey, en fejl, hvis nogen fejl * /
/************************************************* *****************************/

/************************************************* *****************************/
/ * Funktionen: getchar (), putchar, kan print_string erstattes af: * /
/ * Getchar (..), putchar (..) og printf (..) i stdio.h biblioteket * /
/ * * /
/ * For tutorial, brugen Der separat funktioner i stedet bruge stdio bibliotek.* /
/************************************************* *****************************/
/ * ALT CODE = 731 * /

static char kode ok_msg [] = "OK";
static char kode error_msg [] = "FEJL COMMAND";
static char kode error_port [] = "FEJL: portnummer";
static char kode error_assign [] = "FEJL: Tildel";
static char kode error_value_enter [] = "FEJL: Værdi ikke";
static char kode error_value_number [] = "FEJL: vaerdi ikke er inden for rækkevidde";
static char kode cmd_msg [] = "Indtast Kommando:";

char lineinput [20];
char port;

# include <reg51.h>
# include "stdlib.h"

initSerial ()
(/ * Init seriel til 1200 baud ved hjælp 11.0592MHz krystal * /
SCON = 0x50; / * SCON: mode 1, 8-bit UART, så RCVR * /
TMOD | = 0x20; / * TMOD: timer 1, mode 2, 8-bit reload * /
Th1 = 0xFD; / * Th1: reload værdi for 9600 baud * /
TR1 = 1; / * TR1: timer 1 run * /
TI = 1; / * TI: sæt TI til at sende første tegn i UART * /
)

/************************************************* *****************************/
/ * Fungerer som getchar (..) * /
/************************************************* *****************************/
char getchar ()
/ * Funktion vente char fra rx pin * /
(
while (! DI);
DI = 0;
return SBUF;
)

/************************************************* *****************************/
/ * Fungerer som putchar (..) * /
/************************************************* *****************************/
void putchar (char ch)
(
while (! TI);
TI = 0;
SBUF = ch;
)

/************************************************* *****************************/
/ * Send nyt LINE tegn * /
/************************************************* *****************************/
void put_newline ()
(
putchar (0x0D);
putchar (0x0A);
)

/************************************************* *****************************/
/ * Fungerer som printf (...) * /
/************************************************* *****************************/
void print_string (char * ptr)
(Char ch;
while ((ch = * ptr )! = 0)
(Putchar (ch);)
put_newline ();
)

/************************************************* *****************************/
/ * Vent LINE STRING ENTER * /
/************************************************* *****************************/
void getlineinput ()
/ * Get en linje streng * /
/ * Vente streng fra rx indtil den slutter ved CR og linjeskift char * /
(
unsigned char cnt; / * counter tegn * /
char ch; / * buffer char * /
cnt = ch = 0;
while (cnt <19 & & ch! = 0x0D) / * read line input * /
(Ch = getchar ();
if (ch! = 0x0D) / * hvis CR tilbage sat til null * /
(
lineinput [cnt ] = ch;
putchar (ch); / * sende tilbage (ECHO) til terminal * /
)
)
lineinput [cnt] = 0;
put_newline ();
)

/************************************************* *****************************/
/ * Evaluere LINE STRING * /
/ * Og tildele VÆRDIEN portnummeret 8051-MCU * /
/************************************************* *****************************/
void action_port ()
(Unsigned char værdi;
int value_int;
char * ptr = &lineinput;
/ * Evaluere streng og sende fejl, hvis der er nogen * /
/ * Kontrollere 'P' tegn * /
if (* ptr ! = 'P')
(Print_string (& error_msg); return;)
/ * Check port * /
if ((port = * ptr ) <'0 '| | port> '3')
(Print_string (& error_port); return;)
/ * Check tildele * /
if (* ptr ! = '=')
(Print_string (& error_assign); return;)
/ * Check værdi findes * /
if (* ptr == 0)
(Print_string (& error_value_enter); return;)

/ / Konvertere til byte fra string input
value_int = atoi (pp);
if (value_int <0 | | value_int> 255)
(Print_string (& error_value_number); return;)
/ * Konvertere til byte * /
værdi = value_int;
/ / Tildeler værdi til portnummer
if (port == '0 ') P0 = værdi;
if (port == '1 ') P1 = værdi;
if (port == '2 ') P2 = værdi;
if (port == '3 ') P3 = værdi;
/ / Print ok
print_string (& ok_msg);
)

void main ()
(
initSerial ();

while (1)
(Put_newline ();
/ * Sender kommandostreng * /
/ * Hvis brug med Visual Basic (Remote Program), bedes fjernet * /
print_string (& cmd_msg);
/ * Read line streng fra serie * /
getlineinput ();
/ * Indsats for port * /
action_port ();
)
)

Følgende liste er skrevet i Bascom-51:

'/************************************************ ******************************/
'/ * HOWTO SET PORT 8.051 FROM HYPER TERMINAL (Remote Program) * /
'/ * Skrevet af Bambang SISWOYO (http://www.bsiswoyo.com) * /
'/ * * /
'/ * Brug BASCOM51 * /
'/ * Dedikeret til EDABOARD.COM TIL TUTORIAL * /
'/ * * /
'/ * PROTOKOL: * /
'/ * 1.8.051 RX vente string PX = nnn [CR] -> X: 0 .. 3, nnn: 0 .. 255 * /
'/ * 2.Den anden char er portnummer at tildele en værdi nnn * /
'/ * 3.Strengen er kontrolleret og streng værdi konvertere til byte og tildele til port * /
'/ * 4.Send 'OK', hvis Okey, en fejl, hvis nogen fejl * /
'/************************************************ ******************************/
'/ * ALT CODE = 991 * /

$ krystal = 11059200
$ baud = 9600
$ regfile = "reg51.dat"

Dim Lineinput As String * 20
Dim Port Som Byte
Dim Ch As String * 1
Dim Value Som Byte

'********************* MAIN PROGRAM ************************** ******************
Run:
'/ * Hvis brug med Visual Basic (Remote Program), bedes fjernet * /
Print "Enter Command:"
'/ * Læse linje streng fra serie * /
Input Lineinput
'/ * Indsats for port * /
Gosub Action_port
Print
Goto Run

'/************************************************ ******************************/
'/ * Evaluere LINE STRING * /
'/ * Og tildele VÆRDIEN portnummeret 8051-MCU * /
'/************************************************ ******************************/
Action_port:
'/ * Evaluere String Og Send fejl, hvis der er nogen * /
'/ * Tjekke' P 'tegn * /
Ch = Venstre (lineinput, 1)
Hvis Ch <> "P" Så
Print "ERROR COMMAND"
Retur
End If
'/ * Check port * /
Ch = Mid (lineinput, 2, 1)
Port = Val (ch)
Hvis Ch < "0" eller CH> "3" Så
Print "FEJL: portnummer"
Retur
End If
'/ * Check tildele * /
Ch = Mid (lineinput, 3, 1)
Hvis Ch <> "=" Så
Print "FEJL: Tildel"
Retur
End If

'/ * Check værdi findes * /
If Len (lineinput) = 3 Så
Print "FEJL: Værdi ikke"
Retur
End If

'/ / Konvertere til byte fra string input
Value = Val (Mid (lineinput, 4))
'/ / Tildeler værdi til portnummer
Vælg sag Port
Case 0: P0 = Værdi
Case 1: P1 = Værdi
Case 2: P2 = Værdi
Case 3: P3 = Værdi
End Select
Print "OK"
Retur
Beklager, men du skal logge ind for at se denne vedhæftede fil

 
elchula skrev:

Hjælp mig.
Jeg vil sende en række data til 89C51 fra PC via RS232, derefter eksportere disse data til P1 ... Jeg er en nybegynder, så jeg ved ikke, hvordan man gør !!!!!!.
 
bsiswoyo skrev:

Hej,

/ * PROTOKOL: * /

/ * 1.
8.051 RX vente string PX = nnn [CR] -> X: 0 .. 3, nnn: 0 .. 255 * /

/ * 2.
Den anden char er portnummer at tildele en værdi nnn * /

/ * 3.
Strengen er kontrolleret og streng værdi konvertere til byte og tildele til port * /

/ * 4.
Send 'OK', hvis Okey, en fejl, hvis nogen fejl * /

/************************************************* *****************************/

 

Welcome to EDABoard.com

Sponsor

Back
Top