C51 COMPILER V9.60.7.0 SERIO 05/22/2024 11:53:01 PAGE 1 C51 COMPILER V9.60.7.0, COMPILATION OF MODULE SERIO OBJECT MODULE PLACED IN .\Objects\serIO.obj COMPILER INVOKED BY: C:\Keil_v5\C51\BIN\C51.EXE serIO.c OPTIMIZE(8,SPEED) BROWSE DEBUG OBJECTEXTEND PRINT(.\Listings\ser -IO.lst) TABS(2) OBJECT(.\Objects\serIO.obj) line level source 1 /* 2 * serIO.c: 3 * Eingabe und Ausgabe ueber die serielle Schnittstelle. 4 * 5 * Jan Bredereke, 2019, 2024 6 */ 7 8 /* Die eigene Header-Datei: */ 9 #include "serIO.h" 10 11 /* Die Definitionen von Special-Funktion-Registern fuer den 12 * Mikrocontroller C515C: */ 13 #include 14 15 16 /* Die oeffentlichen Methoden: */ 17 /* --------------------------- */ 18 19 /* Holt ein einzelnes Zeichen von der seriellen Schnittstelle, ohne 20 * darauf zu warten. */ 21 /* Falls kein Zeichen da ist, wird Null zurueckgegeben. */ 22 char serIn(void) { 23 1 /* Pruefe, ob ein Zeichen gelesen worden ist. 24 1 * (Dann wird das Receiver-Interrupt-Flag gesetzt.) */ 25 1 if (RI) { 26 2 /* Loesche das Receiver-Interrupt-Flag wieder. */ 27 2 RI = 0; 28 2 /* Hole das Zeichen und gib es zurueck. */ 29 2 return SBUF; 30 2 } else { 31 2 /* Sonst gib Null zurueck. */ 32 2 return '\0'; 33 2 } 34 1 } 35 36 /* Holt ein einzelnes Zeichen von der seriellen Schnittstelle und 37 * wartet ggf., bis eines da ist. */ 38 char serWaitIn(void) { 39 1 /* Warte, bis ein Zeichen empfangen wurde. (Dann wird das 40 1 * Receiver-Interrupt-Flag gesetzt.) */ 41 1 while (!RI); 42 1 /* Loesche das Receiver-Interrupt-Flag wieder. */ 43 1 RI = 0; 44 1 /* Hole das empfangene Zeichen und gib es zurueck. */ 45 1 return SBUF; 46 1 } 47 48 /* Gibt ein Zeichen ueber die serielle Schnittstelle aus. */ 49 /* Wartet nur, falls zur Zeit eine fruehrere solche Ausgabeoperation 50 * noch nicht abgeschlossen ist. */ 51 void serCharOut(char zeichen) { 52 1 /* Warte ggf., bis das vorige Zeichen fertig ausgegeben ist. 53 1 * (Dann wird das Transmitter-Interrupt-Flag gesetzt.) */ 54 1 while (!TI); C51 COMPILER V9.60.7.0 SERIO 05/22/2024 11:53:01 PAGE 2 55 1 /* Loesche das Transmitter-Interrupt-Flag wieder. */ 56 1 TI = 0; 57 1 /* Lege das Zeichen in Sendepuffer und beginne die Uebertragung, ohne 58 1 * auf deren Ende zu Warten. */ 59 1 SBUF = zeichen; 60 1 } 61 62 /* Gibt einen String ueber die serielle Schnittstelle aus. */ 63 void serStringOut(char *string) { 64 1 char z; /* Das naechste zu druckende Zeichen */ 65 1 66 1 while (z = *string++) { 67 2 serCharOut(z); 68 2 } 69 1 } 70 71 /* Initialisiert die Eingabe+Ausgabe ueber die serielle Schnittstelle. */ 72 void serInit(void) { 73 1 /* Initialisiert die serielle Schnittstelle des C515C 74 1 * auf 9600 Baud, 1 Stoppbit, kein Paritybit. 75 1 * Ein Aufruf ist bei der echten Mikrocontrollerkarte im Labor 76 1 * nicht noetig (aber auch nicht schaedlich), da fuer das Laden des 77 1 * Programms schon eine Initialisierung durch uVision erfolgt. 78 1 * Siehe auch das C515C-User-Manual, Seite 6-48ff. 79 1 */ 80 1 81 1 /* Laedt Baud-Rate-Zaehler, oberer Teil 82 1 * (Formel im User-Manual auf S. 6-54). 83 1 */ 84 1 SRELH = 0x03; 85 1 /* Laedt Baud-Rate-Zaehler, unterer Teil, und setze Zaehler zurueck. */ 86 1 SRELL = 0xbf; 87 1 /* Setzt SMOD-Bit im Register PCON (verdoppelt Baud-Rate). */ 88 1 PCON |= 0x80; 89 1 /* Setzt BD-Bit im Register ADCON0 (Baud rate generator enable). */ 90 1 BD = 1; 91 1 /* Setzt Bits im Register SCON (von links nach rechts): 92 1 * SM0=0, SM1=1, SM2=0: 93 1 * serial mode 1, also 8-Bit-UART 94 1 * mit variabler Baud-Rate, 95 1 * einem Stoppbit und keinem 96 1 * Paritybit. 97 1 * REN=1: Receiver enable. 98 1 * TB8=0: unbenutzt (9. Sendebit). 99 1 * RB8=0: unbenutzt (9. Empfangsbit). 100 1 * TI=1: Transmitter-Interrupt-Flag. 101 1 * RI=0: Receiver-Interrupt-Flag. 102 1 */ 103 1 SCON = 0x52; 104 1 } MODULE INFORMATION: STATIC OVERLAYABLE CODE SIZE = 75 ---- CONSTANT SIZE = ---- ---- XDATA SIZE = ---- ---- PDATA SIZE = ---- ---- DATA SIZE = ---- 3 IDATA SIZE = ---- ---- BIT SIZE = ---- ---- END OF MODULE INFORMATION. C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)