Red de conocimiento informático - Conocimiento del nombre de dominio - Solicitud urgente: Microcontrolador de control remoto por infrarrojos, diagrama de circuito de recepción y transmisión y diseño de programa. El programa está escrito preferiblemente en lenguaje C.

Solicitud urgente: Microcontrolador de control remoto por infrarrojos, diagrama de circuito de recepción y transmisión y diseño de programa. El programa está escrito preferiblemente en lenguaje C.

//Creador de aplicaciones ICC-AVR: 12/05/2010 PM 5:48:11

// Objetivo: M8

// Cristal: 8.0000 Mhz

#include

#include

#include

#include

#include

#include

#include

#include

#define uchar unsigned char

#define uint unsigned int

#define xtal 8

#define select_a_low (PORTD &=~(1<<7))

#define select_b_hi (PORTD |=(1<<4))

#define select_b_low (PORTD &=~(1<<4))

#define in_result (PINC )

#define ráster (PINB y 0x08)

#define ir (PIND & 0x04)

#define pluse_hi (PORTB |=(1<<1))

#define pluse_low (PORTB &=~(1<<1))

#define presionar (PINB & 0x01)

extern int _textmode;

uchar key_code=0;

uchar new_code=0;

uint buf_key_code=0;

uchar key_bit_count=0;

uint count=0;

uint buf_count=0;

uchar common_code_count=0;

uchar ir_status=0;

uint total[50];

uchar temp=0;

uchar mm=0;

uchar tp1=0;

unsigned long full=0;

uint all=0;

uchar n=0;

proceso nulo(uchar ak);

void port_init(void)

{

PORTB = 0xFF;

DDRB = 0xFE;

PORTC = 0x7F; //solo salida m103

DDRC = 0x7F;

PORTD = 0xFF ;

DDRD = 0x00;

}

retraso nulo_1

0us(uchar y)

{

uchar x;

for(x=y;x>0;x--)

;

}

//Inicializar vigilancia

// preescala: 2048K

void watchdog_init(void)

{

WDR (); //esto evita un tiempo de espera al habilitar

WDTCR |= (1<

WDTCR = 0x0F; //WATCHDOG HABILITADO - no olvides emitir WDR

}

//TIMER0 inicializar - preescala:8

// valor deseado: 50uSec

// valor real: 50.000uSec (0.0%)

void timer0_init(void)

{

TCCR0 = 0x00; //detener

TCNT0 = 0xCE; //establecer recuento

TCCR0 = 0x02; p>}

#pragma interrupt_handler timer0_ovf_isr:iv_TIM0_OVF

void timer0_ovf_isr(void)

{

//uint a;

contar++;

/*

a=cuenta%2;

si(a==0)

pluse_low;

else

pluse_hi;

*/

TCNT0 = 0xCE //recargar valor del contador

}

//UART0 inicializar

// velocidad en baudios deseada: 9600

// real: velocidad en baudios: 9615 (0,2%)

void uart0_init(void)

{

UCSRB = 0x00; //deshabilitar al configurar la velocidad en baudios

UCSRA = 0x00;

UCSRC = BIT(URSEL) | 0x06;

UBRRL = 0x33; //establecer velocidad en baudios baja

UBRRH = 0x00; //establecer velocidad en baudios alta

UCSRB = 0x18;

}

int putchar(char c)

{

if (_textmode && c == ' \n')

putchar('\r');

while (!(UCSRA & (1<

;

UDR = c;

return c;

}

void all_zero(void)

{

uchar i;

for(i=0;i<48;i++)

{

total[i]=0;

}

}

void inicialize_eeprom(void)

{

all_zero();

timer0_init() ;

count=0;

}

visualización vacía(void)

{

uint i, k,m,w;

uchar s,r,t;

/*

for(i=0;i<35;i++)

printf("total[%d]=%d\r\n",i,total[i]);

*/

m=15;

for(i=0;i<10;i++)

{

si(total[i]>230)

{

m=i;

i=12;

}

}

k=0;

if(0)

{

for(i=0;i<35;i++)

printf("total[ %d]=%d\r\n",i,total[i]);

}

//printf("m=%d\r\n", m);

if(m<10)

{

for(i=(m+1);i<(17+m);i++ )

{

if(total[i]>18 && total[i]<25)

k>>=1;

if(total[i]>39 && total[i]<45)

{

k>>=1;

k|=0x8000 ;

}

}

w=0;/*

for(i=(m+17);i<( 27+m);i++)

{

if(total[i]>18 && total[i]<25)

w>>=1 ;

if(total[i]>39 && total[i]<45)

{

w>>=1;

w|=0x8000;

}

}

w>>=6;

printf("K=0x% X total[1]=%d w=0x%x\r\n",k,total[1],w); */

s=0;

for( i=(m+17);i<(25+m);i++

)

{

if(total[i]>18 && total[i]<25)

s>>=1;

if(total[i]>39 && total[i]<45)

{

s>>=1;

s|=0x80 ;

}

}

r=0;

for(i=(m+25);i<(33+ m);i++)

{

if(total[i]>18 && total[i]<25)

r>>=1;

if(total[i]>39 && total[i]<45)

{

r>>=1;

r|=0x80;

}

}

t=255-r;

n=0;

if(t==s)

{

printf("s=ox%x, r=0x%x, t=0x%x\r\n", s,r,t);

tp1=12;

interruptor(es)

{

caso 0x43:

n=0x12;

ruptura;

caso 0x47:

n=0x16;

ruptura;

caso 0x42:

n=0x01;

ruptura;

caso 0x41:

n=0x02;

ruptura;

caso 0x40:

n=0x03;

ruptura;

caso 0x46:

n=0x04;

ruptura;

caso 0x45:

n=0x05;

ruptura;

caso 0x44:

n=0x06;

ruptura;

caso 0x4a:

n=0x07;

ruptura;

caso 0x49:

n=0x08;

ruptura;

caso 0x48:

n=0x09;

ruptura;

caso 0x4e:

n=0;

ruptura;

caso 0x4d:

n=0x0;

ruptura;

caso 0x4c:

n=0x1a;

ruptura;

caso 0x14:

n=0x13;

ruptura;

caso 0

x16:

n=0x17;

ruptura;

caso 0x1d:

n=0x14;

descanso;

caso 0x11:

n=0x10;

descanso;

caso 0x15:

n =0x0e;

descanso

}

}

}

}

#pragma interrupt_handler int0_isr:iv_INT0

void int0_isr(void)

{

if(temp==56)

{

if(count>240)

{

total[0]=count;

count=0;

temp=57;

mm=1;

}

}

más

{

total[mm]=cuenta;

cuenta=0;

mm++;

si(mm>34)

{

CLI();

display();

temp=0;

mm=0;

CLI();

all_zero();

}

}

}

//TIMER1 inicializar - preescala:8

// WGM: 0) Normal, TOP=0xFFFF

// valor deseado: 50uSeg

// real valor: 50.000uSeg (0.0%)

void timer1_init(void)

{

TCCR1B = 0x00 //detener

TCNT1H; = 0xFF; //configuración

TCNT1L = 0xCE;

OCR1AH ​​​​= 0x00;

OCR1AL = 0x32;

OCR1BH = 0x00;

OCR1BL = 0x32;

ICR1H = 0x00;

ICR1L = 0x32;

TCCR1B = 0x02; //iniciar temporizador

}

#pragma interrupt_handler timer1_ovf_isr:iv_TIM1_OVF

void timer1_ovf_isr(void)

{

//TIMER1 se ha desbordado

TCNT1H = 0xFF; //recarga el valor alto del contador

TCNT1L = 0xCE //recarga el valor bajo del contador

p>

completo++;

}

//

Inicializar TIMER2 - preescala:8

// WGM: Normal

// valor deseado: 108uSec

// valor real: 108.000uSec (0.0%)

void timer2_init(void)

{

TCCR2 = 0x00; //detener

ASSR = 0x00; /p>

TCNT2 = 0x94; //configuración

OCR2 = 0x6C;

TCCR2 = 0x02; //inicio

}

#pragma interrupt_handler timer2_ovf_isr:iv_TIM2_OVF

void timer2_ovf_isr(void)

{

TCNT2 = 0x94 //recargar valor del contador

all++;

}

//llama a esta rutina para inicializar todos los periféricos

void init_devices(void)

{

//detiene las interrupciones erróneas hasta que se configuran

CLI(); //deshabilita todas las interrupciones

port_init();

//watchdog_init ();

timer0_init();

uart0_init();

MCUCR = 0x02;

GICR = 0x40;

TIMSK = 0x45; //fuentes de interrupción del temporizador

SEI(); //reactivar interrupciones

//todos los periféricos ahora están inicializados

}

void full_delay(unsigned long b)

{

full=0;

timer1_init();

mientras(1)

{

si(full>=b)

{

completo=0; p>

TCCR1B = 0x00; //detener el temporizador1

pausa;

}

}

}

void timer2_delay(uint b)

{

while(1)

{

if(all>( b- 1))

{

all=0;

TCCR2 = 0x00; //detener el temporizador2

pausa;

}

}

}

void zero_one(uint a)

{

uint b ;

if(!a)

{

pluse_hi;

b=69

6/50;

full_delay(b);

pluse_low;

b=348/50;

full_delay(b);

}

más

{

pluse_hi;

b=696/50;

full_delay(b);

pluse_low;

b=1409/50;

full_delay(b);

}

}

proceso nulo(uchar ak)

{

uint b,m,i,a,k;

uchar ok;

SEI();

TCCR1B = 0x00; //detener temporizador1

full=0;

all=0;

pluse_hi;

b=8344/50;

timer2_init();

full_delay(b);

pluse_low;

b=3915/50;

full_delay(b);

m=0x611c;

for(i=0;i<16;i++)

{

a=m & 0x0001;

zero_one(a);

m>>=1;

}

m=0x3dc;

for(i=0;i<10;i++)

{

a=m & 0x0001;

zero_one(a);

m>>=1;

}

ok=255-ak;

k=ok;

k<<=8;

k|=ak ;

m=k;

//printf("k=%x\r\n",k);

for(i=0; i<16;i++)

{

a=m & 0x0001;

zero_one(a);

m>>= 1;

}

pluse_hi;

b=696/50;

full_delay(b);

pluse_low;

timer2_delay(978);

pluse_hi;

b=8344/50;

full_delay(b); /p>

pluse_low;

b=3915/50;

full_delay(b);

pluse_hi;

b =696/50;

full_delay(b);

pluse_low;

mientras(!press)

{

;

}

CLI();

}

void main(void)

{

uint a,b,m;

uint k,msg;

init_devices();

delay_10us(1000);

printf("count1=%d\r\n",count);

timer0_ovf_isr ();

CLI();

b=0;

m=0;

pluse_low;

tp1=0;

mientras(1)

{

if(!ir && temp==0 && a==12)

{

a=0;

inicialize_eeprom();

temp=56;

count=0;

mm=0;

TCCR2 = 0x00; //detener TIMER2

TCCR1B = 0x00; //detener temporizador1

//printf ("game_start\r\n");

SEI();

}

if(tp1==12)

{

printf("n=%x\r\n",n);

proceso(n);

all_zero();

CLI();

tp1=0;

}

if(ir)

a=12;

k++;

if(k>30000)

{

msg++;

k=0;

}

if(!ir)

{

msg=0;

}

if( msg>10)

{

all_zero();

msg=0;

temp=0;

CLI();

printf("tiempo de espera\r\n");

}

if(!press )

{

proceso(0x08);

}

}

}