一、红外线基本知识
红外线为保密通信
二、红外遥控系统结构
三、硬件电路:
为什么要有载波:
四、红外基带信号除数协议
五、引导码:
六、客户码和操作码
七、例子
八、程序
#include <reg52.h>
#include "UART.h"
unsigned char i = 0;
unsigned char j = 0;
unsigned char irtime = 0;
unsigned char irdate[33] = 0;
bit start_flag = 0;
unsigned char bitnum = 0;
unsigned char irok = 0;
unsigned char irnum[4];
bit long_press = 0;
void timer0_init()
{
EA = 1;
TMOD |= 0x02;//设定定时器工作在方式二,8位定时器,12M,256us
TH0 = 0;
ET0 = 1;//打开定时器中断
TR0 = 1;//打开定时器
}
void init0_init()
{
EA = 1;
IT0|= 1; //设置中断为下降沿触发
EX0 = 1;//打开外部中断
}
void timer0_isr() interrupt 1
{
irtime++;
}
void init0_isr() interrupt 0
{
if(start_flag)
{
if((irtime > 45) && (irtime < 60))
{
bitnum = 0;
}
irdate[bitnum] = irtime;
bitnum++;
irtime = 0;
if(33 == bitnum)
{
bitnum = 0;
irok = 1;
}
}
else
{
irtime = 0;
start_flag = 1;
}
}
void ir_process()
{
unsigned char k = 1;
unsigned char temp;
for(i = 0; i < 4; i++)
{
for(j = 0; j < 8; j++)
{
temp >>= 1;
if(irdate[k] > 6)
{
temp +=0x80;
}
k++;
}
irnum[i] = temp;
}
}
unsigned char return_choose(unsigned char num)
{
switch(num)
{
case 0x45: return 1; break;
case 0x46: return 2; break;
case 0x47: return 3; break;
case 0x44: return 4; break;
case 0x40: return 5; break;
case 0x43: return 6; break;
case 0x07: return 7; break;
case 0x15: return 8; break;
case 0x09: return 9; break;
case 0x16: return 10; break;
case 0x19: return 11; break;
case 0x0D: return 12; break;
case 0x0C: return 13; break;
case 0x18: return 14; break;
case 0x5E: return 15; break;
case 0x08: return 16; break;
case 0x1C: return 17; break;
case 0x5A: return 18; break;
case 0x42: return 19; break;
case 0x52: return 20; break;
case 0x4A: return 21; break;
default: break;
}
return 0;
}
void main()
{
unsigned char choose;
timer0_init();
init0_init();
uart_init();
while(1)
{
if(irok)
{
ir_process();
if((irnum[0] + irnum[1] == 0xff) && (irnum[2] + irnum[3] == 0xff))
{
choose = return_choose(irnum[2]);
if(choose < 10)
{
uart_send_char(choose + 0x30);
uart_send_char('\n');
}
else
{
uart_send_char(choose/10 + 0x30);
uart_send_char(choose%10 + 0x30);
uart_send_char('\n');
}
}
for(i = 0 ; i < 33; i++)
{
if(irdate[i]>40)
{
j++;
}
}
/*检测长按*/
if(j > 10)
{
uart_send_str("long press\n");
j = 0;
}
irok = 0;
}
}
}