003
29.04.2005, 19:35 Uhr
duedel
|
So hier habe ich den gesamten Quellcode angehängt. Er ist für den Microcontroller Atmel AT89S8252. Die Ausgabe erfolgt über ein LCD-Display. Die Anzeige wird zwar jede Sekunde aktualisiert, aber es werden nicht die Schritte 1..2..3 angezeigt, sondern z.B 3..6..9..11. Sehr unregelmäßig jedenfalls.
Code: |
/* Stoppuhr_Main.c ********************************************************************* * * zum Projekt gehört die Datei lcd_Help.c ******************************************************************/ #include <reg51.H>
#include <stdio.h> // für sprintf
extern void initlcd (void); // Initialisierung LCD-Display an P0 extern void loeschenlcd (void); extern void textlcd (unsigned char *text,unsigned char zeile);
unsigned char buf [14] ;
/* P3 */ sbit P3_0 = 0xB0; // zurücksetzen sbit P3_1 = 0xB1; // anhalten sbit P3_2 = 0xB2; // start / weiter (externer Interrupt 0) sbit P3_3 = 0xB5; // Zwischenzeit nehmen (externer Interrupt 1) sbit P3_7 = 0xB7; // Hilfe
int sek; // Variable für Sekunden int min; // Variable für Minuten int std; // Variable für Stunden
void extInt0 (void); // Interrupt-Service-Routine extInt0 deklarieren s.u. void extInt1 (void); // Interrupt-Service-Routine extInt1 deklarieren s.u.
/*********** Methode zur Ausgabe der Zeit ***************/
void ausgabe (int zeile) { sprintf (buf,"%02d:%02d:%02d",std,min,sek); // schreibt die komplette Zeitanzeige in den Buffer // 2: für jede Variable werden 2 Anzeigestellen reserviert textlcd (buf,zeile); // Ausgabe des Bufferinhaltes }
void main (void) { initlcd (); // Initialisierung LCD-Display an P0 loeschenlcd (); // Anzeige löschen
/************* Konfiguration von Timer 0 *************/ TL0 = 0x3C; // Nachladewert 3CAF in Timerregister 0 schreiben. TH0 = 0xAF; // Ergibt 50msec bis Ueberlauf bei Quarz 12 MHz TMOD = 0x01; // Timer0 im Modus2 16bit Zaehler TCON = 0x11; // Start Zaehler0 TR0 = 0; PT0 = 1; // setzt Timer0-Interrupt auf höhere Priorität
ET0 = 1; //Interrupt Timer0 freigeben
/************* Initialisierung Interrupt 0 ************/
EX0 = 1; // ext. Interrupt0 freigeben // IE0 = 1; PX0 = 0; // setzt externen Interrupt0 auf niedrigere Priorität
/************* Initialisierung Interrupt 1 ************/
EX1 = 1; // ext. Interrupt1 freigeben PX1 = 0; // setzt externen Interrupt0 auf niedrigere Priorität EA = 1; // globale Interruptfreigabe
/****************** Hauptprogramm *********************/
// eine Endlosschleife, die nur durch die Interrupts unterbrochen wird while (1) { // Zeit zurücksetzen if (P3_0==0) { TR0 = 0; sek = 0; min = 0; std = 0; loeschenlcd(); ausgabe(1); }
// Stoppuhr anhalten if (P3_1==0) { TR0 = 0; }
// Anleitung if (P3_7==0) { loeschenlcd(); textlcd ("Mit 'S2' gelangen Sie in den Stoppuhrmodus und koennen die Stoppuhr zuruecksetzen.",1); } ausgabe(1); // Zeitausgabe in Zeile 1 erfolgt } }
/****************** Interrupt-Routine Timer 0 ********************/
void timer0 (void) interrupt 1 // Programmbeginn an Adresse 000Bh Interruptnr.:1 { // Dieser Programmteil wird alle 50msec aufgerufen bei // Ueberlauf von Timer0 int count;
count++; // Diese Variable wird jedesmal um 1 erhöht
if(count==20) // Dieser Programmteil wird somit jede Sekunde ausgeführt { sek++; count=0;
if (sek > 59) // Wenn die Variable sek > 59 ist, { min++; // werden die Minuten um 1 erhöht und sek=0; // die Sekunden auf 0 zurückgesetzt.
if (min > 59) // Wenn die Variable min > 59 ist, { std++; // werden die Stunden um 1 erhöht und min=0; // die Minuten auf 0 zurückgesetzt. } } }
TL0 = 0x3C; // Timer0 wieder mit 15535dez laden = 3CAF hex TH0 = 0xAF; }
/****************** Interrupt-Routine externer Interrupt 0 ********************/
void extInt0 (void) interrupt 0 // Interrupt 0 hat Einsprungadresse 0003h Portpin P3.2 { TR0 = 1; // Timer starten }
/****************** Interrupt-Routine externer Interrupt 1 ********************/
void extInt1 (void) interrupt 2 // Interrupt 1 hat Einsprungadresse 0013h Portpin P3.3 { ausgabe(2); // Zwischenzeit ausgeben // aktuelle Zeit wird in der zweiten Zeile des LCD-Displays ausgegeben }
|
|