Programmierung der Getränkeausgabe
Kategorie: MikrocontrollerHeute soll es nun um die Getränkeausgabe gehen.
Unser Kaffeeautomat bietet 3 Getränke
- Kaffee 30 Ct
- Espresso 40 Ct
- Cappuchino 50 Ct
Die Wahl des Getränks soll über die Buchstaben “k” für Kaffee, “e” für Espresso und “c” für Cappuchino über die Tastatur erfolgen.
Eine möglich Lösung, die ich im heutigen Video zeige, realisiert die Anforderung wieder über eine switch-case Anweisung.
Die Lösung ist noch ziemlich rudimentär und nicht sehr benutzerfreundlich. Prinzipiell funktioniert unser kleines Programm aber schon ganz gut. Wenn Du Lust hast, kannst Du das Programm vielleicht noch an einigen Stellen verbessern.
In der nächsten Folge werden wir eine Frage von Tim aufgreifen. Und zwar benötigen wir eine Möglichkeit, einzelne Bits zu setzen und zu löschen, wenn beispielsweise gleichzeitig eine 10 Ct – und eine 50 Ct- Münze eingeworfen wurde.
Ein wichtiger Hinweis:
Durch die printf()-Ausgabe wird der Programmcode schnell sehr groß. Mein Beispielprogramm kratzt schon knapp an das 2K-Limit.
Hier jusst Du also aufpassen. Wenn Dein Programm größer als 2 kByte werden sollte, wird es nicht auf den kostenfreien Simulator ausgeführt.
Dann solltest Du versuchen, an der einen oder anderen Stelle die printf()-Anweisungen zu kürzen.
Hier noch einmal der C-Code aus dem Video.
c=getchar();
switch (c)
{
case 'k':
if (Betrag<30)
{
printf("Kaffee kostet 30 Cent\n");
printf("Restbetrag: %d Cent\n", Betrag);
printf("Bitte werfen Sie (mindestens) %d Cent ein\n",30-Betrag);
break;
}
printf("\nSie haben Kaffee gewählt\n");
printf("Restbetrag: %d Cent\n", Betrag-=30);
c=0;
break;
case 'e':
if (Betrag<40)
{
printf("Espresso kostet 40 Cent\n");
printf("Restbetrag: %d Cent\n", Betrag);
printf("Bitte werfen Sie (mindestens) %d Cent ein\n",40-Betrag);
break;
}
printf("\nSie haben Espresso gewählt\n");
printf("Restbetrag: %d Cent\n", Betrag-=40);
c=0;
break;
case 'c':
if (Betrag<50)
{
printf("Cappuchino kostet 50 Cent\n");
printf("Restbetrag: %d Cent\n", Betrag);
printf("Bitte werfen Sie (mindestens) %d Cent ein\n",50-Betrag);
break;
}
printf("\nSie haben Cappuchino gewählt\n");
printf("Restbetrag: %d Cent\n", Betrag-=50);
c=0;
break;
}
Dieser Artikel ist Teil des Mikrocontroller-Kurses auf ET-Tutorials.de.
[ >> Hier geht es zurück zur Übersichtsseite des Mikrocontroller-Kurses .]
ET-Tutorials weiterempfehlen
Hat Dir der Artikel gefallen?Dann unterstütze ET-Tutorials.de mit einer Empfehlung per Email an Deine Freunde .
Hinweis zum Datenschutz: Ich kann weder Deine noch die Email-Adresse Deiner Freunde sehen.
Ähnliche Artikel
Folgende Artikel aus der gleichen Kategorie könnten Dich ebenfalls interessieren:» Lösung der Aufgabe und SHIFT Operator
» Download und Installation von uVision4/Keil
» Datentypen und die formatierte Ausgabe mit printf
» Variablenzuweisung - Teil 2
» Einrichten eines Projektes in uVision
Mein Name ist Wolfgang Bengfort. Ich bin Lehrer für Elektrotechnik und Technische Informatik und habe im September 2009 diese Seite gestartet. 


Hallo Wolfgang,
das Programmvideo ist leider in allen Vergrößerungen so unscharf, daß man fast nichts entziffern kann. Irgend etwas scheint da schief gegangen zu sein.
Gruß Willi
Hallo Willi,
danke für den Hinweis. Ich sehe gerade, dass Youtube noch dabei ist das Video zu rendern.
Ich lade das Video noch einmal neu hoch. Ich hoffe, dann klappt’s.
Youtube scheint zur beim encoding Zeit Probleme zu haben.
Ich habe das Video nun bei Viddler hochgeladen. Jetzt sieht’s gut aus.
Jetzt passt’s. Danke.
Hallo,
ich habe zwei Fragen:
1. Warum muss ich jetzt bei der case Anweisung mit Hochkomma arbeiten (case ‘k’) in den anderen Lektionen haben wir nur z.B. (case 6) geschrieben. Hat das etwas mit dem Variablen Typ char zu tun?
2. Warum wird bei mir der Programmcode nach der Whileschleife (while (Preis-Betrag>0) )nicht bearbeitet???
Würde mich über eine Antwort freuen:-)
/*——————————————————————————
Programmierung der Getränkeausgabe
Copyright 1995-2005 Keil Software, Inc.
——————————————————————————*/
#include /* special function register declarations */
/* for the intended 8051 derivative */
#include /* prototype declarations for I/O functions */
#ifdef MONITOR51 /* Debugging with Monitor-51 needs */
char code reserve [3] _at_ 0×23; /* space for serial interrupt if */
#endif /* Stop Exection with Serial Intr. */
/* is enabled */
/*————————————————
The main C function. Program execution starts
here after stack initialization.
————————————————*/
void main (void)
{
int Betrag;
int Preis;
int Restbetrag;
char zeichen;
/*————————————————
Setup the serial port for 1200 baud at 16MHz.
————————————————*/
#ifndef MONITOR51
SCON = 0×50; /* SCON: mode 1, 8-bit UART, enable rcvr */
TMOD |= 0×20; /* TMOD: timer 1, mode 2, 8-bit reload */
TH1 = 221; /* TH1: reload value for 1200 baud @ 16MHz */
TR1 = 1; /* TR1: timer 1 run */
TI = 1; /* TI: set TI to send first char of UART */
#endif
/*————————————————
Note that an embedded program never exits (because
there is no operating system to return to). It
must loop and execute forever.
————————————————*/
while(1)
{
P1=0; // Port P1 wird auf den Wert 0 gesetzt
printf(”Bitte ein Getränk auswählen \n k für Kaffe \n e für Espresso \n c für Cappuchino \n”);
zeichen = getchar(); //Wartet auf eine Eingabe
switch (zeichen)
{
case ‘k’:
printf(”\n Sie haben Kaffee gewählt \n”);
Preis = 30; //Preis für Kaffee 30 Cent
break;
case ‘e’:
printf(”\n Sie haben Espresso gewählt \n”);
Preis = 40; //Preis für Espresso 40 Cent
break;
case ‘c’:
printf(”\n Sie haben Cappuchino gewählt \n”);
Preis = 50; //Preis für Cappuchino 50 Cent
break;
while (Preis-Betrag >0)
{
Restbetrag=Preis-Betrag;
printf(”Bitte werfen Sie %d Cent ein \n”,Restbetrag);
getchar();
switch (P1)
{
case 1:
printf(”Betrag: %d Cent \n”, Betrag+=1);
P1=0;
break;
case 2:
printf(”Betrag: %d Cent \n”, Betrag+=2);
P1=0;
break;
case 4:
printf(”Betrag: %d Cent \n”, Betrag+=5);
P1=0;
break;
case 8:
printf(”Betrag: %d Cent \n”, Betrag+=10);
P1=0;
break;
case 16:
printf(”Betrag: %d Cent \n”, Betrag+=20);
P1=0;
break;
case 32:
printf(”Betrag: %d Cent \n”, Betrag+=50);
P1=0;
break;
case 64:
printf(”Betrag: %d Cent \n”, Betrag+=100);
P1=0;
break;
case 128:
printf(”Betrag: %d Cent \n”, Betrag+=200);
P1=0;
break;
getchar();
}
}
if (Preis-Betrag <=0)
Betrag = 0;
printf("\n Einen schönen Tag");
zeichen=0;
getchar();
}
}
}
Hallo Christian,
“1. Warum muss ich jetzt bei der case Anweisung mit Hochkomma arbeiten (case ‘k’) in den anderen Lektionen haben wir nur z.B. (case 6) geschrieben. Hat das etwas mit dem Variablen Typ char zu tun?
2. Warum wird bei mir der Programmcode nach der Whileschleife (while (Preis-Betrag>0) )nicht bearbeitet??? ”
1.) Ja, das hat mit dem Variablentyp char zu tun.
2.) Es sieht so aus, als wenn Du die switch – Klammer nicht schließen würdest. Nach dem break von case ‘c’ müßte eine } – Klammer stehen, die dann weiter unten entfernt werden müsste.
Tipp: Kommentieren Deine schließenden Klammern, z.B.
} // End while
oder
}// End main
Dann behälst D leichter den Überblick.
Viele Grüße
Wolfgang