導航:首頁 > 操作系統 > 單片機紅外收發

單片機紅外收發

發布時間:2023-01-06 10:17:02

① 求單片機C51紅外線收發方案(最好有詳細解釋)

紅外線遙控器解碼程序
2007-02-07 18:52 紅外線遙控是目前使用最廣泛的一種通信和遙控手段。由於紅外線遙控裝置具有體積小、功耗低、功能強、成本低等特點,因而,繼彩電、錄像機之後,在錄音機、音響設備、空凋機以及玩具等其它小型電器裝置上也紛紛採用紅外線遙控。現在工業設備中,也已經廣泛在使用。。。。。

1 紅外遙控系統
通用紅外遙控系統由發射和接收兩大部分組成,應用編/解碼專用集成電路晶元來進行控制操作,如圖1所示。發射部分包括鍵盤矩陣、編碼調制、LED紅外發送器;接收部分包括光、電轉換放大器、解調、解碼電路。
2 遙控發射器及其編碼
遙控發射器專用晶元很多,根據編碼格式可以分成脈沖寬度調制和脈沖相位調制兩大類,這里我們以運用比較廣泛,解碼比較容易的脈沖寬度調制來加以說明,現以3310組成發射電路為例說明編碼原理。當發射器按鍵按下後,即有遙控碼發出,所按的鍵不同遙控編碼也不同。這種遙控碼具有以下特徵:
採用脈寬調制的串列碼,以脈寬為0.565ms、間隔0.56ms、周期為1.125ms的組合表示二進制的「0」;以脈寬為0.565ms、間隔1.685ms、周期為2.25ms的組合表示二進制的「1」
上述「0」和「1」組成的42位二進制碼經38kHz的載頻進行二次調制以提高發射效率,達到降低電源功耗的目的。然後再通過紅外發射二極體產生紅外線向空間發射,
3310產生的遙控編碼是連續的42位二進制碼組,其中前26位為用戶識別碼,能區別不同的紅外遙控設備,防止不同機種遙控碼互相干擾。後16位為8位的操作碼和8位的操作反碼用於核對數據是否接收准確。
當遙控器上任意一個按鍵按下超過36ms時,LC7461晶元的振盪器使晶元激活,將發射一個特定的同步碼頭,對於接收端而言就是一個9ms的低電平,和一個4.5ms的高電平,這個同步碼頭可以使程序知道從這個同步碼頭以後可以開始接收數據。
解碼的關鍵是如何識別「0」和「1」,從位的定義我們可以發現「0」、「1」均以0.56ms的低電平開始,不同的是高電平的寬度不同,「0」為0.56ms,「1」為1.68ms,所以必須根據高電平的寬度區別「0」和「1」。如果從0.56ms低電平過後,開始延時,0.56ms以後,若讀到的電平為低,說明該位為「0」,反之則為「1」,為了可靠起見,延時必須比0.56ms長些,但又不能超過1.12ms,否則如果該位為「0」,讀到的已是下一位的高電平,因此取(1.12ms+0.56ms)/2=0.84ms最為可靠,一般取0.84ms左右即可。
根據紅外編碼的格式,程序應該等待9ms的起始碼和4.5ms的結果碼完成後才能讀碼。

接收器及解碼
LT0038是塑封一體化紅外線接收器,它是一種集紅外線接收、放大、整形於一體的集成電路,不需要任何外接元件,就能完成從紅外線接收到輸出與TTL電平信號兼容的所有工作,沒有紅外遙控信號時為高電平,收到紅外信號時為低電平,而體積和普通的塑封三極體大小一樣,它適合於各種紅外線遙控和紅外線數據傳輸。

下面是一個對51ISP編程實驗開發板配套的紅外線遙控器的解碼程序,它可以把紅外遙控器每一個按鍵的鍵值讀出來,並且通過實驗板上P1口的8個LED顯示出來,在解碼成功的同時並且能發出「嘀嘀嘀」的提示音。
ORG 0000H
AJMP MAIN;轉入主程序
ORG 0003H ;外部中斷P3.2腳INT0入口地址
AJMP INT ;轉入外部中斷服務子程序(解碼程序)
;以下為主程序進行CPU中斷方式設置
MAIN:SETB EA ;打開CPU總中斷請求
SETB IT0 ;設定INT0的觸發方式為脈沖負邊沿觸發
SETB EX0 ;打開INT0中斷請求
;以下對單片機的所有引腳進行初始化,全部設置成高電平
MOV P2,#11111111B
AJMP $
;以下為進入P3.2腳外部中斷子程序,也就是解碼程序
INT: CLR EA ;暫時關閉CPU的所有中斷請求
MOV R6,#10
SB: ACALL YS1;調用882微秒延時子程序
JB P3.2,EXIT;延時882微秒後判斷P3.2腳是否出現高電平如果有就退出解碼程序
DJNZ R6, SB;重復10次,目的是檢測在8820微秒內如果出現高電平就退出解碼程序
;以上完成對遙控信號的9000微秒的初始低電平信號的識別。
JNB P3.2, $ ;等待高電平避開9毫秒低電平引導脈沖
ACALL YS2 ;延時4.74毫秒避開4.5毫秒的結果碼
MOV R7,#26;忽略前26位系統識別碼
JJJJA:JNB P3.2,$;等待地址碼第一位的高電平信號
LCALL YS1;高電平開始後用882微秒的時間尺去判斷信號此時的高低電平狀態
MOV C,P3.2;將P3.2引腳此時的電平狀態0或1存入C中
JNC UUUA;如果為0就跳轉到UUUA
LCALL YS3;檢測到高電平1的話延時1毫秒等待脈沖高電平結束
UUUA: DJNZ R7,JJJJA
MOV R1,#1AH ;設定1AH為起始RAM區
MOV R2,#2;接收從1AH到1BH的2個內存,用於存放操作碼和操作反碼
PP: MOV R3,#8;每組數據為8位
JJJJ: JNB P3.2,$;等待地址碼第一位的高電平信號
LCALL YS1;高電平開始後用882微秒的時間尺去判斷信號此時的高低電平狀態
MOV C,P3.2;將P3.2引腳此時的電平狀態0或1存入C中
JNC UUU;如果為0就跳轉到UUU
LCALL YS3;檢測到高電平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位數據反碼,存放在1AH/1BH中
MOV A,1AH
CPL A;對1AH取反後和1BH比較
CJNE A,1BH,EXIT;如果不等表示接收數據發生錯誤,放棄
MOV P1,1AH;將按鍵的鍵值通過P1口的8個LED顯示出來!
CLR P2.0;蜂鳴器鳴響-嘀嘀嘀-的聲音,表示解碼成功
LCALL YS2
LCALL YS2
LCALL YS2
SETB P2.0;蜂鳴器停止(使用時可以將J2的YINYUE腳用跳線接J4 的XS1腳才可以使用蜂鳴器)可以看原理圖
EXIT: SETB EA ;允許中斷
RETI ;退出解碼子程序
YS1: MOV R4,#20 ;延時子程序1,精確延時882微秒
D1: MOV R5,#20
DJNZ R5,$
DJNZ R4,D1
RET
YS2: MOV R4,#10 ;延時子程序2,精確延時4740微秒
D2: MOV R5,#235
DJNZ R5,$
DJNZ R4,D2
RET
YS3: MOV R4,#2;延時程序3,精確延時1000微秒
D3:MOV R5,#248
DJNZ R5,$
DJNZ R4,D3
RET
END
以上程序緊供參考。

0A 01
11 12 13 14
15 16 17 18
19 10 1A 1B
0E 02 03 1C
06 04 05 0C
0D 08 09 1D
00 1F 1E 0B
07 0F
這是按照紅外遙控器按鍵的實際位置給出的32個按鍵的鍵值(16進制)

② 單片機紅外發送數據,為什麼接收到的都是一樣的東西

單片機紅外發送數據,如果接收到的都是一樣的東西,
那麼說明發送或者接收階段,或者你編的單片機的原始程序出了問題。
你可以先分步測試自己的程序,如果沒有問題,再測試發送和接收是否正常。

對應紅外接收,誤碼率處理不好還是很高的,距離越遠對於時間間隔的誤差越大,接收時是1還是0,要允許的誤差大一點,如固定數據位之間的間隔為560us,但實際可能為580us,隨著距離加大可能變成700,800us都有可能,這就要求我們程序的允許誤差要大些,這個要根據實際調整。

③ 51單片機紅外接收端的程序怎麼寫,我想知道寫的方法和原理,最好有一個具體的模版,好讓我參考.

這是採用STC12C5A60S2單片機的紅外解碼程序及其說明。
;採用脈寬調制的串列碼,以脈寬為0.565ms、間隔0.56ms、周期為1.125ms的組合表示二進制的"0";
;以脈寬為0.565ms、間隔1.685ms、周期為2.25ms的組合表示二進制的"1
;上述"0"和"1"組成的32位二進制碼經38kHz的載頻進行二次調制以提高發射效率,
;達到降低電源功耗的目的。然後再通過紅外發射二極體產生紅外線向空間發射
;遙控編碼是連續的32位二進制碼組,其中前16位為用戶識別碼,能區別不同的電器設備,
;防止不同機種遙控碼互相干擾。該晶元的用戶識別碼固定為十六進制01H
;後16位為8位操作碼(功能碼)及其反碼。
;當一個鍵按下超過36ms,振盪器使晶元激活,將發射一組108ms的編碼脈沖,這108ms發射代碼由一個起始碼(9ms),
;一個結果碼(4.5ms),低8位地址碼(9ms~18ms),高8位地址碼(9ms~18ms),8位數據碼(9ms~18ms)
;和這8位數據的反碼(9ms~18ms)組成。如果鍵按下超過108ms仍未松開,
;接下來發射的代碼(連發代碼)將僅由起始碼(9ms)和結束碼(2.5ms)組成。
;
;解碼的關鍵是如何識別"0"和"1",接收端而言,"0"是0.56ms的高+0.56ms的低。"1"是1.68ms的高+0.56ms的低。
;所以可以根據高電平的寬度區別"0"和"1"。當高電平出現時開始延時,0.56ms以後,若讀到的電平為低,
;說明該位為"0",反之則為"1",為了可靠起見,延時必須比0.56ms長些,但又不能超過1.12ms,否則如果該位為"0",
;讀到的已是下一位的高電平,因此取(1.12ms+0.56ms)/2=0.84ms最為可靠,一般取0.84ms左右均可。
;為了共用引導部分延時程序,這里用0.9ms延時。
;-------------紅外解碼程序---------------------------
EXINT0:
PUSH ACC
PUSH PSW
PUSH 1
PUSH 2
PUSH 6
CLR EA ;暫時關閉中斷請求
MOV R6,#10
EXINT10:
LCALL DELAY09MS ;調用900us延時子程序
JB IRIN,INTOUT1 ;判斷P3.2是否有高電平,如果有就退出解碼程序
DJNZ R6,EXINT10 ;循環10次,檢測在900微妙中是否存在高電平。以上完成對遙控信號的9000微秒的初始低電平信號的識別。
JNB IRIN,$ ;等待高電平避開9毫秒低電平引導脈沖
LCALL DELAY45MS ;延時4.5毫秒
;-------------接受32位代碼--------------------------
MOV R1,#IRUSERL
MOV R2,#04H
EXINT101:
MOV R6,#08H ;每組數據位8位
EXINT102:
JNB IRIN,$ ;等待地址碼第一組數據的高電平信號
LCALL DELAY09MS ;高電平開始後延時判斷信號此時的高/低狀態
MOV C,IRIN ;將P3.2引腳此時的電平狀態0或1存入C中
JNC INT1OUT ;如果為0跳出
LCALL DELAY1MS
INT1OUT:
MOV A,@R1
RRC A ;將C中的數據0/1移入A中最低位
MOV @R1,A ;將A中的數據暫存在R1
DJNZ R6,EXINT102 ;接受完8位代碼
INC R1
DJNZ R2,EXINT101 ;接受完4組32位代碼
;--------------數據碼比較-------------------------------
MOV A,IRDATAL
; LCALL SENDRXDAT
MOV A,IRDATAL
CPL A
CJNE A,IRDATAH,INTOUT1 ;判斷數碼正誤,不等退出
MOV IR_DAT,IRDATAL ;相等則保存正確數據
MOV A,IR_DAT
; LCALL SENDRXDAT
SETB IRBIT
INTOUT1:
LCALL DELAY45MS
SETB EA ;允許中斷
POP 6
POP 2
POP 1
POP PSW
POP ACC
RETI
;;*****************11.0592*900=9953******************
DELAY09MS: ;6
PUSH 4 ;4
PUSH 3 ;4
MOV R4,#20 ;2
DLY900:
MOV R3,#122 ;2
DJNZ R3,$ ;4
DJNZ R4,DLY900 ;4
MOV R4,#11 ;2
DJNZ R4,$ ;4
POP 3 ;3
POP 4 ;3
RET ;4
;TOTAL=9952
;;*****************11.0592*560=6193******************
DELAY056: ;6
PUSH 4 ;4
PUSH 3 ;4
MOV R4,#12 ;2
DLY5600:
MOV R3,#122 ;2
DJNZ R3,$ ;4
DJNZ R4,DLY5600 ;4
MOV R4,#71 ;2
DJNZ R4,$ ;4
POP 3 ;3
POP 4 ;3
RET ;4
;TOTAL=6194
;;*****************11.0592*4500=49766****************
DELAY45MS: ;6
PUSH 4 ;4
PUSH 3 ;4
MOV R4,#52 ;2
DLY45:
MOV R3,#236 ;2
DJNZ R3,$ ;4
DJNZ R4,DLY45 ;4
MOV R4,#85 ;2
DJNZ R4,$ ;4
POP 3 ;3
POP 4 ;3
RET ;4
;;TOTAL=49768
;;*****************11.0592*1000=11059****************
DELAY1MS: ;6
PUSH 4 ;4
PUSH 3 ;4
MOV R4,#20 ;2
DLY1MS:
MOV R3,#136 ;2
DJNZ R3,$ ;4
DJNZ R4,DLY1MS ;4
MOV R4,#8 ;2
DJNZ R4,$ ;4
POP 3 ;3
POP 4 ;3
RET ;4
;TOTAL=11060
;;***************************************************
DELAY100US: ;6
PUSH 4 ;4
MOV R4,#140 ;2
DJNZ R4,$ ;4
MOV R4,#131 ;2
DJNZ R4,$ ;4
POP 4 ;3
RET ;4
;TOTAL=1105
;;***************************************************

④ 單片機紅外發射

#include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
#include"1602.h"
#include"delay.h"

sbit IR=P3^2; //紅外介面標志

char code Tab[16]="0123456789ABCDEF";

unsigned char irtime;//紅外用全局變數

bit irpro_ok,irok;
unsigned char IRcord[4];
unsigned char irdata[33];

unsigned char TempData[16];
/*------------------------------------------------
函數聲明
------------------------------------------------*/
void Ir_work(void);
void Ircordpro(void);

/*------------------------------------------------
定時器0中斷處理
------------------------------------------------*/

void tim0_isr (void) interrupt 1 using 1
{
irtime++; //用於計數2個下降沿之間的時間
}

/*------------------------------------------------
外部中斷0中斷處理
------------------------------------------------*/
void EX0_ISR (void) interrupt 0 //外部中斷0服務函數
{
static unsigned char i; //接收紅外信號處理
static bit startflag; //是否開始處理標志位

if(startflag)
{
if(irtime<63&&irtime>=33)//引導碼 TC9012的頭碼,9ms+4.5ms
i=0;
irdata[i]=irtime;//存儲每個電平的持續時間,用於以後判斷是0還是1
irtime=0;
i++;
if(i==33)
{
irok=1;
i=0;
}
}
else
{
irtime=0;
startflag=1;
}

}

/*------------------------------------------------
定時器0初始化
------------------------------------------------*/
void TIM0init(void)//定時器0初始化
{

TMOD=0x02;//定時器0工作方式2,TH0是重裝值,TL0是初值
TH0=0x00; //重載值
TL0=0x00; //初始化值
ET0=1; //開中斷
TR0=1;
}
/*------------------------------------------------
外部中斷0初始化
------------------------------------------------*/
void EX0init(void)
{
IT0 = 1; //指定外部中斷0下降沿觸發,INT0 (P3.2)
EX0 = 1; //使能外部中斷
EA = 1; //開總中斷
}
/*------------------------------------------------
鍵值處理
------------------------------------------------*/

void Ir_work(void)
{
TempData[0] = Tab[IRcord[0]/16]; //處理客戶碼
TempData[1] = Tab[IRcord[0]%16];
TempData[2] = '-';
TempData[3] = Tab[IRcord[1]/16]; //處理客戶碼
TempData[4] = Tab[IRcord[1]%16];
TempData[5] = '-';
TempData[6] = Tab[IRcord[2]/16]; //處理數據碼
TempData[7] = Tab[IRcord[2]%16];
TempData[8] = '-';
TempData[9] = Tab[IRcord[3]/16]; //處理數據反碼
TempData[10] = Tab[IRcord[3]%16];

LCD_Write_String(5,1,TempData);

irpro_ok=0;//處理完成標志

}
/*------------------------------------------------
紅外碼值處理
------------------------------------------------*/
void Ircordpro(void)//紅外碼值處理函數
{
unsigned char i, j, k;
unsigned char cord,value;

k=1;
for(i=0;i<4;i++) //處理4個位元組
{
for(j=1;j<=8;j++) //處理1個位元組8位
{
cord=irdata[k];
if(cord>7)//大於某值為1,這個和晶振有絕對關系,這里使用12M計算,此值可以有一定誤差
value|=0x80;
if(j<8)
{
value>>=1;
}
k++;
}
IRcord[i]=value;
value=0;
}
irpro_ok=1;//處理完畢標志位置1
}

/*------------------------------------------------
主函數
------------------------------------------------*/
void main(void)
{
EX0init(); //初始化外部中斷
TIM0init(); //初始化定時器

LCD_Init(); //初始化液晶
DelayMs(20); //延時有助於穩定
LCD_Clear(); //清屏

LCD_Write_String(0,0,"www.doflye.net");
LCD_Write_String(0,1,"Code:");

while(1)//主循環
{
if(irok) //如果接收好了進行紅外處理
{
Ircordpro();
irok=0;
}

if(irpro_ok) //如果處理好後進行工作處理,如按對應的按鍵後顯示對應的數字等
{
Ir_work();
}
}
}

⑤ 單片機紅外接收

要想通過無線系統傳送數字信號,首先要把數字數據轉換為串列數據才能發送。這些內容數字電路里應該會講到。這個一般單片機很容易實現。要想用過無線傳送,單片機外需加收發模塊。選用33M的頻率電磁波傳送,單片機需外加33M的頻率電磁波收發模塊。如選用紅外收發,單片機外加紅外發射管和驅動電路紅外接收模塊。紅外收發模塊特點是線路非常簡單,基本不用調試。傳輸范圍為可是范圍,距離一般10幾米。電磁波收發可繞過或穿透建築物,視其發射功率不同,可傳輸到很遠的距離。電磁波收發模塊成本較高,調試相對也麻煩。

⑥ 紅外在單片機上怎麼用

紅外可以做單片機上做收發。你可以完全做個類似電視遙控器的系統。
紅外的發射你可以通過三極體和紅外發射管做一個簡單發射電路。
紅外的接收,你買個紅外一體化接收頭。這2樣設備你看我的文庫。裡面有我詳細的器件采購清單,裡面有這2個東西。淘寶可以買到的。
紅外的程序編寫你需要詳細掌握紅外的協議,一般用nec公司的資料。
你學會了他們的收發時序,然後通過單片機編程,就可以實現紅外的收發系統。
希望對你有用!!

⑦ 51單片機怎麼接受紅外線 C語言

單片機本身不能接收,只是控制器,要另加電路才能接受。

⑧ 基於單片機的紅外遙控收發系統的設計與實現

紅外遙控一般採用38KHz載波

⑨ 單片機的紅外遙控的原理

1、發送端由單片機和紅外發光二極體組成。
單片機控制紅外發光二極體發射38KHz左右的紅外光,這個紅外光就可能起到傳遞信號的作用。你可以在你的程序中規定發射紅外線時表示二進制的一個位『1』無紅外線時表示二進制的『0』。這樣你就可以發出一系列由『1』和『0』所級成的信號。
2、接收端是由紅外接收二極體和單片機組成。
前面我們讓發射端發出信號,現在接收頭就開始收信號。

⑩ 單片機紅外發射與接收電路電路搭接

紅外管的陽極接單片機,陰極對地串聯一個510歐姆電阻。
接收光電二極體的陽極接地,陰極接一個10K電阻,電阻另一段接電源5V,從陰極於電阻之間引線出來就是信號線,可以輸出高低電平。

閱讀全文

與單片機紅外收發相關的資料

熱點內容
不能下載的單片機 瀏覽:940
程序員子女昌平二中考出來的名校 瀏覽:677
令牌桶演算法實現 瀏覽:74
tc腳本文件夾 瀏覽:732
學會繪畫pdf 瀏覽:954
隱身俠加密寶手機版 瀏覽:135
農行app怎麼辦理簽約手續 瀏覽:185
汽車壓力解壓神器 瀏覽:307
家用冰箱壓縮機有風扇嗎 瀏覽:647
安卓qq年齡怎麼看 瀏覽:839
屏幕跳屏亂點app怎麼解決 瀏覽:414
turbo加速器android 瀏覽:432
洪尚秀的電影哪裡哪個app能看 瀏覽:151
百度網站加密視頻怎麼下載 瀏覽:135
台州ug產品編程培訓班 瀏覽:866
Javalinux字體 瀏覽:520
77萬年會程序員補貼 瀏覽:610
滅火是由近及源碼 瀏覽:158
資料伺服器地址 瀏覽:8
網頁怎麼放在伺服器商 瀏覽:995