Red de conocimiento informático - Conocimiento sistemático - Buscando el programa del microcontrolador para el receptor de infrarrojos

Buscando el programa del microcontrolador para el receptor de infrarrojos

Publicaré un ejemplo ya preparado en el tablero de desarrollo para usted. La parte de anotaciones de derechos de autor de este sitio no se puede resolver debido a problemas de filtrado.

Huijing Electronics: 1 día para obtenerlo. iniciado, 8 días para aprender, dominar el microcontrolador PIC y el videotutorial en lenguaje C que respalda el código fuente del programa en 28 días

#include

__CONFIG(0xFF32);

//Palabra de configuración del chip, vigilancia desactivada, retardo de encendido activado, detección de apagado desactivada, programación de bajo voltaje desactivada, cifrado, oscilación HS de cristal de 4M

#define uchar unsigned char

#define uint unsigned int

#define bitset(var,bitno)((var)|=1<<(bitno))

#define bitclr(var,bitno)((var)& =~(1<<(bitno)))

//El siguiente programa utiliza el campo de bits de la estructura para facilitar las operaciones de bits

//Lo que no puedes entender Es hora de agregar el lenguaje C

union {

struct

{

unsigned b0 : 1;

b1 sin firmar: 1;

b2 sin firmar: 1;

b3 sin firmar: 1;

b4 sin firmar: 1 ;

b5 sin firmar: 1;

b6 sin firmar: 1;

b7 sin firmar: 1;

}

oneBit;

char allBits sin firmar;

} myFlag;

#define CNT2_1 myFlag.oneBit.b1

#define CNT2_2 myFlag.oneBit.b2

#define CNT2_3 myFlag.oneBit.b3

#define CNT2 myFlag .allBits

BANDERAS de bits estáticos;

bit estático Bitin;

union Csr

{ unsigned long i;

unsigned char Csra[4];

}myCsra;

# define RMT RE2 // ;Dirección del pin de entrada de recepción del control remoto (RA.

1)

#define BITIN 7 //Indicador de bits de datos de recepción de control remoto

uchar CNT0, CNT3, CNT4 //Registro temporal de usuario 1--4

uint CNT1;

uchar TABADD; //Registro para adquisición de código de visualización de tubo digital

uchar CSR0; //Registro de inversión de código de clave remota

uchar CSR1; //;Registro de código de clave de control remoto

uchar CSR2; //;Registro de código de usuario de control remoto alto 8-bit

uchar CSR3 //;Código de usuario de control remoto bajo 8-; registro de bits

uchar FLAGS2; //;registro temporal

uchar CSR2A; //control remoto que recibe registro temporal de datos de 32 bits

tabla de caracteres const sin firmar[ ] = {0x3f, 0x6, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x7, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};

// 0, 1, 2 , 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f,

/*************** *** ************************************************* **** *************

* Nombre: inicial

* Función: Subrutina de inicialización del sistema

* Entrada parámetros:

* Parámetros de exportación:

* Descripción:

* Observaciones: Huijing Electronic Network www.HLMCU.COM Huijing Space/hlmcu

* ************************************************* **** *************************/

nulo inicial (nulo)

{

PORTA = 0;

ADCON1 = 7; // Establece todos los puertos RA en puertos IO digitales ordinarios

TRISA = 0x00;

TRISE2 = 1 ; // Establece RMT como entrada y todos los demás puertos IO como salida

TRISD = 0; // ;Todos los puertos RC son salida

PORTD = 0xFF; Vamos primero No se muestran todos los tubos digitales

TRISC = 0xf0;

PORTC = 0x11;

}

/************************ ***** ********************************************** ****** ***

* Nombre: RCV()

* Función: Decodificación de escaneo por infrarrojos

* Parámetros de entrada:

* Parámetros de salida:

* Descripción:

* Observaciones: Huijing Electronic Network www.HLMCU.COM Huijing Space/hlmcu

**** *** ************************************************* **** *******************/

anular RCV()

{

if (!RMT )

{

CNT1 = 640; //4*256*10us 640*16=10.24ms

CNT2 = 0;

//RCV1

do

{ // ; Primero detecta el nivel bajo de 9MS del código de arranque _____┏┓

// ; Cada ciclo 16US

si (RMT)

CNT2 = CNT2++;

si (!RMT)

CNT2 = 0;

if (CNT2_2) //El nivel alto es mayor que 8*10US=80US, entonces es un nivel alto efectivo,

break //De lo contrario, es alguna señal de interferencia 16*; 4=64us

}

while (CNT1--); //Si el nivel bajo es mayor que 4*256*10US=10.24MS, es un pulso de error

//RCV2

if (CNT2_2 && (0 < CNT1) && (CNT1 < 320)) //;El nivel bajo es inferior a 2*256*10US=5.12MS┏┒ ____

{//320*16 =5.

12ms es un pulso de error

CNT1 = 480; //;3*256*10us 480*16=7.68

CNT2 = 0;

//RCV3 //;16US por ciclo

do

{

if (!RMT)

CNT2 = CNT2++;

if (RMT)

CNT2 = 0;

if (CNT2_2) // Si el nivel bajo es mayor que 8*10US=80US, es un nivel bajo efectivo, de lo contrario es alguna señal de interferencia

break; //RCV4, de lo contrario es alguna señal de interferencia 16*4=64us

// Está mal si el nivel alto es mayor que 3 *256*10US=7.68MS

}

mientras (CNT1--);

//RCV4

si (CNT2_2 && (0 < CNT1) && ( CNT1 < 320)) //Está mal si el nivel alto es menor que 1*256*10US=2.56MS

{ //480-320=160 *16= 2.56ms

CNT3 = 32; //Recibir datos ***32 bits, código de usuario de 16 bits, código de control de 8 bits más el código inverso del código de control de 8 bits

//RCV5

do

{

CNT2 = 0;

CNT0 = 86 //El nivel bajo es mayor que 256-170=86*10US=860US error 86*10 __┌ ┐

CNT4 = 200; //El nivel alto es mayor que 256-56=200*10US=2MS error 200*10

//RCV5_HI

hacer

{ //;10US por ciclo

si (RMT)

CNT2 = CNT2++ ;

if (!RMT)

CNT2 = 0;

if (CNT2_3) //;Si el nivel alto es mayor que 8*10US=80US , es un nivel alto efectivo

break; //RCV6 De lo contrario, es alguna señal de interferencia 16*4=64us

// Está mal si el nivel bajo es mayor que 860US

}

mientras (CNT0--) ;

//CV6

si ((CNT0 == 0) || (CNT2_3 == 0)) romper;

CNT2 = 0;

//RCV6_LO

hacer

{ //┌┐ __

si (!

RMT)

CNT2 = CNT2++;

si (RMT)

CNT2 = 0;

si (CNT2_3) //Baja potencia Si el nivel es mayor que 10*8US=80US, es un nivel bajo efectivo

break; // COMPARAR de lo contrario es alguna señal de interferencia 16*4=64us

}

while (CNT4--); //El nivel alto es mayor que 256-56=200*10US=2MS error

if ((CNT4 == 0) || (CNT2_3 = = 0)) break;

//OMPARE

CNT0 = (86 - CNT0) + (200 - CNT4) ;

//;El valor menos CNT0 es igual al valor real del recuento de nivel bajo

// ;El valor menos CNT4 es igual al valor real del recuento de nivel alto

// ;Suma los recuentos de nivel alto y bajo juntos y almacenarlos en CNT0, comparando los niveles alto y bajo Calcular el tiempo total para determinar si es 1 o 0

// ;Si el valor total es mayor que 255 (es decir, el tiempo es mayor que 255*10US=2.55MS), el error es 255*10=2.55

// ;Si el tiempo total es menor que 70*10US=700US, es incorrecto 70*10=700

if (( (70 < CNT0) && (CNT0 < 130)) || ((160 < CNT0 ) && (CNT0 < 230) ) ) // ;130*10=1.3MS

{

if ((70 < CNT0) && (CNT0 < 130))

//COMPARE_H // ;Si el tiempo es mayor a 1.3MS, pase a determina si es 1

Bitin = 0 //;Si el tiempo está entre 700US-1.3MS, será 0

else // if (160

//;Si es mayor a 230*10US=2.3MS, es un error

Bitin = 1; // ;Cuando el tiempo está entre 1.6MS-2.3MS, es 1

myCsra.i = myCsra.i >> 1 //;Mueva cada bit al; registro correspondiente

if (Bitin)

bitset ( myCsra. Csra[3], 7);

else bitclr ( myCsra. Csra[3], 7 );

}

else break;

}

while (CNT3--); //;Si se han colocado 32 bits. recibido

CSR3 = miCsra[0];

CSR2 = miCsra[1];

CSR1 = miCsra[2];

CSR0 = miCsra[3];

CSR2A = ~CSR0; //; Compara si el código inverso del código clave es igual al código clave

// Si no es igual, se recibe información incorrecta

> // Enviar el código clave para mostrar

}

}

}

}

/* ************************************************* ***** **********************

* Nombre: display()

* Función: Digital pantalla de tubo

* Parámetros de entrada:

* Parámetros de salida:

* Descripción:

* Observaciones: Huijing Electronics Network www.HLMCU .COM Espacio Huijing/hlmcu

*************************************** *** **********************************/

visualización nula()< / p>

{

int i, j; //Definir variable de búsqueda de tabla

i = CSR3 & 0x0f;

PORTD = table[i ] ; //Enviar visualización del puerto D

PORTA = 0x1;

for (j = 0;j < 50;j++); //Extender por un período de tiempo para garantizar el brillo.

i = CSR3 & 0xf0;

i = i >> 4; //Desplazamiento a la derecha 4 bits

PORTD = table[i] //Enviar Pantalla del puerto D

PORTA = 0x2;

for (j = 0;j < 50;j++); //Extender por un período de tiempo para garantizar el brillo

i = CSR2 & 0x0f ;

PORTD = table[i]; //Enviar visualización del puerto D y mostrar punto decimal

PORTA = 0x4;

for (j = 0;j < 50;j++); //Extender por un período de tiempo para asegurar el brillo

i = CSR2 & 0xf0;

i = i >> 4 ;

PORTD = table[i]; //Enviar visualización del puerto D

PORTA = 0x6;

for (j = 0;j < 50;j++ ); //Extender por un período de tiempo para asegurar el brillo

i = CSR1 & 0x0f;

PORTD = table[i] //Enviar visualización del puerto D y agregar punto decimal;

PORTA = 0x8;

NOP(); //Extender por un período de tiempo para asegurar el brillo

for (j = 0;j < 50; j++);

i = CSR1 & 0xf0 ;

i = i >> 4;

PORTD

= table[i]; //Enviar visualización del puerto D

PORTA = 0x0A;

NOP(); //Extender por un período de tiempo para garantizar el brillo

para (j = 0;j < 50;j++);

}

/********************* ***** ********************************************** ****** ****

* Nombre: principal

* Función: Programa principal

* Parámetros de entrada:

* Parámetros de salida:

* Descripción:

* Observaciones: Huijing Electronic Network www.HLMCU.COM Huijing Space/hlmcu

****** ************************************************* ***** ****************/

void main(void)

{

inicial (); // Subrutina de inicialización del sistema

while (1)

{

RCV(); //Programa de recepción de control remoto

display(); //Programa de visualización de decodificación

}

}