#include <reg52.h>
#include "1602.h"
#include "delay.h"
sbit IR = P3^2;
unsigned int irtime;
bit startflag;
bit irok,irpro_ok;
bit irhandleok = 0;
sbit LED0 = P1^0;
sbit LED1 = P1^1;
sbit LED2 = P1^2;
sbit LED3 = P1^3;
sbit LED4 = P1^4;
sbit LED5 = P1^5;
sbit LED6 = P1^6;
sbit LED7 = P1^7;
void uart_init();
void int0_init();
void timer0_init();
void uart_send_byte(unsigned char byte);
void uart_send_str(unsigned char *str);
void data_handle(void);
unsigned char ircode[4];
unsigned
void int0_init()
{
IT0 = 1;//下降沿触发
EA = 1;
EX0 = 1;
}
void timer0_init()
{
EA = 1;
TMOD |= 0x02;
TH0 = 0;
ET0 = 1;
TR0 = 1;
}
void timer0_isr() interrupt 1
{
irtime++;//0.256ms 13.5 /0.256 = 53; 2.245/0.256 = 9 ;1.12/0.256 = 4
}
unsigned char irdata[33];
unsigned char bitnum = 0;
void int0_isr() interrupt 0
{
if(startflag)
{
if((irtime > 40) && (irtime < 60))
{
bitnum = 0;
}
irdata[bitnum] = irtime ;
bitnum++;
irtime = 0;
if (bitnum == 33)
{
bitnum = 0;
irok = 1;
startflag = 0;
}
}
else
{
irtime = 0;
startflag = 1;
}
}
void uart_init()
{
SCON = 0x50;//串口用作 //SM0 = 0; SM1 = 1; REN = 1;
TMOD |= 0x20;//设置定时器1为工作方式2
TH1 = 0xfd;// ET1 = 1;//打开定时器中断允许
TR1 = 1;//打开定时器
}
void uart_send_byte(unsigned char byte)
{
SBUF = byte; //TI位自动置1,手动清0
while(!TI);//while(TI != 1);
TI = 0;
}
void uart_send_str(unsigned char *str)
{
while( *str != '\0')
{
uart_send_byte(*str);
str++;
}
}
unsigned char putbuf[35];
void main()
{
unsigned char i ;
int0_init();
uart_init();
timer0_init();
LCD_Init();
LCD_Clear();
while(1)
{
/*if(irok == 1)
{
putbuf[0] = irdata[0] / 10 + 0x30;
putbuf[1] = irdata[0] % 10 +0x30;
for(i = 0; i < 32 ;i++)
{
putbuf[i+2] = irdata[i+1] + 0x30;
}
for(i = 2 ;i < 35;i++)
{
if(putbuf[i] > (6 + '0'))
{
putbuf[i] = 1 + '0';
}
else
{
putbuf[i] = 0 + '0';
}
}
putbuf[34] = '\0';
uart_send_str(putbuf);
uart_send_str("\r\n");
irok = 0;
}*/
data_handle();
if(irok)
{
if(irhandleok)
{
/*if(ircode[2])
{
switch(ircode[2])
{
case 0x45 :LED0 = ~LED0;break;
case 0x46 :LED1 = ~LED1;break;
case 0x47 :LED2 = ~LED2;break;
case 0x44 :LED3 = ~LED3;break;
case 0x40 :LED4 = ~LED4;break;
case 0x43 :LED5 = ~LED5;break;
case 0x07 :LED6 = ~LED6;break;
case 0x15 :LED7 = ~LED7;break;
}
}*/
/* if(ircode[2])
{
switch(ircode[2])
{
case 0x45 :LCD_Write_Char(0,0,'1');break;
case 0x46 :LCD_Write_Char(0,0,'2');break;
case 0x47 :LCD_Write_Char(0,0,'3');break;
case 0x44 :LCD_Write_Char(0,0,'4');break;
case 0x40 :LCD_Write_Char(0,0,'1');break;
case 0x43 :LED5 = ~LED5;break;
case 0x07 :LED6 = ~LED6;break;
case 0x15 :LED7 = ~LED7;break;
}
}*/
putbuf[0] = (ircode[0] / 16) > 9 ? (ircode[0] / 16 +0x37) :(ircode[0] / 16 +0x30);
putbuf[1] = (ircode[0] % 16) > 9 ? (ircode[0] % 16 +0x37) :(ircode[0] % 16 +0x30);
putbuf[2] = (ircode[1] / 16) > 9 ? (ircode[1] / 16 +0x37) :(ircode[1] / 16 +0x30);
putbuf[3] = (ircode[1] % 16) > 9 ? (ircode[1] % 16 +0x37) :(ircode[1] % 16 +0x30);
putbuf[4] = (ircode[2] / 16) > 9 ? (ircode[2] / 16 +0x37) :(ircode[2] / 16 +0x30);
putbuf[5] = (ircode[2] % 16) > 9 ? (ircode[2] % 16 +0x37) :(ircode[2] % 16 +0x30);
putbuf[6] = (ircode[3] / 16) > 9 ? (ircode[3] / 16 +0x37) :(ircode[3] / 16 +0x30);
putbuf[7] = (ircode[3] % 16) > 9 ? (ircode[3] % 16 +0x37) :(ircode[3] % 16 +0x30);
putbuf[8] = '\r';
putbuf[9] = '\n';
uart_send_str(putbuf);
irhandleok = 0;
}
irok = 0;
}
}
}
/*unsigned char irnum[4];
void change_16(void)
{
unsigned char i,j,k;
unsigned code = 0;
k = 1;
for(i = 0;i < 4;i++)
{
for(j = 0;j < 8;j++)
{
code = irdata[k];
if(code > 6)
{
code |= 0x80;
}
if(j < 8)
{
code >>= 1;
}
}
}
}*/
void data_handle(void)
{
unsigned char i ,j,k;
unsigned char temp = 0;
k = 1;
if(irok)
{
for(i = 0;i < 4;i++)
{
for(j = 0;j < 8;j++)
{
temp >>= 1;
if(irdata[k] > 6)
{
temp |= 0x80;
}
k++;
ircode[i] = temp;
}
}
if( (ircode[0]+ ircode[1] == 0xff) && (ircode[2] + ircode[3] == 0xff))
irhandleok = 1;
irok = 0;
}
}
红外解码
最新推荐文章于 2024-07-28 09:21:20 发布