2012-12-06 63 views
5

我正在使用C在8051微控制器上編寫程序。我正在使用的編譯器是Keil Microvision。我卡住了,無法弄清楚我的代碼中缺少的東西。我知道這是非常基本的代碼,我無法弄清楚我應該做什麼。8051 c中斷

因此,我所做的幾乎是將一個句子發送給用戶,讓他們通過串口回答是或否,並使用串行中斷。這部分工作正常。如果我想通過定時器中斷產生一個5kHz的方波,我會得到一個「否」。當P3.2引腳上的外部中斷處於打開或關閉狀態時,我希望這個方波由一個外部中斷控制。 這裏是我的代碼

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

我遇到麻煩是從以前的代碼

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

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

在正確的方向任何提示這兩個中斷將不勝感激的一部分!謝謝。對不起格式化

+0

這將有助於如果你能更好的格式的東西。 –

+3

如果你解釋了沒有發生的事情,它也會有所幫助。 –

回答

3

的變量被中斷修改應該被定義爲揮發性:

volatile sbit WAVE = P1^7;