A. 單片機控制紅外遙控編碼解碼中定時器和外部中斷的作用是什麼紅外遙控編碼解碼的大致步驟是什麼
同時使用上定時器 跟 外中斷 的紅外程序,只有解碼程序。而且該方式,只能解析 使用不同時間長度代表數據「0」、「1」 的波形(如數據『1』的時間長度 2倍於數據『0』的時間)。
解析原理:外部中斷接 紅外輸入,當有 紅外信號的時候,該引腳會有波形輸入(N多下降沿),觸發外部中斷,通過記錄 每2次中斷的時間間隔,可以判斷此段時間對應的數據(0/1)。一般「數據」長度為32位數據
注意點:
①初次產生外中斷的時候,並無 時間記錄,不需要進行時間判斷;
②第二次中斷與第一次中斷 之間 的時間,是 紅外的引導碼,該時間一般多倍於數據時間(一般為ms級時間);
③第三次中斷與第二次中斷的時間,即為 第一個數據 的時間;
④第34次中斷與第33次中斷的時間間隔,即為 第32個數據的時間;
⑤後面 可能存在 停止位,是否存在,由遙控器決定;不過,一般都直接忽略該位,除非該位是由自己製作的遙控器 發出 的校驗位;
⑥後面 可能存在 連發碼,是否存在,由遙控器決定;
另外:一般紅外數據的每個位元組都是LSB在前,MSB在後的( 低位先發,高位後發)
軟體要處理以下情況:
①干擾的處理,有些紅外接收頭不僅僅對38KHz頻率光有反應,可能對人體紅外、日光燈紅外一樣有反應,那就存在干擾。如果它只產生一次干擾,就會使系統卡在引導碼接收階段;
②引導碼時間過短、過長 的處理;
③接收數據位數不足的處理;
④完成32位數據接收後,處理接收爛尾:後面不會有中斷(如果需接收停止位、連發碼,就增加對應數據長度),需要停止計時。
⑤進行數據校對,一般第一位元組跟第二位元組互為反碼,第三位元組跟第四位元組互為反碼,而且第一位元組 代表 一個地址、一個密碼,只有地址、密碼正確,才能算合法的操作。
B. 紅外遙控器原理 遙控器原理圖
遙控器是一種用來遠控機械的裝置。現代的遙控器,主要是由集成電路電板和用來產生不同訊息的按鈕所組成。下面一起來看看紅外遙控器原理以及遙控器原理圖吧。
紅外遙控器原理
紅外線遙控系統一般由發射器和接收器兩部分組成。發射器由指令鍵、指令信號產生電路、調制電路、驅動電路及紅外線發射器組成。當指令鍵被按下時,指令信號產生電路便產生所需要的控制信號,控制指令信號經調制電路調制後,最終由驅動電路驅動紅外線發射器,發出紅外線遙控指令信號。
接收器由紅外線接收器件、前置放大電路、解調電路、指令信號檢出電路、記憶及驅動電路、執行電路組成。當紅外接收器件收到發射器的紅外指令信號時,它將紅外光信號變成電信號並送到前置放大電路進行放大,再經過解調器後,由信號檢出電路將指令信號檢出,最後由記憶電路和驅動電路驅動執行電路,實現各種操作。
控制信號一般以某些不同的特徵來區分,常用的區分指令信號的特徵是頻率和碼組特徵,即用不同的頻率或者編碼的電信號代表不同的指令信號來實現遙控。所以紅外遙控系統通常按照產生和區分控制指令信號的方式和特徵分類,常分為頻分制紅外線遙控和碼分制紅外線遙控。
1紅外遙控系統發射部分
紅外遙控發射器由鍵盤矩陣、遙控專用集成電路、驅動電路和紅外發光二極體三部分組成,結構如圖1所示。
當有鍵按下時,系統延時一段時間防止干擾,然後啟動振盪器,鍵編碼器取得鍵碼後從ROM中取得相應的指令代碼(由0和1組成的代碼),遙控器一般採用電池供電,為了節省電量和提高抗干擾能力,指令代碼都是經32~56kHz范圍內的載波調制後輸出到放大電路,驅動紅外發射管發射出940nm的紅外光。當發送結束時振盪器也關閉,系統處於低功耗休眠狀態。載波的頻率、調制頻率在不同的場合會有不同,不過家用電器多採用的是38kHz的,也就是用455kHz的振盪器經過12分頻得到的。
遙控發射器的信號是由一串0和1的二進制代碼組成的,不同的晶元對0和1的編碼有所不同,現有的紅外遙控包括兩種方式:脈沖寬度調制(PWW)和脈沖位置調制(PPM或曼徹斯特編碼)。兩種形式編碼的代表分別是NEC和PHILIPS的RC-5。
2紅外遙控系統接收部分
接收部分是由放大器、限幅器、帶通濾波器、解調器、積分器、比較器等組成的,比如採用較早的紅外接收二極體加專用的紅外處理電路的方法,如CXA20106,此種方法電路復雜,現在一般不採用。但是在實際應用中,以上所有的電路都集成在一個電路中,也就是我們常說的一體化紅外接收頭。一體化紅外接收頭按載波頻率的不同,型號也不一樣。由於與CPU的介面的問題,大部分接收電路都是反碼輸出,也就是說當沒有紅外信號時輸出為1,有信號輸出時為0,它只有三個引腳,分別是+5V電源、地、信號輸出。
系統的設計
1單片機編碼發射部分
①鍵盤部分
紅外遙控器的發射器電路比較簡單,由一個4×4矩形鍵盤、一個PNP驅動三極體、一個紅外線發光二極體和兩個限流電阻組成。要遙控哪台接收器由鍵盤輸入,即由鍵盤輸入要紅外遙控的地址,地址經過編碼、調制後通過紅外發光二極體發射出去。
矩陣鍵盤部分由16個輕觸按鍵按照4行4列排列,將行線所接的單片機的I/O口作為輸出端,而列線所接的作為輸入。當沒有鍵被按下時,所有輸出端都是高電平,代表沒有鍵按下。有鍵按下時,則輸入線就會被拉抵,這樣,通過讀入輸入線的狀態就可以知道是否有鍵被按下。
鍵盤的列線接到P1口的低4位,行線接到P1口的高4位,列線P1.0~P1.3設置為輸入線,行線P1.4~P1.7設置為輸出線。
檢測當前是否有鍵被按下。檢測的方法是使P1.4~P1.7輸出為0,讀取P1.0~P1.3的狀態,若P1.0~P1.3為全1,則無鍵閉合,否則有鍵閉合。
去除鍵抖動。當檢測到有鍵按下後,延時一段時間再做下一步檢測判斷。
若有鍵按下,應該識別出是哪一個鍵閉合。方法是對鍵盤的行線進行掃描。P1.4~P1.7按下面4種組合依次輸出1110,1101,1011,0111,在每組行輸出時讀取P1.0~P1.3,若全為1,則表示0這行沒有鍵輸入,否則有鍵閉合。由此得到閉合鍵的行值和列值,然後採用計算的方法或者查表的方法將閉合鍵的行值和列值轉換成所定義的值。
為了保證每閉合一次CPU僅作一次處理,必須去除鍵釋放時的抖動。產生的鍵值放在發送資料庫區,30H存放的是產生的鍵值,即要遙控的8位地址共1位元組,31H放的是和30H中的相同的8位地址,地址碼重發了一次,主要是加強遙控器的可靠性,如果兩次地址碼不相同,則說明本幀數據有錯,應該丟棄。32H放的是00H(為了編程簡單),33H放的是0FFH,一共32位數據。要發送數據時,只要到那裡讀取數據即可,然後調用發射子程序發送。
②載波部分
根據前面介紹的紅外遙控的基本原理,紅外遙控器編碼調制的方法其實很簡單,只要生成一定時間長的電平就可以。再通過一個38kHz載波調制便可以發射編碼。載波的產生方法有多種,可以由CMOS門電路RC振盪器構成,或者由555時基電路構成等。
在此次設計中採用的是CPU延時,即用定時器中斷完成,用單片機的T0定時產生38kHz載波。設定定時器為方式2,即自動恢復初值的8位計數器。TL0作為8位計數器,TH0作為計數初值寄存器,當TL0計數溢出時,一方面置1溢出標志位TF0,向CPU請求中斷,同時將TH0內容送入TL0,使TL0從初值開始重新加1計數。因此,T0工作於方式2,定時精度比較高。根據計算,設定38KHz的定時初值,採用12kHz晶振的定時初值為0F3H,用11.0592kHz晶振時的初值為0F4H,設定好定時器中斷,在中斷程序中只寫入取反P2.0(CPLP2.0),當要發送數據1時,前面560μs高電平發送時,先打開定時器中斷,再啟動定時器,允許定時器工作,延時560μs再關定時器,後面1690μs的低電平因為不發送信號,所以可以直接置P2.0高電平後,延時1690μs即可;數據0前面的560μs高電平和數據1的一樣,後面560μs的低電平因為不發送信號,所以可以直接置P2.0高電平後,延時560μs即可。
2紅外接收解碼電路
紅外遙控接收採用一體化紅外接收頭,它將紅外接收二極體、放大器、解調、整形等電路安裝在一起,只有三個引腳。紅外接收頭的信號輸出端接單片機的INT0端,單片機中斷INT0在紅外脈沖下降沿時產生中斷。電路如圖3.3所示,圖中增加一隻PNP三極體對輸出信號放大,R和C組成去耦電路抑制電源干擾。
3遙控信號的解碼演算法
平時,遙控器無鍵按下時,紅外發射二極體不發出信號,遙控接收頭輸出信號1,有鍵按下時,0和1的編碼的高電平經遙控接收頭反相後會輸出信號0,由於與單片機的中斷腳相連,將會引起單片機中斷(單片機預先設定為下降沿產生中斷)。
遙控碼發射時由9ms的高電平和4.5ms的低電平表示引導碼,用560μs的高電平和560μs的低電平表示數據「0」,用560μs的高電平和1690μs的低電平表示數據「1」,引導碼後面是4位元組的數據。接收碼是發射碼的反向,所以判斷數據中的高電平的長度是讀出數據的要點,在這里用882μs(560~1690μs之間)作為標尺,如果882μs之後還是高電平則表示是數據1,將1寫入寄存器即可(數據為1時還需要再延時一段時間使電平變低,用來檢測下一個低電平的開始)。882μs後電平為低電平則表示是數據0,則將0寫入寄存器中,之後再等待下一個低電平的到來。
繼續接收下面的數據,當接收到32位數據時,說明一幀數據接收完畢,然後判斷本次接收是否有效,如果兩次地址碼相同並且等於本系統的地址碼,數據碼和數據反碼之和等於0FFH,則接收的本幀數據有效,點亮一隻發光二極體,否則丟棄本次接收到的數據。
接收完畢後,初始化本次接收到的數據,准備下次遙控接收。
以上就是小編為大家介紹的遙控器原理,希望能夠幫助到您。更多關於遙控器原理的相關資訊,請繼續關注土巴兔學裝修。
C. 單片機開發板自帶的遙控器是個什麼意思,它裡面和一般鍵盤一樣嗎怎麼用呢
單片機開發板自帶的遙控器通常是NEC編碼的紅外遙控器,是為用戶學習紅外遙控解碼而配備的,用戶需要自己構建遙控器信號的解碼程序,並自己定義遙控器上按鍵的功能。
有些開發板還帶有連接鍵盤的PS/2插口,這是為了讓用戶學習PS/2介面協議而配備的,用戶同樣需要自己構建相關的程序,並定義按鍵功能。
D. 學習型紅外遙控器的原理是怎樣的
學習型紅外遙控器的原理:
基本原理是發送端將基帶二進制信號調制為一系列的脈沖串信號,通過紅外發射管發射的紅外信號,常用的有通過脈沖寬度來實現信號調制的脈寬調制(PWM)和通過脈沖串之間的時間間隔來實現信號調制的脈時調制(PPM)兩種方法。
學習型遙控常用的載波頻率為38kHz,這是由發射端編碼晶元所使用的455kHz晶振來決定的,其他的遙控系統採用36kHz、40kHz、56kHz等。現在採用一體化接收頭做為信號的接收,把解調出來的信號送入單片機進行學習(記錄各個高低電平的時間長度),然後存入EEPROM內,學習完成後再將EEPROM的高低電平的時間數據讀取並與38kHz載波進行調制,然後紅外發光管發送出去。
E. 用51單片機製作學習型紅外遙控器的原理
以下是程序,調試成功,LCD1602顯示
//本解碼程序適用於NEC的upd6121及其兼容晶元的解碼,支持大多數遙控器實驗板採用11.0592MHZ晶振
#include<reg52.h>//包含單片機寄存器的頭文件
#include<intrins.h>//包含_nop_()函數定義的頭文件
sbitIR=P3^2;//將IR位定義為P3.2引腳
sbitRS=P2^0;//寄存器選擇位,將RS位定義為P2.0引腳
sbitRW=P2^1;//讀寫選擇位,將RW位定義為P2.1引腳
sbitE=P2^2;//使能信號位,將E位定義為P2.2引腳
sbitBF=P0^7;//忙碌標志位,,將BF位定義為P0.7引腳
sbitBEEP=P3^6;//蜂鳴器控制埠P36
unsignedcharflag;
unsignedcharcodestring[]={"1602IR-CODETEST"};
unsignedchara[4];//儲存用戶碼、用戶反碼與鍵數據碼、鍵數據反碼
unsignedintLowTime,HighTime;//儲存高、低電平的寬度
/*****************************************************
函數功能:延時1ms
***************************************************/
voiddelay1ms()
{
unsignedchari,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++)
;
}
/*****************************************************
函數功能:延時若干毫秒
入口參數:n
***************************************************/
voiddelay(unsignedcharn)
{
unsignedchari;
for(i=0;i<n;i++)
delay1ms();
}
/*********************************************************/
voidbeep()//蜂鳴器響一聲函數
{
unsignedchari;
for(i=0;i<100;i++)
{
delay1ms();
BEEP=!BEEP;//BEEP取反
}
BEEP=1;//關閉蜂鳴器
delay(250);//延時
}
/*****************************************************
函數功能:判斷液晶模塊的忙碌狀態
返回值:result。result=1,忙碌;result=0,不忙
***************************************************/
unsignedcharBusyTest(void)
{
bitresult;
RS=0;//根據規定,RS為低電平,RW為高電平時,可以讀狀態
RW=1;
E=1;//E=1,才允許讀寫
_nop_();//空操作
_nop_();
_nop_();
_nop_();//空操作四個機器周期,給硬體反應時間
result=BF;//將忙碌標志電平賦給result
E=0;
returnresult;
}
/*****************************************************
函數功能:將模式設置指令或顯示地址寫入液晶模塊
入口參數:dictate
***************************************************/
voidWriteInstruction(unsignedchardictate)
{
while(BusyTest()==1);//如果忙就等待
RS=0;//根據規定,RS和R/W同時為低電平時,可以寫入指令
RW=0;
E=0;//E置低電平(根據表8-6,寫指令時,E為高脈沖,
//就是讓E從0到1發生正跳變,所以應先置"0"
_nop_();
_nop_();//空操作兩個機器周期,給硬體反應時間
P0=dictate;//將數據送入P0口,即寫入指令或地址
_nop_();
_nop_();
_nop_();
_nop_();//空操作四個機器周期,給硬體反應時間
E=1;//E置高電平
_nop_();
_nop_();
_nop_();
_nop_();//空操作四個機器周期,給硬體反應時間
E=0;//當E由高電平跳變成低電平時,液晶模塊開始執行命令
}
/*****************************************************
函數功能:指定字元顯示的實際地址
入口參數:x
***************************************************/
voidWriteAddress(unsignedcharx)
{
WriteInstruction(x|0x80);//顯示位置的確定方法規定為"80H+地址碼x"
}
/*****************************************************
函數功能:將數據(字元的標准ASCII碼)寫入液晶模塊
入口參數:y(為字元常量)
***************************************************/
voidWriteData(unsignedchary)
{
while(BusyTest()==1);
RS=1;//RS為高電平,RW為低電平時,可以寫入數據
RW=0;
E=0;//E置低電平(根據表8-6,寫指令時,E為高脈沖,
//就是讓E從0到1發生正跳變,所以應先置"0"
P0=y;//將數據送入P0口,即將數據寫入液晶模塊
_nop_();
_nop_();
_nop_();
_nop_();//空操作四個機器周期,給硬體反應時間
E=1;//E置高電平
_nop_();
_nop_();
_nop_();
_nop_();//空操作四個機器周期,給硬體反應時間
E=0;//當E由高電平跳變成低電平時,液晶模塊開始執行命令
}
/*****************************************************
函數功能:對LCD的顯示模式進行初始化設置
***************************************************/
voidLcdInitiate(void)
{
delay(15);//延時15ms,首次寫指令時應給LCD一段較長的反應時間
WriteInstruction(0x38);//顯示模式設置:16×2顯示,5×7點陣,8位數據介面
delay(5);//延時5ms
WriteInstruction(0x38);
delay(5);
WriteInstruction(0x38);
delay(5);
WriteInstruction(0x0C);//顯示模式設置:顯示開,有游標,游標閃爍
delay(5);
WriteInstruction(0x06);//顯示模式設置:游標右移,字元不移
delay(5);
WriteInstruction(0x01);//清屏幕指令,將以前的顯示內容清除
delay(5);
}
/************************************************************
函數功能:對4個位元組的用戶碼和鍵數據碼進行解碼
說明:解碼正確,返回1,否則返回0
出口參數:dat
*************************************************************/
bitDeCode(void)
{
unsignedchari,j;
unsignedchartemp;//儲存解碼出的數據
for(i=0;i<4;i++)//連續讀取4個用戶碼和鍵數據碼
{
for(j=0;j<8;j++)//每個碼有8位數字
{
temp=temp>>1;//temp中的各數據位右移一位,因為先讀出的是高位數據
TH0=0;//定時器清0
TL0=0;//定時器清0
TR0=1;//開啟定時器T0
while(IR==0)//如果是低電平就等待
;//低電平計時
TR0=0;//關閉定時器T0
LowTime=TH0*256+TL0;//保存低電平寬度
TH0=0;//定時器清0
TL0=0;//定時器清0
TR0=1;//開啟定時器T0
while(IR==1)//如果是高電平就等待
;
TR0=0;//關閉定時器T0
HighTime=TH0*256+TL0;//保存高電平寬度
if((LowTime<370)||(LowTime>640))
return0;//如果低電平長度不在合理范圍,則認為出錯,停止解碼
if((HighTime>420)&&(HighTime<620))//如果高電平時間在560微秒左右,即計數560/1.085=516次
temp=temp&0x7f;//(520-100=420,520+100=620),則該位是0
if((HighTime>1300)&&(HighTime<1800))//如果高電平時間在1680微秒左右,即計數1680/1.085=1548次
temp=temp|0x80;//(1550-250=1300,1550+250=1800),則該位是1
}
a[i]=temp;//將解碼出的位元組值儲存在a[i]
}
if(a[2]=~a[3])//驗證鍵數據碼和其反碼是否相等,一般情況下不必驗證用戶碼
return1;//解碼正確,返回1
}
/*------------------二進制碼轉換為壓縮型BCD碼,並顯示---------------*/
voidtwo_2_bcd(unsignedchardate)
{
unsignedchartemp;
temp=date;
date&=0xf0;
date>>=4;//右移四位得到高四位碼
date&=0x0f;//與0x0f想與確保高四位為0
if(date<=0x09)
{
WriteData(0x30+date);//lcd顯示鍵值高四位
}
else
{
date=date-0x09;
WriteData(0x40+date);
}
date=temp;
date&=0x0f;
if(date<=0x09)
{
WriteData(0x30+date);//lcd顯示低四位值
}
else
{
date=date-0x09;
WriteData(0x40+date);
}
WriteData(0x48);//顯示字元'H'
}
/************************************************************
函數功能:1602LCD顯示
*************************************************************/
voidDisp(void)
{
WriteAddress(0x40);//設置顯示位置為第一行的第1個字
two_2_bcd(a[0]);
WriteData(0x20);
two_2_bcd(a[1]);
WriteData(0x20);
two_2_bcd(a[2]);
WriteData(0x20);
two_2_bcd(a[3]);
}
/************************************************************
函數功能:主函數
*************************************************************/
voidmain()
{
unsignedchari;
LcdInitiate();//調用LCD初始化函數
delay(10);
WriteInstruction(0x01);//清顯示:清屏幕指令
WriteAddress(0x00);//設置顯示位置為第一行的第1個字
i=0;
while(string[i]!='