5

C を使用して、8051 マイクロコントローラーでプログラムを作成しています。私が使用しているコンパイラは Keil Microvision です。私は立ち往生しており、自分のコードに何が欠けているのかを理解するのに苦労しています。私はそれが非常に基本的なコードであることを知っています。私は何をすべきか理解できません。

私がやっていることのほとんどは、ユーザーに文を送信し、シリアルポートを介して「はい」または「いいえ」で答えてもらい、シリアル割り込みを使用することです。その部分はうまく機能します。本人から断られたらタイマー割り込みで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) ;
} 

私が問題を抱えている部分は、前のコードからのこれら2つの割り込みです

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

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

正しい方向へのヒントは大歓迎です! ありがとう。整形ごめんなさい

4

1 に答える 1

3

割り込みによって変更される変数は、volatile として定義する必要があります。

volatile sbit WAVE = P1 ^ 7;
于 2013-04-30T09:39:55.253 に答える