Programmierung der Getränkeausgabe
Kategorien: 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 .]
Hat Dir der Artikel geholfen? - Dann hilf dem Artikel ;-)
|
Ähnliche Artikel
Folgende Artikel aus der gleichen Kategorie könnten Dich ebenfalls interessieren:
Keinen passenden
|
Programmierung eines Kaffeeautomaten In den vergangenen Folgen haben wir uns um die absoluten Grundlagen der Programmiersprache „C“ gekü...
Funktionen in C Ähnliche oder gleiche Befehle, die öfter genutzt werden kann man besser in Funktionen ausgliedern. F...
Geschachtelte for-Schleife Im letzten Artikel hast Du die Schleifen-Programmierung mit „for“ kennengelernt. Die Aufgabe für heu...
Kaffeeautomat-Funktion für die Münzauswertung Nach einem Ausflug in das Reich der Funktionen, geht es nun zurück zur Programmierung des Kaffeeauto...




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
Hi warum funktioniert das nicht?
Kann nicht mal mehr über den P1 Geld einwerfen
void main (void) {
int i,Kafee;
char auswahl;
/*————————————————
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
i=0;
Kafee=30;
while (1) {
switch (auswahl)
{case ‘k’:
if (i=30)
{ printf(“Warten Sie Ihr Kaffe wird eingeschänkt \nIhr Restbetrag beträgt: %d\n”,i=i-30);
break;
}
switch (P1)
{case 1:
printf(“Guthaben: %d cent\n”,++i);
getchar();
break;
case 2:
i=i+2;
printf(“Guthaben: %d cent\n”,i);
getchar();
break;
case 4:
i=i+5;
printf(“Guthaben: %d cent\n”,i);
getchar();
break;
case 8:
i=i+10;
printf(“Guthaben: %d cent\n”,i);
getchar();
break;
case 16:
i=i+20;
printf(“Guthaben: %d cent\n”,i);
getchar();
break;
case 32:
i=i+50;
printf(“Guthaben: %d cent\n”,i);
getchar();
break;
case 64:
i=i+100;
printf(“Guthaben: %d cent\n”,i);
getchar();
break;
case 128:
i=i+200;
printf(“Guthaben: %d cent\n”,i);
getchar();
break;
case 0:
printf(“Guthaben: %d cent\n”,i);
getchar();
break;
case 3:
printf(“Ihr Restguthaben wird Ihnen Ausgegeben: %d cent\n”,i);
i=i-i;
getchar();
break;
default:
printf(“Ihr Geld wird Ausgeworfen”);
break;
}
}
}
}
Also nochmal irgendwie hatd er alles falsch rein kopiert:
/*——————————————————————————
HELLO.C
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 i,Kafee;
char auswahl;
/*————————————————
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
i=0;
Kafee=30;
while (1) {
switch (auswahl)
{case ‘k’:
if (i=30)
{ printf(“Warten Sie Ihr Kaffe wird eingeschänkt \nIhr Restbetrag beträgt: %d\n”,i=i-30);
break;
}
switch (P1)
{case 1:
printf(“Guthaben: %d cent\n”,++i);
getchar();
break;
case 2:
i=i+2;
printf(“Guthaben: %d cent\n”,i);
getchar();
break;
case 4:
i=i+5;
printf(“Guthaben: %d cent\n”,i);
getchar();
break;
case 8:
i=i+10;
printf(“Guthaben: %d cent\n”,i);
getchar();
break;
case 16:
i=i+20;
printf(“Guthaben: %d cent\n”,i);
getchar();
break;
case 32:
i=i+50;
printf(“Guthaben: %d cent\n”,i);
getchar();
break;
case 64:
i=i+100;
printf(“Guthaben: %d cent\n”,i);
getchar();
break;
case 128:
i=i+200;
printf(“Guthaben: %d cent\n”,i);
getchar();
break;
case 0:
printf(“Guthaben: %d cent\n”,i);
getchar();
break;
case 3:
printf(“Ihr Restguthaben wird Ihnen Ausgegeben: %d cent\n”,i);
i=i-i;
getchar();
break;
default:
printf(“Ihr Geld wird Ausgeworfen”);
break;
}
}
}
}
Ich will nerven aber die Website hier stellt es ncith richtig dar -.-
Hier nochmald er letzte versuch:
also nur das mit der Kaffe eingabe, hier bekomme ich statt”Kaffe kostet….” nur
kGuthaben:
switch (c)
{case ‘k’:
if (i<30)
{printf("Kaffe kostet 30cent\n bitte werfen Sie weitere %d ein\n",Kafee-=i);
break;
}
printf("Warten Sie Ihr Kaffe wird eingeschänkt \nIhr Restbetrag beträgt: %d\n",i=i-30);
c=0;
break;
}
So letzte post Tschuldigung nochmal, aber als Hinweis: Es ist so als würde der mein Switch für P1 nie verlassen :/
Er Addiert immer weiter z.B
Guthaben: 1cent
Guthaben: 2cent usw…..
wenn ich jetzt auf k drücke sagt er mir
kGuthaben: 3cent
Wo wird P1 denn wieder auf 0 gesetzt?
Hallo
Super das du noch aktiv bist:)
Warum soll ich den Port1 auf null setzen?
ach ja hier der neue code,
hier funktioniert die Auswahl bestens,
kann aber keinen Betrag über P1 “einwerfen”
alles was passiert ist das der eine Zeile tiefer rutscht
Ich verstehe es einfach nicht,
habe das Programm x-mal umgeschrieben nichts half.
Hoffe du hast eine Lösung parat.
MfG
/*——————————————————————————
HELLO.C
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;
char c;
/*————————————————
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
c = getchar();
Betrag=0;
c=getchar();
while (1) {
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("Sie haben Kaffee gewähltn");
printf("Restbetrag: %d Cent\n", Betrag-=30);
c=0;
break;
case 'e':
if (Betrag<40)
{
printf("Espresso kostet 40 Cent\n");
printf("Restbetrag: %d Centn", Betrag);
printf("Bitte werfen Sie (mindestens) %d Cent einn",40-Betrag);
break;
}
printf("Sie haben Espresso gewähltn");
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("Sie haben Cappuchino gewählt\n");
printf("Restbetrag: %d Cent\n", Betrag-=50);
c=0;
break;
}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("Sie 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("Sie 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("Sie haben Cappuchino gewählt\n");
printf("Restbetrag: %d Cent\n", Betrag-=50);
c=0;
break;
}
}
switch (P1)
{
case 1:
printf("Guthaben: %d cent\n",Betrag+=1);
getchar();
break;
case 2:
printf("Guthaben: %d cent\n",Betrag+=2);
getchar();
break;
case 4:
printf("Guthaben: %d cent\n",Betrag+=5);
getchar();
break;
case 8:
printf("Guthaben: %d cent\n",Betrag+=10);
getchar();
break;
case 16:
printf("Guthaben: %d cent\n",Betrag+=20);
getchar();
break;
case 32:
printf("Guthaben: %d cent\n",Betrag+=50);
getchar();
break;
case 64:
printf("Guthaben: %d cent\n",Betrag+=100);
getchar();
break;
case 128:
printf("Guthaben: %d cent\n",Betrag+=200);
getchar();
break;
}
}
habe den code jetzt mal umgedreht wie bei dir im Video,
klammern dem entsprechend neu sortiert und jetzt klappt es,
ich evrstehe es nicht