一.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;
}
}
|