AT89C51 te AT89C51 via kabel

M

Maverickmax

Guest
Hallo

Ik probeer een eenvoudige karakter in een ander apparaat overbrengen zoals AT89C51 via draad om het personage te identificeren en schakelaar red_led op voor een korte tijd en het apparaat is uitgeschakeld.

Wat ik - NIETS!

Ik gebruik als een 12MHz oscillator en de baudrate is 9600.Dus enige hulp zou worden appreicated.

Hier is twee codes zoals de zender en ontvangerZenderCode:/ / Header files

# include "main.h"

# include "port.h"

# include "delay_loop.h"/ / Functie Prototypesvoid serial_init ();

void send_serial (unsigned char * s);void serial_init ()

(

SCON = 0x50; / / Setup voor 8-bit data

TMOD = 0x20; / / Setup timer 1 voor auto-reload

TH1 = 0xF9; / / Setup voor 9600 Baud

TR1 = 1; / / Zet timer 1

TI = 1; / / aangeven klaar te zenden

)void send_serial (unsigned char * s)

(

while (* s! = 0x00)

(

SBUF =* s;

while (! TI)

()

TI = 0;s ;

)

)void main (void)

(serial_init ();

BLUE_LED = OFF;

Delay_Loop (100);

BLUE_LED = ON;

Delay_Loop (100);

BLUE_LED = OFF;Delay_Loop (100);

BLUE_LED = ON;

Delay_Loop (50);

send_serial ('5 ');

BLUE_LED = OFF;)

 
Goed idee is om de zender en ontvanger afzonderlijk te testen ..
U kunt Windows Hyperterminal, of bij voorkeur andere zuilen (er zijn er genoeg om uit te kiezen in EDA) die u toestaat om zowel ASCII en HEX, zie om te controleren wat er wordt door de zender, en code te wijzigen, indien nodig, tenzij u overtuigd dat de zender goed werkt ..
Hetzelfde kan worden gedaan met de ontvanger, je kunt toetsen druk van PC-toetsenbord te simuleren nummers, bijvoorbeeld CTRL-A = 01u, CTRL-B = 02h en zo verder ..
In dit stadium zou ik niet gebruiken seriële poort onderbreken bij de ontvanger einde ..proberen om de RI beetje volgen, en vertragen de snelheid waarmee je vraagt de zender uit te zenden bytes ..

Voor 9600bps en 12MHz kristal de re-load waarde moet worden .. FD
http://eserver.bell.ac.uk/mirrors/i8051/part5.htm

Groeten,
IanP

 
Maverickmax wrote:Bedankt IanP.
Ik heb uw suggestie gevolgd.Ik heb gemerkt dat mijn zender code werkt zonder enig probleem.Maar de ontvanger code niet werkte en ik heb geprobeerd om het probleem voor uren lokaliseren.
Gelukkig heb ik gevonden de fout in mijn ontvanger code.

Ik realiseerde me '5 'moet niet worden gebruikt omdatFOUT - Receiver code
Code:ERROR -> if (received_data_G == 5)

(

RED_LED = ON;

Delay_Loop (50);

RED_LED = OFF;

)
 
HyperTerminal is niet ideaal hulpmiddel, het heeft een hoop nadelen te vergelijken met andere terminal pakketten ..
Hyperterminal Voor al uw toetsenbord is ASCII ..En als je wilt versturen hexadecimale tekens, zeg 01h, moet je CTRL A, 02u gebruik = CTRL B ...enz. ..
Dus, probeer zoiets als dit: h ** p: / / www.rfinnovations.com.au / uploads / Images / RFI-Interm% 20Rev1.1 (1). Zip
Het is een zeer mooi en makkelijk te gebruiken .. zuilen
Groeten,
IanP

 
Thank you again IanP

Ik heb eindelijk mijn probleem opgelost.De seriële communicatie tussen twee AT89C51 werk erg goed en ik ben erg blij mee.

Er is een ding dat ik nodig heb om zeker te zijn over ....

Aangezien ik 12MHz en 9600 gebruik baudrate dus TH1 zou worden 0xF9, vond ik dat het fout zou ongeveer 7 procent zijn.

Dus dat de seriële communicatie tussen twee AT89C51s waarschijnlijk krijgen fout betekent.

Zou ik het probleem oplossen als ik 11.059MHz te voeren om geen fout - nul procent te krijgen?

Zo ja, dus dat betekent dat ik moet TH1 = 0xfd passen.Is dat logisch?Maverick Max

 
Als beide microcontrollers gebruiken dezelfde kristallen advertentie TH1 dan de communicatie tussen hen zal gaan zonder fouten ..
Indien echter zou u willen ( "spion") met lezen, zeg PC, seriële poort wordt gestuurd wat de baudsnelheid achterhaald kunnen zijn van de standaard 9600bps ..
In dit geval veranderende kristal te 11,095200 zou een goed idee als dit is de exacte klokfrequentie voor de meeste van de gemeenschappelijke baudsnelheden ..
(FDH) ..
Rgards,
IanP

 

Welcome to EDABoard.com

Sponsor

Back
Top