Простые прерывания 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); }
Любые намеки в правильном направлении будут очень оценены! Спасибо