¡Puntuación alta! Se busca urgentemente el programa de interrupción externa del microcontrolador 89C51. Hay tres fuentes de interrupción externas que controlan la salida de 3 puertos IO. Escrito en lenguaje C. Chat en línea en cualquier momento
//El siguiente procedimiento es básicamente correcto. El tiempo de ancho de pulso restante lo puede completar usted mismo.
#include
#define uchar unsigned char
#define uint unsigned int
sbit P00 = P0^ 0;
sbit P01 = P0^1;
sbit P02 = P0^2;
sbit k_1 = P3^0; //Primera entrada
sbit k_1 = P3^0; p>
uchar t_10ms, k3;
//------------------------------- - ---------
DL_x_10ms(uchar x)
{
t_10ms = 0;
TH0 = ( 65536 - 10000) / 256;
TL0 = (65536 - 10000) % 256; //Sincronización 10ms@12MHz
TR0 = 1; //Iniciar temporización.
while(t_10ms < x); //Menos de x*10ms, espera en el lugar.
TR0 = 0; //Tiempo de cierre.
}
//-------------------------------
void main(void)
{
TMOD = 01; //Modo de temporización T0 1
TH0 = (65536 - 10000) / 256;
TL0 = (65536 - 10000) % 256; //Tiempo 10ms@12MHz
TR0 = 0; //Aún no iniciado.
ET0 = 1; p>
IT0 = 1;
IT1 = 1;
EX0 = 0;
EX1 = 0;
EA = 1;
k3 = 1;
mientras(1) { //
//------------- -----------------------
while((k_1 == 1) || (k3 == 0)); K1 no está presionado o K3 aún no ha ejecutado la espera en el lugar.
//K1 se presiona una vez y la ejecución continúa.
while(k_1 == 0); / Espere a que se suelte K1.
k3 = 0; //Si se presiona K1 dos, tres veces... en el futuro, no se ejecutará.
/ /Ingrese la primera interrupción, el puerto P0.0 genera un nivel bajo, el puerto P0.1 genera un nivel alto y el puerto P0.0 genera un nivel alto después de un retraso de 1.5S.
.
P00 = 0; P01 = 1;
DL_x_10ms(150);
P00 = 1;
EX0 = 1; //Abrir interrupción INT0 (K2)
//Pasa al frente y espera (se presiona K1 y K3=1)
}
} p >
//-------------------------------
T0_INT() interrupción 1
{
TH0 = (65536 - 10000) / 256;
TL0 = (65536 - 10000) % 256; Temporización 10ms@12MHz
t_10ms++;
}
//-------------------- ------------------
X0_INT() interrupción 0 //K2 flanco descendente de entrada, ingresará a esta función
{
//Ingrese la segunda interrupción, después de un retraso de 1.11S, el puerto P0.2 genera un nivel bajo y luego.
DL_x_10ms(111);
P02 = 0; //El puerto P0.2 genera un nivel bajo
//¿Cuánto tiempo lleva generar un nivel bajo? El título no se menciona.
//------------------------
//Alta 0,15S,
P02 = 1; //La salida del puerto P0.2 es alta.
DL_x_10ms(15);
//------------ ---- -----
//Bajo 0.3S,
P02 = 0; //El puerto P0.2 emite un nivel bajo.
DL_x_10ms(30 );
//El tiempo a continuación puede ser escrito por usted mismo
//Alto 0.3S,
//Bajo 0.58S, p>
>Alta 0.12S,
//Baja 1.08S,
//Alta 2.55S,
//Baja 0.47S,
//Alto 0.075S, niveles altos y bajos muchas veces. .
EX0 = 0;
EX1 = 1; //Abrir interrupción INT1(K3)
}
//-- ------------------------------------
X1_INT() interrupción 2 p>
{
//Al ingresar a la tercera interrupción, el puerto P0.1 genera un nivel bajo. .
P01 = 0;
EX1 = 0;
k3 = 1; //=1, será útil en la función principal
}
//------------------------------------- ---