Programación en C del módulo receptor de infrarrojos basado en 51 microcontroladores
#includelt; reg52.hgt; //El archivo de encabezado que contiene los registros del microcontrolador
#includelt;intrins.hgt; //El archivo de encabezado que contiene la definición de la función _nop_()
p>
sbit IR=P3^2; //Definir el bit IR como el pin P3.2
sbit RS=P2^0; defina el bit RS como pin P2 .0
sbit RW=P2^1 //Lea y escriba el bit de selección, defina el bit RW como pin P2.1
sbit E=P2; ^2; //Habilitar bit de señal, definir bit E como pin P2.2
sbit BF=P0^7; //Bit de indicador de ocupado, definir bit BF como pin P0.7
sbit BEEP = P3^6; //Puerto de control del zumbador P36
indicador de caracteres sin firmar;
cadena de código de caracteres sin firmar[ ]= {"1602IR-CODE TEST "}; /p>
unsigned char a[4]; //Almacena el código de usuario, el código inverso de usuario y el código de datos clave, el código inverso de datos clave
unsigned int LowTime, HighTime // Almacena el ancho de niveles altos y bajos
/************************************ **** ***************
Función: retardo 1ms
**************** * ***************************************/
retraso anulado 1 ms ( )
{
char sin firmar i, j
for(i=0; ilt; 10; i )
for ( j=0;jlt;33;j)
;
}
/************** ** ************************************
Función: Retardo Número de milisegundos
Parámetro de entrada: n
****************************** * ********************/
retraso nulo (carácter n sin firmar)
{
carácter sin firmar i
for(i=0; ilt; n; i )
delay1ms();
}
/ ********************************************** ** ******/
void beep() //Función de pitido del zumbador
{
unsigned char i;
para (i=0; ilt; 100; i )
{
delay1ms();
BEEP=!BEEP; //BEEP Negar
}
BEEP=1; //Cerrar abeja
Beeper
demora(250); //Retraso
}
/****************** ***********************************
Función: Determinar el módulo LCD Estado de ocupado
Valor de retorno: resultado.
resultado=1, ocupado; resultado=0, no ocupado
******************************* ***** *************************/
carácter sin firmar BusyTest(void)
{
resultado del bit;
RS=0; //Según las regulaciones, cuando RS es de nivel bajo y RW es de nivel alto, se puede leer el estado
RW=1;
E=1; //E=1, se permite lectura y escritura
_nop_() //Sin operación
_nop_ ();
_nop_( );
_nop_(); //Cuatro ciclos de máquina sin operación para dar el tiempo de reacción del hardware
result=BF ; //Asigna el nivel de indicador de ocupado al resultado
E=0
return result
}
/***; ************* *************************************
Función: Establecer el modo Escribe el comando o dirección de visualización en el módulo LCD
Parámetro de entrada: dictar
********** ************** ****************************/
nulo WriteInstruction (dictado de carácter sin firmar)
{
while(BusyTest()==1); //Espera si está ocupado
RS=0; según las regulaciones, cuando RS y R/W tienen un nivel bajo al mismo tiempo, se pueden escribir instrucciones
RW=0
E=0 //E se establece en bajo; nivel (de acuerdo con la Tabla 8-6, al escribir instrucciones, E es un pulso alto,
// Esto es para hacer que E haga una transición positiva de 0 a 1, por lo que se debe establecer "0" primero
_nop_();
_nop_(); / /Sin operación durante dos ciclos de la máquina para dar el tiempo de reacción del hardware
P0=dictar; datos al puerto P0, es decir, escribir instrucciones o direcciones
_nop_();
_nop_()
_nop_();
_nop_(); //No hay operación durante cuatro ciclos de la máquina para dar tiempo de reacción al hardware
E=1; //E está configurado en nivel alto
_nop_(); ;
_nop_();
_nop_();
_nop_(); //Cuatro ciclos de máquina sin operación para dar tiempo de respuesta al hardware
E=0; //Cuando E salta del nivel alto al nivel bajo, el módulo de cristal líquido comienza a ejecutar Comando
}
/***** ******************************* ******************* *
Función: Especificar la visualización de caracteres
Dirección real
Parámetro de entrada: x
****************************** **** ************************/
dirección de escritura nula (carácter x sin firmar)
{
WriteInstruction(x|0x80); //El método para determinar la posición de visualización es "código de dirección 80H x"
}
/*** ********* ******************************************* **
Función: escribir datos (código de caracteres ASCII estándar) en el módulo LCD
Parámetro de entrada: y (constante de carácter)
**** ************ **************************************** ****/
void WriteData (carácter sin firmar y)
{
while(BusyTest()==1
RS=1; //RS es de nivel alto, RW Cuando es de nivel bajo, se pueden escribir datos
RW=0;
E=0; a nivel bajo (de acuerdo con la Tabla 8-6, al escribir instrucciones, E es un pulso alto,
//Es para hacer que E haga una transición positiva de 0 a 1, por lo que "0" debería configurarse primero
P0=y //Enviar datos al puerto P0, es decir, escribir datos en el módulo LCD
_nop_()
_nop_; ();
_nop_();
_nop_( ); //Cuatro ciclos de máquina sin operación, lo que da tiempo de reacción del hardware
E=1; //E está configurado en nivel alto
_nop_();
_nop_();
_nop_();
_nop_( ); //Cuatro ciclos de máquina sin operación para darle tiempo de reacción al hardware
E=0 ; //Cuando E salta del nivel alto al nivel bajo, el módulo LCD comienza a ejecutar comandos
}
/****************** ********************** ********************
Funciones funcionales: Inicializar el modo de visualización LCD
******** ******************************** ****************/
void LcdInitiate(void)
{
delay(15); / /Retraso 15 ms, se debe dar a la pantalla LCD un tiempo de respuesta más largo al escribir instrucciones para el primera vez
WriteInstruction(0x38); //Configuración del modo de visualización: pantalla de 16 × 2, matriz de puntos de 5 × 7, interfaz de datos de 8 bits
retraso (5); Retraso 5 ms
WriteInstruction(0x38);
retraso(5);
WriteInstruction (0x38);
retraso(5);
Escribir
struction(0x0C); //Configuración del modo de visualización: visualización encendida, cursor, parpadeando
delay(5);
WriteInstruction(0x06); //Configuración del modo de visualización: cursor hacia la derecha , los caracteres no se moverán
delay(5);
WriteInstruction(0x01); //Comando borrar pantalla, borra el contenido de la pantalla anterior
delay (5); );
}
/***************************** ** **************************
Función: código de usuario de 4 bytes y clave Decodifica el código de datos
Nota: Si la decodificación es correcta, se devolverá 1; de lo contrario, se devolverá 0
Parámetro de exportación: dat
********** ************************************************** * */
bit DeCode(void)
{
unsigned char i, j
unsigned char temp; decodificar datos de salida
for(i=0;ilt;4;i) //Leer continuamente 4 códigos de usuario y códigos de datos clave
{
for( j=0;jlt;8;j) //Cada código tiene 8 dígitos
{
temp=tempgt;gt;1; //Cada código en temp Los bits de datos son se desplazó un bit hacia la derecha, porque los datos de bits altos se leen primero
TH0=0; //El temporizador se pone a 0
TL0=0; borrado a 0
TR0=1; //Activar el temporizador T0
while(IR==0) //Si está bajo, esperar
; //Tiempo de nivel bajo
TR0=0; //Cerrar temporizador T0
LowTime=TH0*256 TL0 //Guardar ancho de nivel bajo
TH0= 0; // Borrar el temporizador a 0
TL0=0; // Borrar el temporizador a 0
TR0=1 // Activar el temporizador T0
while (IR==1) //Si es nivel alto, espera
;
TR0=0; //Cerrar temporizador T0
HighTime =TH0 *256 TL0; //Guarda el ancho del nivel alto
if((LowTimelt;370)||(LowTimegt;640))
return 0; longitud del nivel Si no está dentro de un rango razonable, se considera un error y se detiene la decodificación
if((HighTimegt; 420)amp; amp; (HighTimelt; 620)) //Si es alto. El tiempo de nivel es de aproximadamente 560 microsegundos, cuenta 560/
1.085=516 veces
temp=tempamp;0x7f; //(520-100=420, 520 100=620), entonces este bit es 0
if((HighTimegt;1300 )amp;amp;(HighTimelt;1800)) //Si el tiempo de nivel alto es de alrededor de 1680 microsegundos, es decir, contando 1680/1.085=1548 veces
temp=temp|0x80; - 250=1300, 1550 250=1800), entonces el bit es 1
}
a[i]=temp; //Almacena el valor del byte decodificado en a[i]
}
if(a[2]=~a[3]) //Verifica si el código de datos clave y su código inverso son iguales. Generalmente, no es necesario. verificar el código de usuario
return 1; //Decodificado correctamente, devolver 1
}
/*----------- ----- --Convierte código binario a código BCD comprimido y muestra---------------*/
void two_2_bcd(fecha de carácter sin firmar)
{
temperatura de carácter sin firmar;
temp=date;
dateamp;=0xf0;
dategt;gt; =4; //Desplaza cuatro bits hacia la derecha para obtener los cuatro bits superiores del código
dateamp =0x0f; //Asegúrate de que los cuatro bits superiores sean 0 con 0x0f
if(datelt;=0x09)
{
WriteData(0x30 date); //la pantalla LCD muestra los cuatro dígitos superiores del valor clave
}
else
{
fecha=fecha-0x09
WriteData(0x40 fecha
}
fecha=temp;
p>fechaamp;=0x0f;
if(datelt;=0x09)
{
WriteData(0x30 fecha); //la pantalla LCD muestra un valor bajo de cuatro dígitos
}
else
{
fecha =fecha-0x09;
WriteData(0x40 fecha);
}
WriteData(0x48); //Mostrar carácter 'H'
}
/**** ************************************* *************** ******
Función: Pantalla 1602LCD
********** ***********
*******************************************/
void Disp(void)
{
WriteAddress(0x40); //Establece la posición de visualización en la primera palabra de la primera línea
two_2_bcd(a). [0 ]);
WriteData(0x20);
two_2_bcd(a[1]); > two_2_bcd (a[2]);
WriteData(0x20);
two_2_bcd(a[3]);
}
/ ************************************************ *** **********
Función función: función principal
****************** ****** *******************************************/
void main ()
{
unsigned char i;
LcdInitiate() //Llamar a la función de inicialización de LCD
delay(10);
WriteInstruction(0x01); //Borrar pantalla: borrar instrucción de pantalla
WriteAddress(0x00); palabra de la primera línea
i = 0;
while(string[i] != '\0') //'\0' es el final del array p>
{ //Muestra el carácter www .RICHMCU.COM
WriteData(string[i]);
i
}; p>
EA=1; //Abrir interrupción total
EX0=1; //Habilitar interrupción externa 0
ET0=1 //Interrupción del temporizador T0 habilitada p>
IT0=1; //Interrupción externa activada por el flanco descendente de la interrupción
TMOD=0x01; //Usa el modo 1 del temporizador T0
TR0=0 ; //El temporizador T0 se apaga
mientras (1); //Esperando la interrupción generada por la señal infrarroja
}
/*** ******************* ******************************* *****
Función: Disparador por infrarrojos Controlador de interrupciones externo
************************ ******************* *************************/
nulo Int0(void) interrupción 0
{
EX0=0; // Desactiva la interrupción externa 0, ya no recibe interrupciones de señales infrarrojas secundarias y solo decodifica la señal infrarroja actual
TH0=0; //Borrar los 8 bits altos del temporizador T0 0
TL0=0;
/Borrar los 8 bits inferiores del temporizador T0 a 0
TR0=1; //Activar el temporizador T0
while(IR==0); , Espere y cronometre el nivel bajo del código de arranque
TR0=0; //Cerrar el temporizador T0
LowTime=TH0*256 TL0 //Guarde el tiempo de nivel bajo
p >
TH0=0; //Borrar los 8 bits altos del temporizador T0 a 0
TL0=0; //Borrar los 8 bits bajos del temporizador T0 a 0
TR0= 1; //Activar el temporizador T0
while(IR==1); //Si es de nivel alto, esperar y cronometrar el código de arranque de nivel alto
TR0. =0 ; //Cerrar el temporizador T0
HighTime=TH0*256 TL0; //Guardar la longitud de alto nivel del código de arranque
if((LowTimegt;7800)amp; amp;( LowTimelt;8800)amp;amp;(HighTimegt;3600)amp;amp;(HighTimelt;4700))
{
//Si es un código de arranque, comience a decodificar; de lo contrario, abandone, sincronización de bajo nivel del código de arranque
//Número de veces=9000us/1.085=8294, intervalo de evaluación: 8300-500=7800, 830500=8800. p>
if(DeCode( )==1) //Ejecutar la función de decodificación del control remoto
{
Disp() //Llamar a la función de visualización 1602LCD
beep(); //Bip El timbre suena una vez para indicar que la decodificación se realizó correctamente
}
}
EX0=1; EX0
} p>