一.TC9012
TC9012是一块红外遥控系统专用的发射集成电路.可以外接32个按键.提供8种用户编码,3种双重按键功能.下图片是一块TC9012及其内部结构. 二.编码方式 TC9012一帧含32位码,包含两个8位用户码,8个数据码和8位数据码的反码以及最后位的同步位. 引导码由4.5ms的载波和4.5ms的载波关断波形所构成.同步位SY是最后一位编码是0或1的标识位.它只有0.56ms.发射码的格式如下:
三.脉冲位置调制方式 这种方式是通过脉冲之间的间隔时间来判断发送的是0还是1 .如下图片所示
则红外发射端输出的波形即如下图
四.红外译码程式
红外接受端接在P3^4外部终端0引脚.程式如下:
#include<reg52.c>
#define uchar unsigned char
#define uint unsigned int
uchar irtime,startflag; //记录中断时间间隔长,和开始标志
uchar irdata[33],bitnum; //存认33个外部中断时间
uchar irreceok; //接收成功标志
uchar ircode[4]; //用于存储解码后的四个值
void temer0init() //计时器初始化
{
TMOD=0x02;
TH0=0x00;
TL0=0x00;
ET0=1;
EA=1;
TR0=1;
}
void int0init() //外部中断0初始化
{
IT0=1;
EX0=1;
EA=1;
} void irpros() //根据记录的中断间隔时长解码
{
uchar k,j,value;
k:=1;
for(j=0;j<4;j++) //解码成四个字节
{
for(i=0;i<8;i++)
{
value=value>>1; if (irdata[k]>6) //间隔时间》6的表示为1.否则为0
value=value|0x80;
k++;
}
ircode[j]=value; //记录解码后的数据。
}
} void main()
{
temer0init()
int0init()
while(1)
{ 这里处理收来的数据; }
}
void timer0() interrupt 1 //计时器中断服务程序,记录红外中断时长
{
irtime++; //255
} void int0() interrupt 0 //外部中断0服务程序
{
if(startflag) //起始标志
{
if (irtime>32) //检测引导码,
bitnum=0;
irdata[bitnum]=irtime; //记录没个下降沿的间隔时间长
irtime=0;
bitnum++;
if (bitnum==33) //最后一个
{
bitnum=0;
irreceok=1; //标志收完了
}
}
}
else //如果没有起始标志.这认为这个脉冲是引导码,开始计数收数据.
{
startflag=1;
irtime=0;
}
}
|