| Impulszähler
|
Die integrierte Schaltung 74HC451 wurde speziell zum Ansteuern von 7-Segmentanzeigen entwickelt. Mit sieben Ausgängen werden alle sieben Elemente der Anzeige einzeln ein- bzw. ausgeschaltet. Mit dem Steuersignal BL kann die Anzeige ein- bzw. ausgeschaltet werden. Das Signal LE bestimmt, ob die Daten an die Ausgänge weitergeleitet werden. Mit dem dritten Steuersignal LT kann ein Lampentest durchgeführt werden.
BCD-Decoder 74HC4511Der aktuelle Zählerstand wird mithilfe vier 7-Segmentanzeigen sichtbar. Alle Anzeigen werden von den BCD-Treibern 74HC4511 angesteuert. 7-Segmentanzeigen stellen eine einfache, verlässliche und kostengünstige Alternative zur Darstellung von Ziffern (und anderen Zeichen).
7-SegmentanzeigeDer Schaltplan
Testschaltung
- Die Schaltkompositionen für Zehner- und Hunderter-Anzeige sind aus Platzgründen auf dem Plan nicht gezeichnet.
Sie müssen natürlich in die Schaltung eingepflegt werden. Die Verdrahtung aller Segmente ist identisch. Lediglich die Leitung
LE wird vom Mikrocontroller zu jedem BCD-Decoder separat geführt.
- Die Leuchtdiode D1 wird nur für Demonstrationszwecke verwendet. Mit dem Ausgang könnte sonst, nachdem der gewünschte
Zählerstand erreicht wurde, ein Prozess angehalten werden.
- Der Taster S1 dient als Impulsquelle. Hier könnte auch jeder beliebige Impulsgeber eingesetzt werden.
- Ähnlich wie die LED D1 dient auch der Schalter S2 nur Präsentation. Wenn man ihn entfernt, stehen für weitere
Programmerweiterungen noch zwei freie I/Os zur Verfügung.
// PIC16F1503 Configuration Bit Settings // CONFIG1 #pragma config FOSC = INTOSC // Oscillator Selection Bits (INTOSC oscillator: // I/O function on CLKIN pin) #pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled) #pragma config PWRTE = OFF // Power-up Timer Enable (PWRT disabled) #pragma config MCLRE = OFF // MCLR Pin Function Select (MCLR/VPP pin function // is digital input) #pragma config CP = OFF // Flash Program Memory Code Protection (Program // memory code protection is disabled) #pragma config BOREN = OFF // Brown-out Reset Enable (Brown-out Reset disabled) #pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. // I/O or oscillator function on the CLKOUT pin) // CONFIG2 #pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off) #pragma config STVREN = OFF // Stack Overflow/Underflow Reset Enable (Stack Overflow or // Underflow will not cause a Reset) #pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset // Voltage (Vbor), low trip point selected.) #pragma config LPBOR = OFF // Low-Power Brown Out Reset (Low-Power BOR is disabled) #pragma config LVP = OFF // Low-Voltage Programming Enable (High-voltage on // MCLR/VPP must be used for programming) #include <xc.h> #include <stdbool.h> #define _XTAL_FREQ 1000000 #define BCD_Bit0 PORTAbits.RA5 // Bit 0 der BCD-Zahl, Pin 2 #define BCD_Bit1 PORTCbits.RC4 // Bit 1 der BCD-Zahl, Pin 6 #define BCD_Bit2 PORTCbits.RC5 // Bit 2 der BCD-Zahl, Pin 5 #define BCD_Bit3 PORTAbits.RA4 // Bit 3 der BCD-Zahl, Pin 3 #define Anzeige_0001 PORTCbits.RC0 // Anzeige x1 Daten übernehmen #define Anzeige_0010 PORTAbits.RA2 // Anzeige x10 Daten übernehmen #define Anzeige_0100 PORTAbits.RA1 // Anzeige x100 Daten übernehmen #define Anzeige_1000 PORTAbits.RA0 // Anzeige x1000 Daten übernehmen #define Impuls_Eingang PORTAbits.RA3 // Impulseingang #define Stop_Signal PORTCbits.RC1 // Stop - Zielstand erreicht #define TEST_Schalter PORTCbits.RC2 // Testschalter Dauerdurchlauf char Ziffer = 0; char Einer, Zehner, Hunderter, Tausender; int Zaehlerstand; bool Flanke; void Ziffer_ausgeben () { Anzeige_0001 = 1; // Digit Einer / Daten Übernahme deaktiviert Anzeige_0010 = 1; // Digit Zehner/ Daten Übernahme deaktiviert Anzeige_0100 = 1; // Digit Hunderter / Daten Übernahme deaktiviert Anzeige_1000 = 1; // Digit Tausender / Daten Übernahme deaktiviert BCD_Bit0 = 0; // BCD Datenleitung nullen BCD_Bit1 = 0; // BCD Datenleitung nullen BCD_Bit2 = 0; // BCD Datenleitung nullen BCD_Bit3 = 0; // BCD Datenleitung nullen switch (Ziffer) { // 0 = 0000 case 1: BCD_Bit0 = 1; // 1 = 0001 break; case 2: BCD_Bit1 = 1; // 2 = 0010 break; case 3: BCD_Bit0 = 1; // 3 = 0011 BCD_Bit1 = 1; break; case 4: BCD_Bit2 = 1; // 4 = 0100 break; case 5: BCD_Bit0 = 1; // 5 = 0101 BCD_Bit2 = 1; break; case 6: BCD_Bit1 = 1; // 6 = 0110 BCD_Bit2 = 1; break; case 7: BCD_Bit0 = 1; // 7 = 0111 BCD_Bit1 = 1; BCD_Bit2 = 1; break; case 8: BCD_Bit3 = 1; // 8 = 1000 break; case 9: BCD_Bit0 = 1; // 9 = 1001 BCD_Bit3 = 1; break; } } void main(void) { ANSELA = 0b00000000; // Pins als digitale I/Os ANSELC = 0b00000000; // Pins als digitale I/Os TRISA = 0b00001000; // I/O PORT A, 1-Eingang, 0-Ausgang TRISC = 0b00000100; // I/O PORT C, 1-Eingang, 0-Ausgang PORTA = 0b00000000; // Ausgänge nullen PORTC = 0b00000100; // Ausgänge nullen while (true) { if (TEST_Schalter == false) { // Testbetrieb Flanke = false; } if ((Impuls_Eingang == false) && (Flanke == false)) { Einer++; // Flanke erkannt: Gesamtzähler um 1 Zaehlerstand++; // erhöhen und anzeigen Flanke = true; if (Einer > 9) { Einer = 0; Zehner++; } Ziffer = Einer; Ziffer_ausgeben (); // BCD auf Bus legen Anzeige_0001 = 0; // Digit 1 übernimmt die Daten if (Zehner > 9) { Zehner = 0; Hunderter++; } Ziffer = Zehner; Ziffer_ausgeben (); Anzeige_0010 = 0; if (Hunderter > 9) { Hunderter = 0; Tausender++; } Ziffer = Hunderter; Ziffer_ausgeben (); Anzeige_0100 = 0; if (Tausender > 9) { Einer = 0; Zehner = 0; Hunderter = 0; Tausender = 0; } Ziffer = Tausender; Ziffer_ausgeben (); Anzeige_1000 = 0; } if (Impuls_Eingang == true) { // Erst wenn Taster losgelassen Flanke = false; // geht es weoter } while (Zaehlerstand == 9500) { // Gewünschter Zählerstand erreicht? Stop_Signal = true; // Signal ausgeben und Zähler stoppen } } } // ***************************************************************************
Kurzvideo
Google-Suche auf MEINE-SCHALTUNG.de : |