No entiendo la radio. He escrito el programa del transceptor para el microcontrolador 51 en infrarrojos, pero no sé cómo hacer un control remoto... ¿Por qué no puedo hacer más preguntas?
1. Principios básicos
1.1 Principio de codificación por infrarrojos
Los protocolos de transmisión de señales infrarrojas más utilizados incluyen el protocolo ITT, el protocolo NEC, el protocolo Nokia NRC, el protocolo Sharp y Philips. protocolo protocolo RC-5, protocolo Philips RC-6, protocolo Philips RECS-80 y protocolo Sony SIRC, etc.
1) Composición del protocolo: Generalmente compuesto por un código de arranque, un código de usuario, un código de datos, un código de repetición o el complemento del código de datos y un código de finalización.
2) Portador: los más utilizados son 33K, 36K, 36,6K, 38K, 40K, 56K, sin portador
3) Ciclo de trabajo: los más utilizados son 1/3, 1/2, no se usa comúnmente 1/4
4) Método de modulación: modulación de ancho de pulso, modulación de fase, modulación de posición de pulso
1.2 Principio de decodificación por infrarrojos
Esta vez el trabajo utiliza codificación de protocolo NEC, codificación infrarroja modulada por portadora de 38K. El entorno de codificación se basa en 51 microcontroladores y el lenguaje de programación es C51. El diagrama de bloques principal es el siguiente:
1.3 Método de codificación NEC
Código de arranque, código de usuario de 16 bits (código de dirección), código de comando de 8 bits (código de datos) y su código inverso.
1) El código piloto consta de una forma de onda portadora de 9 ms y un tiempo de apagado de 4,5 ms
2
2) Código de dirección ***16 bits, bajo El 8 bits están al frente y los 8 bits altos están detrás.
3) Código de comando de 8 bits y su código inverso
2. Entorno de decodificación
2.1 Entorno de hardware
1. Placa de desarrollo del microcontrolador SST89E58RD.
2. Receptor de infrarrojos HX1838
1) Dimensiones generales del receptor de infrarrojos HX1838 y disposición de pines:
3
2) Diagrama del circuito de aplicación
3. Resistencias, condensadores y otros componentes
2.2 Entorno de software
1) Keil u vision2
Keil C51 es la serie 51 de sistemas de desarrollo de software en lenguaje C con microcontroladores compatibles producidos por Keil Software en los Estados Unidos. En comparación con el ensamblador, el lenguaje C tiene ventajas obvias en funcionalidad, estructura, legibilidad y mantenibilidad, lo que lo hace fácil de aprender y usar.
2) C51 C51 es un lenguaje estructurado en lenguaje C diseñado para la serie 51 de microcontroladores. El código es compacto: la eficiencia es comparable al lenguaje ensamblador y cercana al lenguaje real. El programa es altamente legible. Funciones de biblioteca de mantenimiento enriquecidas fáciles de depurar, pequeña carga de trabajo de programación: ciclo de desarrollo de productos corto, capacidades de control a nivel de máquina, funciones sólidas: adecuado para el desarrollo de sistemas integrados
4 No tiene nada que ver con las instrucciones de ensamblaje, es fácil de usar. master - en microcomputadora de un solo chip Básicamente, es fácil comenzar
3 Implementación de decodificación
3.1 Diagrama de estructura del programa
Generación del temporizador 20us
Generación
Una interrupción
Si hay señal
(nivel bajo)
SI NO
Determinar si es código de arranque
Código
El tiempo de nivel bajo es alto
En 600us
Juzgar si el código de comando es 0
o 1
Guardar el código de comando
Analizar el código de comando
Visualización en el tubo digital
SÍ
NO
3.2 Código fuente del programa
//Programa de decodificación de control remoto por infrarrojos codificado NEC
5
// // 2011-3-26 #includelt; stdio.hgt ; #includelt;intrins.hgt; #includelt;reg51.hgt; #define TIMERH 0xed // El bit alto del temporizador de definición de macro es 237 #define TIMERL 0xed // El bit bajo del temporizador de definición de macro es 237 código de caracteres unsigned seg_code[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f} // Código de segmento de tubo digital unsigned char bcode; [32]=0; //Definición de matriz de código de comando binario de almacenamiento unsigned int count, dcode; // Definir variables // Descripción de la variable clave //es: aceptar código de comando habilitar control //bandera: recibir bit de signo completo unsigned int i , j, en, k, m, flag; // Conversión de código de segmento de visualización de valor decodificado y tubo digital char code_chg(unsigned char ch) { switch(ch) { caso 14: devolver caso 16: devolver caso 17: devolver 2; caso 18: devolver 3; caso 20: devolver caso 8; caso 22: devolver 6; devolver caso 7; } } // Mostrar código digital void WriteSegData(unsigned char seg) { if(seggt; 16) seg = 16
6
seg = seg_code[seg]; seg; _nop_(); _nop_(); P2 amp; = 0x1f; _nop_(); _nop_( ); P2 |= 0xe0; P0 = ~cs; _nop_(); _nop_(); P2 amplificador;
; _nop_(); _nop_(); P2 |= 0xe0; } //Inicializar el temporizador void InitTimer() { TMOD=0x20; Temporizador 1, modo de trabajo 2 TH1=TIMERH; //Inicialización de bit bajo del temporizador EA=1; //Permitir interrupción ET1=1; //El temporizador 1 abre la interrupción // for (m=0; mlt; 32; m ) // Inicializa la matriz de código de comando binario de almacenamiento { bcode[m ]=0; } } // Función de interrupción del temporizador void timer() interrupción 3 { if((P1amp; 0x80)==0x00) //Determina si es nivel bajo { P1=P1amp; 0xfe;
7
if (countlt; 100amp; amp; en==1) // Determina si es un código de arranque { count } else if (countgt; =100) / /Si es un código de arranque, ignore { en=0; count=0; } } //El nivel alto del código de comando comienza a juzgar la duración del nivel bajo anterior//Si está entre 600-800us, es 0 //Si está entre 1600 y 1900us, es 1 //El período de tiempo definido aquí es para anti-interferencia else if(((P1amp;0x80)==0x80)amp;amp;en==1) { P1=P1|0x01; //Si tiene alto potencial, apague la luz LED e5 if(ilt;31) { if(countgt;30amp;amp;countlt;40) //Si está entre 600-800us, es 0 { bcode[i]= 0; //Guardar el código de comando binario i; //Después de almacenar el código de bits, inicializa count=0; else if(countgt;80amp;amp;countlt;95) // Si es entre 1600 y 1900 us, entonces es 1 { bcode[i]=1; i ; en=0; count=0 } } } else if(((P1amp;0x80)==0x80)amp; ;en==0) // Inicializar antes del código de comando { en=1; count=0; } else if(i==31) //Recibir completado { flag=1; >