Ⅰ 知道了紅外遙控的編碼(16位1101 0011 1001 0010)請問怎樣在單片機里解碼
;遙控器讀碼程序(晶振為11.0592),該程序能讀出遙控器的控制碼,並通過LED顯示出來
;OMEN 2005/1/16於TCL
;***************************************************************
A_BIT EQU 20H ;數碼管個位數存放內存位置
B_BIT EQU 21H ;數碼管十位數存放內存位置
NO_OUT EQU 24H ;最終控制號碼存放單元
A_NO EQU 25H ;數碼管個位數對應代碼存放內存位置
B_NO EQU 26H ;數碼管十位數對應代碼存放內存位置
;22H,23H為控制碼及其反碼的存放單元
;*******************<<主程序>>***********************************
ORG 0000H
AJMP 0030H
ORG 0003H ;外部中斷P3.2腳INT0入口地址
AJMP INT ;轉入外部中斷服務子程序(解碼程序)
ORG 0030H
AJMP MAIN ;轉入主程序
;***************************************************************
MAIN: MOV NO_OUT,#0H
SETB EA ;打開CPU總中斷請求
SETB IT0 ;設定INT0的觸發方式為脈沖負邊沿觸發
SETB EX0 ;打開INT0中斷請求
LOOP: MOV A,NO_OUT;將按鍵的鍵值通過P1口的8個LED顯示出來!
CPL A ;由於P1發光二極體顯示的是電平的反狀態,所以取反
MOV P1,A ;發光二極體顯示輸出
LCALL DISPLAY;LED數碼管顯示輸出
AJMP LOOP;循環
;********************<<中斷接受遙控程序>>************************
;以下為進入P3.2腳外部中斷子程序,也就是解碼程序
INT:
PUSH ACC
PUSH PSW ;將PSW和ACC推入堆棧保護
CLR EA ;暫時關閉CPU的所有中斷請求
MOV R6,#10
SB: LCALL DL865;調用865微秒延時子程序
JB P3.2,EXIT;延時865微秒後判斷P3.2腳是否出現高電平如果有就退出解碼程序
DJNZ R6, SB;重復10次,目的是檢測在8650微秒內如果出現高電平就退出解碼程序
;以上完成對遙控信號的9000微秒的初始低電平信號的識別。
JNB P3.2, $ ;等待高電平避開9毫秒低電平引導脈沖
LCALL DL4737 ;延時4.74毫秒避開4.5毫秒的結果碼
MOV R7,#16;忽略前26位系統識別碼
JJJJA:JNB P3.2,$;等待地址碼第一位的高電平信號
LCALL DL865;高電平開始後用865微秒的時間尺去判斷信號此時的高低電平狀態
MOV C,P3.2;將P3.2引腳此時的電平狀態0或1存入C中
JNC UUUA;如果為0就跳轉到UUUA
LCALL DL1000;檢測到高電平1的話延時1毫秒等待脈沖高電平結束
UUUA: DJNZ R7,JJJJA
MOV R1,#22H ;設定22H為起始RAM區
MOV R2,#2;接收從22H到23H的2個內存,用於存放操作碼和操作反碼
PP: MOV R3,#8;每組數據為8位
JJJJ: JNB P3.2,$;等待地址碼第一位的高電平信號
LCALL DL865;高電平開始後用865微秒的時間尺去判斷信號此時的高低電平狀態
MOV C,P3.2;將P3.2引腳此時的電平狀態0或1存入C中
JNC UUU;如果為0就跳轉到UUU
LCALL DL1000;檢測到高電平1的話延時1毫秒等待脈沖高電平結束
UUU: MOV A,@R1;將R1中地址的給A
RRC A;將C中的值0或1移入A中的最低位
MOV @R1,A;將A中的數暫時存放在R1數值的內存中
DJNZ R3,JJJJ;接收滿8位換一個內存
INC R1;對R1中的值加1,換下一個RAM
DJNZ R2,PP ;接收完8位數據碼和8位數據反碼,存放在22H/23H中
MOV A,22H
CPL A;對22H取反後和23H比較
CJNE A,23H,EXIT;如果不等表示接收數據發生錯誤,放棄
MOV A,22H
MOV NO_OUT,A
;LCALL EEPROM_C ;清除以前的保存的碼
;LCALL DL4737
;LCALL EEPROM_W ;把碼存在單片機內部的EEPROM里
;LCALL DL4737
CLR P3.6;蜂鳴器鳴響-嘀嘀嘀-的聲音,表示解碼成功
LCALL DL4737
LCALL DL4737
LCALL DL4737
SETB P3.6;蜂鳴器停止
lcall DL4737
EXIT: SETB EA ;允許中斷
POP PSW
POP ACC ;將PSW和ACC推入堆棧保護
RETI ;退出解碼子程序
;*******************<<LED數碼管顯示子程序>>**********************
DISPLAY:
MOV A,NO_OUT ;將NO_OUT分成個位和16位
ANL A,#0FH ;取低四位放在a_bit
MOV A_BIT,A ;個位
MOV A,NO_OUT ;
RR A
RR A
RR A
RR A ;四次移動,把高四位移到低四位
ANL A,#0FH;取高四位放在B_bit
MOV B_BIT,A ;個位在b
MOV DPTR,#NUMTAB ;指定查表啟始地址
MOV A,A_BIT ;取個位數
MOVC A,@A+DPTR ;查個位數的7段代碼
MOV A_NO,A
MOV A,B_BIT ;取十位數
MOVC A,@A+DPTR ;查十位數的7段代碼
MOV B_NO,A
DPLOP:MOV A,A_NO
MOV P0,A ;送出個位的7段代碼
;SETB P2.1;關閉十位顯示,防止鬼影
CLR P2.0 ;開個位顯示
LCALL DL40 ;顯示4737微秒
SETB P2.0;關閉個位顯示,防止鬼影
MOV A,B_NO
MOV P0,A ;送出十位的7段代碼
CLR P2.1 ;開十位顯示
LCALL DL40 ;顯示4737微秒
SETB P2.1;關閉十位顯示,防止鬼影
RET
;**********************<<延時程序>>******************************
DL865: MOV R4,#12 ; 1.09*(2R5+4)*R4+2延時子程序1,精確延時865微秒
D1: MOV R5,#31
DJNZ R5,$
DJNZ R4,D1
RET
DL4737: MOV R4,#12 ;延時子程序2,精確延時4737微秒
D2: MOV R5,#179
DJNZ R5,$
DJNZ R4,D2
RET
DL1000: MOV R4,#17;延時程序3,精確延時1000微秒
D3: MOV R5,#25
DJNZ R5,$
DJNZ R4,D3
RET
DL40: MOV R4,#1;延時程序4,精確延時40/17微秒
D4: MOV R5,#1
DJNZ R5,$
DJNZ R4,D4
RET
;****************************************************************
;如果是共陽數碼管的顯示代碼 1-F 16個代碼
NUMTAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH ;STC新板的
END
Ⅱ 紅外遙控器原理 遙控器原理圖
遙控器是一種用來遠控機械的裝置。現代的遙控器,主要是由集成電路電板和用來產生不同訊息的按鈕所組成。下面一起來看看紅外遙控器原理以及遙控器原理圖吧。
紅外遙控器原理
紅外線遙控系統一般由發射器和接收器兩部分組成。發射器由指令鍵、指令信號產生電路、調制電路、驅動電路及紅外線發射器組成。當指令鍵被按下時,指令信號產生電路便產生所需要的控制信號,控制指令信號經調制電路調制後,最終由驅動電路驅動紅外線發射器,發出紅外線遙控指令信號。
接收器由紅外線接收器件、前置放大電路、解調電路、指令信號檢出電路、記憶及驅動電路、執行電路組成。當紅外接收器件收到發射器的紅外指令信號時,它將紅外光信號變成電信號並送到前置放大電路進行放大,再經過解調器後,由信號檢出電路將指令信號檢出,最後由記憶電路和驅動電路驅動執行電路,實現各種操作。
控制信號一般以某些不同的特徵來區分,常用的區分指令信號的特徵是頻率和碼組特徵,即用不同的頻率或者編碼的電信號代表不同的指令信號來實現遙控。所以紅外遙控系統通常按照產生和區分控制指令信號的方式和特徵分類,常分為頻分制紅外線遙控和碼分制紅外線遙控。
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,則接收的本幀數據有效,點亮一隻發光二極體,否則丟棄本次接收到的數據。
接收完畢後,初始化本次接收到的數據,准備下次遙控接收。
以上就是小編為大家介紹的遙控器原理,希望能夠幫助到您。更多關於遙控器原理的相關資訊,請繼續關注土巴兔學裝修。
Ⅲ 單片機紅外編碼
C51程序代碼:
#include <AT89X51.h>
static bit OP; //紅外發射管的亮滅
static unsigned int count; //延時計數器
static unsigned int endcount; //終止延時計數
static unsigned char flag; //紅外發送標志
char iraddr1; //十六位地址的第一個位元組
char iraddr2; //十六位地址的第二個位元組
void SendIRdata(char p_irdata);
void delay();
void main(void)
{
count = 0;
flag = 0;
OP = 0;
P3_4 = 0;
EA = 1; //允許CPU中斷
TMOD = 0x11; //設定時器0和1為16位模式1
ET0 = 1; //定時器0中斷允許
TH0 = 0xFF;
TL0 = 0xE6; //設定時值0為38K 也就是每隔26us中斷一次
TR0 = 1;//開始計數
iraddr1=3;
iraddr2=252;
do{
delay();
SendIRdata(12);
}while(1);
}
//定時器0中斷處理
void timeint(void) interrupt 1
{
TH0=0xFF;
TL0=0xE6; //設定時值為38K 也就是每隔26us中斷一次
count++;
if (flag==1)
{
OP=~OP;
}
else
{
OP = 0;
}
P3_4 = OP;
}
void SendIRdata(char p_irdata)
{
int i;
char irdata=p_irdata;
//發送9ms的起始碼
endcount=223;
flag=1;
count=0;
do{}while(count<endcount);
//發送4.5ms的結果碼
endcount=117
flag=0;
count=0;
do{}while(count<endcount);
//發送十六位地址的前八位
irdata=iraddr1;
for(i=0;i<8;i++)
{
//先發送0.56ms的38KHZ紅外波(即編碼中0.56ms的低電平)
endcount=10;
flag=1;
count=0;
do{}while(count<endcount);
//停止發送紅外信號(即編碼中的高電平)
if(irdata-(irdata/2)*2) //判斷二進制數個位為1還是0
{
endcount=41; //1為寬的高電平
}
else
{
endcount=15; //0為窄的高電平
}
flag=0;
count=0;
do{}while(count<endcount);
irdata=irdata>>1;
}
//發送十六位地址的後八位
irdata=iraddr2;
for(i=0;i<8;i++)
{
endcount=10;
flag=1;
count=0;
do{}while(count<endcount);
if(irdata-(irdata/2)*2)
{
endcount=41;
}
else
{
endcount=15;
}
flag=0;
count=0;
do{}while(count<endcount);
irdata=irdata>>1;
}
//發送八位數據
irdata=p_irdata;
for(i=0;i<8;i++)
{
endcount=10;
flag=1;
count=0;
do{}while(count<endcount);
if(irdata-(irdata/2)*2)
{
endcount=41;
}
else
{
endcount=15;
}
flag=0;
count=0;
do{}while(count<endcount);
irdata=irdata>>1;
}
//發送八位數據的反碼
irdata=~p_irdata;
for(i=0;i<8;i++)
{
endcount=10;
flag=1;
count=0;
do{}while(count<endcount);
if(irdata-(irdata/2)*2)
{
endcount=41;
}
else
{
endcount=15;
}
flag=0;
count=0;
do{}while(count<endcount);
irdata=irdata>>1;
}
endcount=10;
flag=1;
count=0;
do{}while(count<endcount);
flag=0;
}
void delay()
{
int i,j;
for(i=0;i<400;i++)
{
for(j=0;j<100;j++)
{
}
}
}
Ⅳ 單片機控制紅外遙控編碼解碼中定時器和外部中斷的作用是什麼紅外遙控編碼解碼的大致步驟是什麼
同時使用上定時器 跟 外中斷 的紅外程序,只有解碼程序。而且該方式,只能解析 使用不同時間長度代表數據「0」、「1」 的波形(如數據『1』的時間長度 2倍於數據『0』的時間)。
解析原理:外部中斷接 紅外輸入,當有 紅外信號的時候,該引腳會有波形輸入(N多下降沿),觸發外部中斷,通過記錄 每2次中斷的時間間隔,可以判斷此段時間對應的數據(0/1)。一般「數據」長度為32位數據
注意點:
①初次產生外中斷的時候,並無 時間記錄,不需要進行時間判斷;
②第二次中斷與第一次中斷 之間 的時間,是 紅外的引導碼,該時間一般多倍於數據時間(一般為ms級時間);
③第三次中斷與第二次中斷的時間,即為 第一個數據 的時間;
④第34次中斷與第33次中斷的時間間隔,即為 第32個數據的時間;
⑤後面 可能存在 停止位,是否存在,由遙控器決定;不過,一般都直接忽略該位,除非該位是由自己製作的遙控器 發出 的校驗位;
⑥後面 可能存在 連發碼,是否存在,由遙控器決定;
另外:一般紅外數據的每個位元組都是LSB在前,MSB在後的( 低位先發,高位後發)
軟體要處理以下情況:
①干擾的處理,有些紅外接收頭不僅僅對38KHz頻率光有反應,可能對人體紅外、日光燈紅外一樣有反應,那就存在干擾。如果它只產生一次干擾,就會使系統卡在引導碼接收階段;
②引導碼時間過短、過長 的處理;
③接收數據位數不足的處理;
④完成32位數據接收後,處理接收爛尾:後面不會有中斷(如果需接收停止位、連發碼,就增加對應數據長度),需要停止計時。
⑤進行數據校對,一般第一位元組跟第二位元組互為反碼,第三位元組跟第四位元組互為反碼,而且第一位元組 代表 一個地址、一個密碼,只有地址、密碼正確,才能算合法的操作。
Ⅳ c51單片機紅外NEC編碼解碼!
這個程序太簡單了,我之前寫過紅外發射程序的,接收程序也很簡單,你這個項目我2個小時都能幫你解決,但是89C52單片機發射38K不準需要把晶振加大,提高單片機的運行速度。
你的項目只要主機A發射紅外協議後面加一個地址,單片機B接收的時候全部進入接收狀態,判接收的地址是否符合對於單片機B的地址,如果地址符合,那就先回應一個數據例如:55FF55,主機接收到55FF55後後面開始接收數據,把接收到的數據直接寫入單片機內EEPRM裡面!
Ⅵ 基於51單片機NEC協議紅外遙控發送接收模擬設計( proteus模擬+程序+原理圖+報告+講解視頻)
基於51單片機NEC協議紅外遙控發送接收模擬設計,涉及從硬體到軟體的全面實現,包括模擬、程序、原理圖、設計報告以及講解視頻。設計旨在模擬紅外遙控器的發射和接收功能,並通過Proteus軟體進行模擬驗證,確保設計符合NEC紅外編碼協議。此設計採用兼容的51系列單片機,如AT89C51或AT89C52,原理圖適用於各種型號的單片機,程序在Keil編譯器下編寫,採用C語言實現。設計包括以下關鍵部分:
### 1. 功能概述
設計的核心功能包括模擬紅外遙控器發射紅外編碼和接收機接收並顯示編碼。發射機發送的編碼遵循NEC協議,包括同步碼、地址碼、命令碼等,接收機接收到編碼後,使用16進制形式在數碼管上顯示命令碼內容。
### 2. 模擬過程
通過Proteus軟體啟動模擬工程,設置單片機型號、載入hex文件,開始模擬。模擬過程中,使用示波器觀察紅外編碼信號,顯示的順序與NEC協議相符,如同步碼、地址碼、命令碼等,通過觀察示波器數據,驗證了設計的編碼遵循了協議標准。
### 3. 程序代碼
設計提供了使用Keil 4或Keil 5編譯器的源代碼,代碼注釋清晰,便於理解發射和接收兩部分的功能實現,結合設計報告深入理解代碼邏輯。
### 4. 原理圖
原理圖使用AD軟體繪制,為實物設計提供參考。設計中強調了Proteus模擬與實物的區別,包括運行環境、調試方式、電路連接方式以及運行速度等,幫助理解模擬與實際應用的差異。
### 5. 設計報告
報告詳細描述了設計的引言、硬體設計、軟體設計、軟硬體框圖、調試過程、總結與展望等內容,是設計實施的全面總結。
### 6. 資源清單與下載鏈接
設計資料包含模擬文件、程序代碼、講解視頻、設計報告、原理圖、功能要求、元器件清單、軟硬體流程框圖等。提供了解決常見使用問題的方法,並提供了一個網盤鏈接,供用戶下載所需資源。
此設計通過Proteus模擬驗證了基於51單片機的NEC協議紅外遙控發送接收系統的正確性,為學習單片機應用、紅外通信技術提供了實踐案例。通過詳細的文檔和資源,旨在幫助學習者深入理解紅外遙控技術,掌握單片機編程和電路設計的基本技能。
Ⅶ 單片機紅外程序遙控器按一個鍵之後其他鍵摁下去沒反應是怎麼回事
按下時發送正常的編碼,發送完畢,若按鍵依然按下,則發送重復碼,重復碼和引導碼有共同的特點,就是周期短了一些(引導:13.5ms;重復:11.25ms),這個不就可以區分了嗎?
只要接收的碼周期是13.5,即一組新發送的編碼,若是11.25則是重復碼,重復碼時,則將之前接收到的編碼作為本次接收到的編碼處理即可