2012-12-06 12 views
5

Używam C do napisania programu na mikrokontroler 8051. Używany kompilator to Keil Microvision. Utknąłem i mam problem z wykryciem tego, czego brakuje w moim kodzie. Wiem, że to bardzo podstawowy kod. Nie mogę pojąć, co mam robić.przerwania 8051 c

Prawie co robię, to wysyłanie wyrażeń do użytkownika i odbieranie odpowiedzi "tak" lub "nie" przez port szeregowy i użyłem przerwania szeregowego. Ta część działa dobrze. Jeśli otrzymam od osoby, którą chcę generować falę prostokątną 5kHz, przez przerwanie timera. Chcę, aby ta prostokątna fala była sterowana przez zewnętrzne przerwanie, włączając ją i wyłączając, gdy zewnętrzne przerwanie na wtyku P3.2 jest włączone lub wyłączone. Oto cała moja kod

#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) ; 
} 

Część Mam problemy z tych dwóch jest przerwanie od poprzedniego kodu

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

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

żadnych wskazówek we właściwym kierunku byłoby bardzo mile widziane! Dzięki. Niestety na temat formatowania

+0

To pomogłoby gdyby można formatować rzeczy lepiej. –

+3

Pomoże ci też, jeśli wyjaśnisz, co się nie dzieje. –

Odpowiedz

3

zmiennych, które zostały zmodyfikowane przez przerwań należy zdefiniować jako niestabilne:

volatile sbit WAVE = P1^7; 
Powiązane problemy