Cómo hacer que C51 genere una señal de frecuencia de 38 kHz para crear un transceptor de infrarrojos
Si su microcontrolador es STC89C52RC, puede usar la "Salida de reloj programable del temporizador 2" para generar una señal de frecuencia de 38 kHz. El STC89C52RC tiene tres temporizadores (temporizador 0, 1, 2), entre los cuales el temporizador 2 tiene la mayor cantidad. funciones, y la salida de reloj programable es una de ellas. La salida de reloj programable del Timer 2 es hardware independiente, el microcontrolador solo necesita controlar el encendido y apagado y no ocupa tiempo de CPU.
void TT2(uint i) // i Hz
{
TR2=0
RCAP2H=(65536-12000000/ 4/i)>>8;
RCAP2L=(65536-12000000/4/i)
}
void main(void)
{
T2MOD=0x02; //0000, 0010 permite la salida de reloj programable del temporizador/contador 2 (salida desde P1. 0)
TT2(38000); //Establece 38KHz
while(1)
{
......
}
}
En este momento, siempre que se inicie el temporizador 2 (TR2=1; ), P1.0 generará una onda cuadrada de 38 KHz con un ciclo de trabajo del 50 %
Simplemente apáguelo. Agregue 2 declaraciones:
TR2 =0;
P1^0=1; //Utilice un transistor PNP para controlar el emisor. ser alto cuando está apagado
Desventajas: El ciclo de trabajo = 50% no es ajustable, el pin del transmisor solo puede ser P1.0.
Programa de software que genera señales de frecuencia de 38khz. .
Ventajas:
①El ciclo de trabajo de la portadora de 38 kHz se puede ajustar arbitrariamente para lograr un bajo consumo de energía, una transmisión de corriente máxima alta y mejorar la distancia de transmisión y recepción.
② Los pines del transmisor se pueden definir arbitrariamente.
Por ejemplo:
/********************************* *****************************
Principio de funcionamiento: emisión infrarroja
Microcontrolador: STC89C52RC
Cristal: 12M
Entorno de compilación: Keil uVision4 V9.00
****************** * ***********************************************/< / p>
//
//Pin de emisión (conectado al transistor PNP b)
//El polo e del transistor PNP está conectado a una resistencia de 2Ω, el polo c es conectado al emisor de infrarrojos
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define SBM 0x80 //identificador
#define m9 (65536-9000) //aproximadamente 9mS
#define m4_5 (65536-4500) //aproximadamente 4,5 mS
#define m1_6 (65536-1630) //Aproximadamente 1,65 mS
#define m_65 (65536-580) //Aproximadamente 0,65 mS
#define m_56 (65536-560) //Aproximadamente 0,56 mS
#define m40 (65536-40000) //Aproximadamente 40 mS
#define m30_5 ( 65536-30500) / /Aproximadamente 30,5 mS
#define m2_2 (65536-2250) //Aproximadamente 2,25 mS
sbit IR = P2^0; //definir el pin del emisor ( conectar a la base del transistor PNP)
sbit K1 = P3^2; //clave 1
sbit K2 = P3^3; //clave 2
void ZZ(uchar x);
void Z0(uchar temp);
void TT0(bit BT,uint x
/*┈┈┈); ┈┈┈┈┈ ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
Función función: función principal
┈┈┈┈ ┈┈┈┈┈ ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void main(void)
{ p>
TMOD = 0x01; //Modo de operación T0 de 16 bits
IR=1; //El puerto de envío siempre es de alto nivel
while(1) p>
{
si(! K1)
{
while(!K1);
ZZ(0x12); // Inicia el programa principal del transmisor de infrarrojos y envía el código de operación. 0x12 p>
}
if(!K2)
{
while(!K2
ZZ); (0x62) ; //inicia el programa principal del transmisor IR, envía el código de operación 0x62
}<
/p>
}
}
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ ┈┈┈┈┈┈┈┈┈┈┈┈
Función:
Parámetros de entrada: código de operación
┈┈┈┈┈┈┈┈┈┈ ┈ ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void ZZ(uchar x)<
{
TT0(1,m9); //38KHz, retraso 9mS
TT0(0,m4_5); //No 38KHz, retraso 4.5mS
/* ┈┈ Enviar 4 cuadros de datos
Z0(SBM); // Enviar identificador
Z0(~SBM); // > while(!K1 || !K2)
{
TT0(1,m9);
TT0(0,m2_2);
TT0(1,m_56);
TT0( 0,m30_5);
}
}
/*┈┈┈┈┈┈ ┈┈┈┈┈┈┈┈┈┈┈┈ ┈┈ ┈┈┈┈┈┈┈┈┈┈
Función: Programa de envío de un solo cuadro
Parámetros de entrada: 1 cuadro de datos
┈┈┈┈ ┈┈┈ ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
vacío Z0(uchar temp)
{ <
uchar v;
for (v=0;v<8;v++) //recorre 8 turnos
{
TT0(1 ,m_65); //nivel alto 0.65mS
if(temp&0x01) TT0(0,m1_6); //Envía el bit más bajo
else TT0(0,m_56) ; /p>
temp >>= 1; //Desplazar un bit a la derecha
}
}
/*┈┈┈┈┈ ┈┈ ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
Función Función: Transmisor de pulsos 38KHz + programa de retardo
Parámetros de entrada: ( Ya sea para transmitir pulsos, el tiempo de retardo es aproximadamente ┈┈*/
void TT0(bit BT,uint x)
{
TH0 = x>>8 ; //Ingrese el valor inicial de T0 p>
TL0 = x;
TF0=0; //Borrar
TR0=1 //Iniciar temporizador 0 p>
si( BT == 0) mientras(! TF0); //BT=0 no envía pulsos de 38 KHz, solo retrasos; BT=1 envía pulsos de 38 KHz y retrasos;
else while(1) //pulsos de 38 KHz, ciclo de trabajo 5:26
p>{
IR = 0;
si(TF0)romper;
si(TF0)romper;
IR = 1;
si(TF0)romper;
si (TF0)romper;
si(TF0)romper;
si(TF0)se rompe;
si(TF0)se rompe;
si(TF0)se rompe;
si(TF0)se rompe;
if(TF0)romper;;
si(TF0)se rompe;;
si(TF0)se rompe )
si(TF0)se rompe;
si(TF0)se rompe;
if(TF0)break;
}
TR0=0; //Cerrar temporizador 0
TF0=0 //Borrar indicador de desbordamiento 0;
IR =1; //Después de que se detiene el pulso, el modo normal del puerto de envío pasa a nivel alto
}