ĆWICZENIE 5 TEMAT: OBSŁUGA PORTU SZEREGOWEGO W PAKIECIE KEILuVISON WYSYŁANIE PORTEM SZEREGOWYM
Wiadomości wstępne: Port szeregowy może pracować w czterech trybach. Tryby różnią się między sobą liczbą bitów w przesyłanych danych i źródłem sygnałów taktujących odbiornik i nadajnik. Tryby pracy portu szeregowego oraz inne aspekty jego pracy są wybierane przez odpowiednie ustawienie znaczników w rejestrze SCON mieszczącego się pod adresem 98H w przestrzeni SFR. Znaczniki tego rejestru mogą być ustawiane pojedynczo a ich znaczenie jest następujące: SCON adres 98H SM0 SM1 SM2 REN TB8 RB8 TI RI SM0, SM1 wybór pracy trybu Stan logiczny Tryb Rodzaj transmisji Częstotliwość taktująca 0 0 0 Rejestr przesuwny 8 bitów fosc/12 0 1 1 UART (8 bitów) zmienna 1 0 2 UART (9 bitów) fosc/64 lub fosc/32 1 1 3 UART (9 bitów) zmienna SM2 Tryb 0 - SM2 = 0 Tryb 1 - przy SM2 = 1, znacznik przerwania RI nie jest uaktywniany przy braku bajtu stopu w odbieranym słowie. Tryb 2 i 3 - przy SM2 = 1 znacznik przerwania RI nie jest uaktywniany jeżeli 9- ty bit odbieranego słowa jest równy 0. W tych trybach bit ten jest wykorzystywany przy komunikacji wieloprocesorowej. REN znacznik uaktywnienia odbiornika. Obiór dozwolony gdy REN = 1, zablokowany gdy REN = 0. TB8 znacznik używany w transmisji dziewięciobitowej. RB8 znacznik używany w transmisji dziewięciobitowej. TI Znacznik końca transmisji, ustawiany sprzętowo może być zerowany tylko programowo. RI Znacznik końca odbierania, ustawiany sprzętowo, kasowany programowo Do taktowania portu szeregowego należy zastosować licznik T1, prędkość transmisji 9600 bod: //ustawienie portu RS jako nadajnik TL1=0x00; // TH1=0xFD; //ustawienie wartości autodoładowania (dla prędkości 9600 bod) TMOD =0X20; //ustawienie trybu pracy licznika T1 na tryb 2 // włączanie licznika
Jeżeli port szeregowy ma pracować jako nadajnik to rejestr SCON=0x40 Jeżeli port szeregowy ma pracować jako odbiornik to rejestr SCON = 0x50 Wysyłanie portem szeregowym prędkość transmisji 9600 bod, taktowanie licznikiem T1 TMOD = 0x20; void putc_rs(char znak) Odbieranie danej z portu szeregowego: SCON=0x50; TMOD = 0x20; void getc_rs(void) if ( RI = = 1) a=sbuf; RI = 0; return a; else return 0;
1. Otwieramy projekt o nazwie BLINKY z katalogu c:\keil\c51\examples\test\ BLINKY.Uv2 2. Ćwiczenia dotyczące działania portu szeregowego. Zadanie 1. Napisz program który wysyła portem szeregowym stałą 0x41 z prędkością 9600 bod. Kod ASCII A = 0x41. W zadaniu utwórz funkcję inicjującą port szeregowy o raz wysyłającą znak. #include <reg515.h> #include <absacc.h> void delay (void) unsigned int i=100; while(i--); void init_rs (void) //inicjowanie portu szeregowego TMOD =0x20; void putc_rs(char znak) void main (void) init_rs(); while (1) putc_rs(0x41); delay();
Zadanie 2. Napisz modyfikację do programu z zadania 1 aby wysyłać portem szeregowym wyraz DOM, po wyrazie DOM należy umieścić znak pusty. DOM DOM DOM Zadanie 3. Przeanalizuj funkcję wysyłania portem szeregowym ciągu znaków a następnie użyj ją w programie do wysyłania Pracownia mikroprocesorowa. Sprawdź co się zmienia po dołożeniu na końcu tekstu \n void puts_rs (char *s) while(*s) putc_rs(*s); s++; Wywołanie funkcji w programie głównym:... puts_rs("pracownia mikroprocesorów.");... do drugiej części zadania puts_rs("pracownia mikroprocesorów.\n"); Zadanie 4. Napisz program który wysyła na naciśnięty klawisz P5^0 literę A, portem szeregowym z prędkością 9600 bod. #include <reg515.h> #include <absacc.h> sbit P5_0=P5^0; void delay (void) unsigned int i=100; while(i--); void init_rs (void) TMOD =0x20;
void putc_rs(char znak) void main (void) unsigned char kl,kl_p=1; init_rs(); while (1) kl=p5_0; if(kl= =0 && kl_p= =1) putc_rs('a'); putc_rs( \n ); kl_p=kl; Zadanie 5. Napisz modyfikację do programu z zadania 4 aby na naciśnięty klawisz P5^0 wysyłany był znak A, natomiast na naciśnięty klawisz P5^1 znak B. Przykładowe wysłanie znaku B na naciśnięty klawisz: sbit P5_1=P5^1; kl2=p5_1; if(kl2==0&& kl2_p==1) putc_rs('b'); kl2_p=kl2;
... Zadanie 6. Napisz program który wysyła znak \n na naciśnięty klawisz P5^7. Zaobserwuj w symulatorze co powoduje wysłanie znaku \n. Zadanie 7. Napisz program który na wciśnięty klawisz P5^0 wysyła portem szeregowym napis ALARM 1, natomiast na naciśnięty klawisz P5^1 napisz ALARM 2. Program powinien działać w ten sposób aby każde wyświetlenie napisu zaczynało się od początku linii. Zadanie 8. Utwórz bibliotekę system.h do obsługi portu szeregowego. #include<reg515.h> void init_rs (void) //inicjowanie portu szeregowego TMOD =0x20; void putc_rs(char znak) //wysłanie znaku portem szeregowym void puts_rs (char *s)//wysłanie łańcucha portem szeregowym while(*s) putc_rs(*s); s++; void getc_rs(void) // odbieranie znaku portem szeregowym if ( RI = = 1) a=sbuf; RI = 0; return a; else return 0;