2012-12-06 7 views
5

Ich benutze C, um ein Programm auf einem 8051 Mikrocontroller zu schreiben. Der Compiler, den ich verwende, ist Keil Microvision. Ich stecke fest und habe Probleme herauszufinden, was in meinem Code fehlt. Ich weiß, es ist ein sehr grundlegender Code, ich kann einfach nicht herausfinden, was ich tun soll.8051 c Interrupts

Also ziemlich viel, was ich tue, nimmt das Senden eines Satzes an den Benutzer und ließ sie ja oder nein über den seriellen Port antworten, und ich benutzte einen seriellen Interrupt. Dieser Teil funktioniert gut. Wenn ich ein Nein von der Person bekomme, möchte ich eine Rechteckwelle von 5 kHz durch einen Timer-Interrupt erzeugen. Ich möchte, dass diese Rechteckwelle durch eine externe Unterbrechung gesteuert wird, die sie ein- und ausschaltet, wenn die externe Unterbrechung an Pin P3.2 entweder an oder aus ist. Hier ist mein Code

#include <REG52.H> 
#include <stdio.h> 
sbit WAVE = P1^7; 
#define BIT(x) (1 << (x)) 

void timer0() interrupt 1 // timer is controlling square wave timer 0 
{ 
    WAVE = ~WAVE; 
} 

void interrupt0() interrupt 0 
{ 
    IE ^= BIT(1); 
} 

void serial0() interrupt 4 
{ 
    unsigned char x; 
    unsigned int i, z; 
    unsigned char yes[] = " YES "; 
    unsigned char no[] = " NO "; 
    unsigned char nvalid[] = " NOT VALID TRY AGAIN "; 

    while (RI == 1) { 

    x = SBUF; 
    RI = 0; 

    if (z < 1) { 
     if (x == 'n') { 
     for (i = 0; i < 4; i++) { 
      SBUF = no[i]; 
      while (TI == 0) ; //wait for transmit 
      TI = 0; 
      z++; 
     } 
     } 
    } else { 
     return; 
    } 

    if (x == 'y') { 
     for (i = 0; i < 5; i++) { 
     SBUF = yes[i]; 
     while (TI == 0) ; 
     TI = 0; 
     } 
    } else if (x != 'n') { 
     for (i = 0; i < 21; i++) { 
     SBUF = nvalid[i]; 
     while (TI == 0) ; 
     TI = 0; 
     } 
    } 

    TI = 0; 
    return; 
    } 
} 

void main() 
{ 
    TMOD = 0x20; 
    TH1 = 0xF6; //baud rate 
    SCON = 0x50; 
    TH0 = 0xA4; 
    IE = 0x93; //enable interrupts 
    IP = 0x10; // propriety to serial interrupt 
    TR1 = 1; //start timer 1 
    TR0 = 1; //clear timer 0 
    TI = 1; 
    printf("Hello, Are you okay? Press y for yes and n for no "); 
    while (1) ; 
} 

Der Teil I Fehler, er habe mit diesen zwei Interrupt aus dem vorherigen Code ist

void timer0() interrupt 1 // timer is controlling square wave timer 0 
{ 
    WAVE=~WAVE; 
} 

void interrupt0() interrupt 0 
{ 
    IE ^= BIT(1); 
} 

Irgendwelche Hinweise in die richtige Richtung wäre sehr dankbar! Vielen Dank. Es tut uns Leid über Formatierungs

+0

Es würde helfen, wenn Sie die Dinge besser formatieren könnte. –

+3

Es würde auch helfen, wenn Sie erklären, was nicht passiert. –

Antwort

3

Variablen, die durch Interrupts modifiziert werden, sollten als flüchtig definiert werden:

volatile sbit WAVE = P1^7; 
Verwandte Themen