值得擁有的資料
是來自平時學(xué)習(xí)積累總結(jié)的
有問題的地方肯定有的
還請大家批評指正!
紅外線信號的傳輸基于MCU的調(diào)制與解調(diào)的研究
摘要:本研究方案由發(fā)射和接收兩大部分組成
都是基于MCU實現(xiàn)軟件對紅外線信號調(diào)制與解調(diào)
為紅外線非定向應(yīng)用奠定研究基礎(chǔ)
關(guān) 鍵 詞:uPD6121G;紅外線發(fā)射/編碼與接收/解碼;
Research MCU-based infrared signal transmission
modulation and demodulation
LUOKai,HOUJian
Abstract:The program consists of transmitting and receiving two major components, are software-based MCU to achieve infrared signal modulation and demodulation.
Keywords:uPD6121G;Infrared remote launch/encoding/decoding and receiving
1 引 言
紅外線是近距離、高速無線通信的一種手段
一直以來
紅外遙控、遙測技術(shù)在玩具、家電制造及工業(yè)測控等領(lǐng)域得到了廣泛的應(yīng)用、室內(nèi)通信的手段
紅外線具有無線電無法比擬的優(yōu)勢
以前的紅外線遙控系統(tǒng)以定向發(fā)射、接收為主流應(yīng)用
因此一般為單用戶系統(tǒng)
隨著非方向性發(fā)射、接收
構(gòu)成系統(tǒng)成為了可能
之前紅外線信號都是采用固定的編碼芯片和解碼芯片實現(xiàn)對紅外線的編碼的調(diào)制與解調(diào)
這樣的信號無法隨用戶的需求或構(gòu)成真正意義上的系統(tǒng)的要求變化
因此本研究方案即是:通過基于MCU及外圍器件為基礎(chǔ)
實現(xiàn)用軟件的方式對紅外線進行調(diào)制與解調(diào)的
這樣可以更好的控制紅外線信號
使設(shè)計者設(shè)計出更多與紅外線有關(guān)的無線段距離通信電路
2 系統(tǒng)研究方案
2.1系統(tǒng)總體方案
紅外系統(tǒng)由發(fā)射和接收兩大部分組成
應(yīng)用編/解碼專用集成電路芯片來進行控制操作
如圖1所示
發(fā)射部分包括鍵盤矩陣、編碼調(diào)制、紅外發(fā)送器;接收部分包括光、電轉(zhuǎn)換放大器、解調(diào)、解碼電路
圖1 紅外線遙控系統(tǒng)結(jié)構(gòu)圖
2.2紅外線調(diào)制與解調(diào)的介紹
紅外線調(diào)制與解調(diào)原理
發(fā)射器專用芯片很多
根據(jù)編碼格式可以分成兩大類
這里我們以運用比較廣泛
解碼比較容易的一類來加以說明
現(xiàn)以日本NEC的uPD6121G組成發(fā)射電路為例說明編碼與解碼原理
當發(fā)射器按鍵按下后
即有遙控碼發(fā)出
所按的鍵不同遙控編碼不同
對應(yīng)的解碼也就不同
這種遙控碼具有以下特征:
采用脈寬調(diào)制的串行碼
以脈寬為0.565ms、間隔0.56ms、周期為1.125ms的組合表示二進制的"0";以脈寬為0.565ms、間隔1.685ms、周期為2.25ms的組合表示二進制的"1"
其波形如圖2所示
圖2 遙控碼的"0"和"1" (注:所有波形為接收端的與發(fā)射相反)
上述"0"和"1"組成的32位二進制碼經(jīng)38kHz的載頻進行二次調(diào)制以提高發(fā)射效率
達到降低電源功耗的目的
然后再通過紅外發(fā)射二極管產(chǎn)生紅外線向空間發(fā)射
如圖3所示
圖3 遙控信號編碼波形圖
UPD6121G產(chǎn)生的遙控編碼是連續(xù)的32位二進制碼組
其中前16位為用戶識別碼
能區(qū)別不同的電器設(shè)備
防止不同機種遙控碼互相干擾
該芯片的用戶識別碼固定為十六進制01H;后16位為8位操作碼(功能碼)及其反碼
UPD6121G最多額128種不同組合的編碼
遙控器在按鍵按下后
周期性地發(fā)出同一種32位二進制碼
周期約為108ms
一組碼本身的持續(xù)時間隨它包含的二進制"0"和"1"的個數(shù)不同而不同
大約在45~63ms之間
圖4為發(fā)射波形圖
圖4 遙控連發(fā)信號波形
當一個鍵按下超過36ms
振蕩器使芯片激活
將發(fā)射一組108ms的編碼脈沖,這108ms發(fā)射代碼由一個起始碼(9ms),一個結(jié)果碼(4.5ms),低8位地址碼(9ms~18ms),高8位地址碼(9ms~18ms),8位數(shù)據(jù)碼(9ms~18ms)和這8位數(shù)據(jù)的反碼(9ms~18ms)組成
如果鍵按下超過108ms仍未松開
接下來發(fā)射的代碼(連發(fā)代碼)將僅由起始碼(9ms)和結(jié)束碼(2.5ms)組成
圖5 引導(dǎo)碼 圖6連發(fā)碼
代碼格式(以接收代碼為準
接收代碼與發(fā)射代碼反向)
①位定義
②單發(fā)代碼格式
③連發(fā)代碼格式 注:代碼寬度算法:
16位地址碼的最短寬度:1.12×16=18ms
16位地址碼的最長寬度:2.24ms×16=36ms
易知8位數(shù)據(jù)代碼及其8位反代碼的寬度和不變:
(1.12ms+2.24ms)×8=27ms
∴32位代碼的寬度為(18ms+27ms)~(36ms+27ms) 1. 解碼的關(guān)鍵是如何識別"0"和"1"
從位的定義我們可以發(fā)現(xiàn)"0"、"1"均以0.56ms的低電平開始
不同的是高電平的寬度不同
"0"為0.56ms,"1"為1.68ms,所以必須根據(jù)高電平的寬度區(qū)別"0"和"1"
如果從0.56ms低電平過后
開始延時
0.56ms以后
若讀到的電平為低
說明該位為"0"
反之則為"1"
為了可靠起見
延時必須比0.56ms長些
但又不能超過1.12ms,否則如果該位為"0"
讀到的已是下一位的高電平
因此取(1.12ms+0.56ms)/2=0.84ms最為可靠
一般取0.84ms左右均可
根據(jù)碼的格式
應(yīng)該等待9ms的起始碼和4.5ms的結(jié)果碼完成后才能讀碼
2.2.1紅外線調(diào)制的硬件實現(xiàn)
發(fā)射部分包括單片機最小系統(tǒng)、鍵盤矩陣、555紅外發(fā)射電路
他們一起構(gòu)成了紅外線獨立發(fā)射電路
如圖7所示
"0"和"1"組成的32位二進制碼經(jīng)555芯片電路產(chǎn)生的38kHz的載頻進行二次調(diào)制以提高發(fā)射效率
達到降低電源功耗的目的
然后再通過紅外發(fā)射二極管產(chǎn)生紅外線向接收端發(fā)射信號
圖7 紅外線獨立發(fā)射電路
2.2.2紅外線調(diào)制的軟件實現(xiàn)
通過定時器的方式對紅外數(shù)據(jù)進行軟件編碼
再調(diào)制到載波發(fā)送出去
//本程序?qū)?yīng)11.0592M晶振//
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit IR=P1^6; //定義發(fā)射端口
sbit speak=P1^1;
bit flag,f2,f4,f8,f16,f32;
uchar irtime=0,key; //定義計時變量、鍵盤取值變量
void delay(uint ms) // 毫秒級延時(AT89C52 @ 11.0592MHz)
{
uint ti;
while(ms--)
{
for(ti=0;ti<112;ti++){}//112
}
}
/*******************定時器0方式2初始化函數(shù)***************/
void initT0()
{
TMOD=0x02; //方式2
TF0=0; //清溢出標志
ET0=1; //使能定時器0中斷
TH0=0; //賦初值
TL0=0;
EA=1; //開總中斷
// TR0=1; //啟動定時
}
/********************定時器0中斷服務(wù)函數(shù)****************/
void Timer0() interrupt 1 using 1
{
irtime++; //中斷計數(shù)
switch(irtime)
{
case 2:f2=1;break; //高0.56ms標志位
case 4:f4=1;break; //低0.56ms標志位
case 8:f8=1;break; //地1.68ms標志位
case 16:f16=1;break; //高4.5ms標志位
case 32:f32=1;break; //低4.5ms標志位
}
}
/*********************鍵盤掃描函數(shù)*********************/
//uchar void keyscan(void) //鍵盤掃描函數(shù)
使用行列反轉(zhuǎn)掃描法
void keyscan()
{
/*
uchar cord_h,cord_l; //行列值中間變量
P3=0x0f; //行線輸出全為0
cord_h=P3&0x0f; //讀入列線值
if(cord_h!=0x0f) //先檢測有無按鍵按下
{
delay(400); //去抖
if(cord_h!=0x0f)
{
cord_h=P3&0x0f; //讀入列線值
P3=cord_h|0xf0; //輸出當前列線值
cord_l=P3&0xf0; //讀入行線值
return(cord_h+cord_l); //鍵盤最后組合碼值
}
}return(0xff); //返回該值 */
key=0xeb;
flag=1; //得到按鍵值就置標志位
}
/*********************引導(dǎo)碼發(fā)送函數(shù)*******************/
void sendstart()
{
IR=1;
while(!f16);IR=0;f16=0; //高電平4.5ms
while(!f32);IR=1;irtime=0;f32=0; //低電平4.5ms
f2=0; //清零標志位
f4=0;
f8=0;
}
/*******************8位數(shù)據(jù)發(fā)送函數(shù)********************/
void sendnum(uchar t)
{
uchar b=0,i;
// t=key;
for(i=0;i<8;i++) //發(fā)送8位數(shù)據(jù)
{
b=t&0x01; //取出地i位
t=t>>1;
if(b==0) //為1時發(fā)送
{
IR=1;
while(!f2);IR=0;f2=0; //等待時間 完成 0.56ms
while(!f4);IR=1;irtime=0;f4=0; //0.56ms
}
else //為0時發(fā)送
{
IR=1;
while(!f2);IR=0;f2=0; //等待時間完成0.56ms
while(!f8);irtime=0;IR=1;f8=0; //1.68ms
f4=0; //清標志
}
}
}
/*********************終止碼發(fā)送函數(shù)*******************/
/*void sendend() //終止碼自由定義
{
sendnum(0x0f);
} */
/*******************16位客戶地址碼發(fā)送函數(shù)********************/
void sendadd() //客戶地址碼自由定義
{
sendnum(0xfb);
sendnum(0xed);
}
/*********************編碼發(fā)送函數(shù)********************/
void send()
{
TR0=1; //啟動定時
while(flag)
{
sendstart(); //發(fā)送起始碼
sendadd(); //發(fā)送客戶地址碼
sendnum(key); //發(fā)送數(shù)據(jù)碼
sendnum(~key); //發(fā)送數(shù)據(jù)反碼
//sendend(); //發(fā)送終止碼
irtime=0;
flag=!flag;
}
TR0=0; //關(guān)閉定時
}
/*********************主函數(shù)**********************/
void main()
{
IR=0;
// P1=0; //復(fù)位后賦初值
initT0(); //調(diào)用定時器0初始化函數(shù)
while(1) //進入循環(huán)
實時監(jiān)控
{
keyscan(); //調(diào)用鍵盤掃描函數(shù)
send(); //調(diào)用編碼發(fā)射函數(shù)
}
}
2..2.3紅外線解調(diào)的硬件實現(xiàn)
一體化紅外線接收器是一種集紅外線接收和放大于一體
不需要任何外接元件
就能完成從紅外線接收到輸出與TTL電平信號兼容的所有工作
而體積和普通的塑封三極管大小一樣
它適合于各種紅外線遙控和紅外線數(shù)據(jù)傳輸
它主要包括了收部分包括光、電轉(zhuǎn)換放大器、解調(diào)、解碼電路
如圖8所示
圖8 紅外線接收電路
2.2.4紅外線解調(diào)的軟件實現(xiàn)
這是一個用紅外線控制數(shù)碼管顯示的樣例 (部分C程序)
.
void Ir_work(void)//紅外鍵值散轉(zhuǎn)程序
{
switch(IRcord[2])//判斷第三個數(shù)碼值
{
case fe:P1=0xfe;break;//1 顯示相應(yīng)的按鍵值
case fd:P1=0xfd;break;//2
case fb:P1=0xfb;break;//3
case f7:P1=0xf7;break;//4
case ef:P1=0xef;break;//5
case df:P1=0xdf;break;//6
case bf:P1=0xbf;break;//7
case 7f:P1=0x7f;break;//8
}
irpro_ok=0;//處理完成標志
}
/*****************************************************************/
void Ircordpro(void)//紅外碼值處理函數(shù)
{
unsigned char i, j, k;
unsigned char cord,value;
k=1;
for(i=0;i<4;i++)//處理4個字節(jié)
{
for(j=1;j<=8;j++) //處理1個字節(jié)8位
{
cord=irdata[k];
if(cord>7)//大于某值為1
{
value=value|0x80;
}
else
{
value=value;
}
if(j<8)
{
value=value>>1;
}
k++;
}
IRcord=value;
value=0;
} irpro_ok=1;//處理完畢標志位置1
}
void main(void)
{
EX0init(); // Enable Global Interrupt Flag
TIM0init();//初始化定時器0
P2=0x00;//1位數(shù)碼管全部顯示
while(1)//主循環(huán)
{
if(irok)
{
Ircordpro();//碼值處理
irok=0;
}
if(irpro_ok)//step press key
{
Ir_work();//碼值識別散轉(zhuǎn)
}
}
}
3 總結(jié)
單片機控制的紅外線通信系統(tǒng)具有硬件簡單、成本低廉、編程方便、通信可靠性高的特點
實現(xiàn)了通信雙方非接觸式的數(shù)據(jù)傳送
這種方案也可用于其它遙控、遙測應(yīng)用場合
實際應(yīng)用證明,該系統(tǒng)具有很好的適用性、擴展性與靈活性,能滿足大部分紅外傳輸系統(tǒng)的要求
參 考 文 獻
[1]張毅剛.單片機原理與應(yīng)用設(shè)計.電子工業(yè)出版社,2008:32-42
[2]郭天祥.新編51單片機C語言教程.電子工業(yè)出版社,2009.56-78
[3]張?zhí)旆?51單片機C語言開發(fā)詳解.電子工業(yè)出版社,2008.112-148
|