JoeTaylor123 Ответов: 1

Простые прерывания 8051 C


Я использую C для написания программы на микроконтроллере 8051. Компилятор, который я использую, - это Keil microvision. Я застрял и никак не могу понять, чего не хватает в моем коде. Я знаю, что это очень простой код, я просто не могу понять, что я должен делать.

Поэтому в значительной степени то, что я делаю, - это отправляю предложение пользователю и заставляю его ответить " да " или "знаю" через последовательный порт, и я использовал последовательное прерывание. Эта часть работает отлично. Если я получу " нет " от человека, я хочу сгенерировать прямоугольную волну 5 кГц с помощью прерывания таймера. Я хочу, чтобы эта прямоугольная волна управлялась внешним прерыванием, включающим и выключающим ее, когда внешнее прерывание на выводе 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);
}


Любые намеки в правильном направлении будут очень оценены! Спасибо

1 Ответов

Рейтинг:
2

KarstenK

Вы застряли в цикле while. Используйте getchar, чтобы получить вход char. Некоторые учебник для getchar.

Ваш код должен выглядеть примерно так:

printf("Hello, Are you okay? Press y for yes and n for no ");
c = getchar();
// implement your logic and handle when OTHER chars.  
if( c == 'y' ) {
}


Dave Kreskowiak

Ты ведь знаешь, что этому вопросу уже пять лет, верно?