導航:首頁 > 操作系統 > 單片機紅外接收電路圖

單片機紅外接收電路圖

發布時間:2022-08-24 21:32:44

㈠ 51單片機遙控器(紅外),用什麼來接收呢

最好還是買一個紅接收頭,接收靈敏度高,接收距離遠,自己不用加任何電路。加上5V電源就能用了,輸出的就是數字信號了,非常適合單片機編程。如HS0038B。

㈡ 紅外感應器接入單片機的電路圖

http://www.cndzz.com/info/3547-1.htm

微電腦洗手沖水兩用控制器

㈢ 這是我設計基於AT單片機的紅外對射報警探測器電路圖感覺還有點問題求高手指點

看了你的電路,覺得確實有問題。
第一,89C51晶元的驅動能力有限,不能用來直接驅動發光二極體,長期工作有問題,建議換成驅動能力較強的單片機晶元,如STC89C52之類,單口灌電流可到20mA,若堅持使用AT89C51,則發光二極體應通過三極體驅動。
第二,為了避免自然光的干擾,一般會讓發光二極體發出一定頻率的光,這樣光接收電路也要做一定的調整。要採用軟體判別採集到的頻率。所以建議光接收電路接到int0或者int1或者T0、T1埠上,當然也可以採用紅外專用接收管。

㈣ 請教幾個關於紅外發射接收模塊的問題,電路圖如下

你好:

——★1、LM 393電壓比較器線路,原理是:當+(同向輸入端)電位比-(反向輸入端)電位時,LM 393 輸出高電平;而-端電位比+端電位高時,LM 393 輸出低電平


——★2、光耦之間沒有物體時,光耦內部的三極體導通、但存在一定的電壓降LM 393 +端也就有一定的電位。電位器的作用就是調整 LM 393 反向輸入端的基準電壓的,可以調整靈敏度。


——★3、LM 393 同向端10 K 電阻,實際上是光耦內三極體的集電極電阻,光耦導通時同名端電位降低、光耦截止時同名端電位升高 ...... 與反向端相比較,就可以輸出相應的高、低電平了。

㈤ 請問紅外接收頭SJ0038在單片機中的連接電路圖它對發射管型號有要求嗎

這是你要的圖,out為輸出端

㈥ 誰能幫我分析一下這個學習型紅外設備的電路原理(有電路圖)

把原理圖傳上來。

㈦ 紅外遙控器原理 遙控器原理圖

遙控器是一種用來遠控機械的裝置。現代的遙控器,主要是由集成電路電板和用來產生不同訊息的按鈕所組成。下面一起來看看紅外遙控器原理以及遙控器原理圖吧。


紅外遙控器原理


紅外線遙控系統一般由發射器和接收器兩部分組成。發射器由指令鍵、指令信號產生電路、調制電路、驅動電路及紅外線發射器組成。當指令鍵被按下時,指令信號產生電路便產生所需要的控制信號,控制指令信號經調制電路調制後,最終由驅動電路驅動紅外線發射器,發出紅外線遙控指令信號。


接收器由紅外線接收器件、前置放大電路、解調電路、指令信號檢出電路、記憶及驅動電路、執行電路組成。當紅外接收器件收到發射器的紅外指令信號時,它將紅外光信號變成電信號並送到前置放大電路進行放大,再經過解調器後,由信號檢出電路將指令信號檢出,最後由記憶電路和驅動電路驅動執行電路,實現各種操作。


控制信號一般以某些不同的特徵來區分,常用的區分指令信號的特徵是頻率和碼組特徵,即用不同的頻率或者編碼的電信號代表不同的指令信號來實現遙控。所以紅外遙控系統通常按照產生和區分控制指令信號的方式和特徵分類,常分為頻分制紅外線遙控和碼分制紅外線遙控。



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語言編的

//ICC-AVR application builder : 5/12/2010 PM 5:48:11
// Target : M8
// Crystal: 8.0000Mhz

#include <iom8v.h>
#include <eeprom.h>
#include <ctype.h>
#include <stdio.h>
#include <macros.h>
#include <string.h>
#include <stdlib.h>
#include <eeprom.h>

#define uchar unsigned char
#define uint unsigned int
#define xtal 8

#define select_a_low (PORTD &=~(1<<7))
#define select_b_hi (PORTD |=(1<<4))
#define select_b_low (PORTD &=~(1<<4))
#define in_result (PINC )
#define raster (PINB & 0x08)
#define ir (PIND & 0x04)
#define pluse_hi (PORTB |=(1<<1))
#define pluse_low (PORTB &=~(1<<1))
#define press (PINB & 0x01)

extern int _textmode;

uchar key_code=0;
uchar new_code=0;
uint buf_key_code=0;
uchar key_bit_count=0;
uint count=0;
uint buf_count=0;
uchar common_code_count=0;
uchar ir_status=0;
uint total[50];
uchar temp=0;
uchar mm=0;
uchar tp1=0;
unsigned long full=0;
uint all=0;
uchar n=0;

void process(uchar ak);

void port_init(void)
{
PORTB = 0xFF;
DDRB = 0xFE;
PORTC = 0x7F; //m103 output only
DDRC = 0x7F;
PORTD = 0xFF;
DDRD = 0x00;
}

void delay_10us(uchar y)
{
uchar x;
for(x=y;x>0;x--)
;
}

//Watchdog initialize
// prescale: 2048K
void watchdog_init(void)
{
WDR (); //this prevents a timeout on enabling
WDTCR |= (1<<WDCE) | (1<<WDE);/* 30-Oct-2006 Umesh*/
WDTCR = 0x0F; //WATCHDOG ENABLED - dont forget to issue WDRs
}

//TIMER0 initialize - prescale:8
// desired value: 50uSec
// actual value: 50.000uSec (0.0%)
void timer0_init(void)
{
TCCR0 = 0x00; //stop
TCNT0 = 0xCE; //set count
TCCR0 = 0x02; //start timer
}

#pragma interrupt_handler timer0_ovf_isr:iv_TIM0_OVF
void timer0_ovf_isr(void)
{
//uint a;

count++;
/*
a=count%2;
if(a==0)
pluse_low;
else
pluse_hi;
*/
TCNT0 = 0xCE; //reload counter value
}

//UART0 initialize
// desired baud rate: 9600
// actual: baud rate:9615 (0.2%)
void uart0_init(void)
{
UCSRB = 0x00; //disable while setting baud rate
UCSRA = 0x00;
UCSRC = BIT(URSEL) | 0x06;
UBRRL = 0x33; //set baud rate lo
UBRRH = 0x00; //set baud rate hi
UCSRB = 0x18;
}

int putchar(char c)
{
if (_textmode && c == '\n')
putchar('\r');
while (!(UCSRA & (1<<UDRE))) // UDRE, data register empty
;
UDR = c;
return c;
}
void all_zero(void)
{
uchar i;
for(i=0;i<48;i++)
{

total[i]=0;
}
}

void initialize_eeprom(void)
{

all_zero();
timer0_init();

count=0;

}

void display(void)
{
uint i,k,m,w;
uchar s,r,t;
/*
for(i=0;i<35;i++)
printf("total[%d]=%d\r\n",i,total[i]);
*/
m=15;
for(i=0;i<10;i++)
{
if(total[i]>230)
{

m=i;
i=12;
}
}
k=0;

if(0)
{
for(i=0;i<35;i++)
printf("total[%d]=%d\r\n",i,total[i]);
}

//printf("m=%d\r\n",m);
if(m<10)
{
for(i=(m+1);i<(17+m);i++)
{
if(total[i]>18 && total[i]<25)
k>>=1;
if(total[i]>39 && total[i]<45)
{
k>>=1;
k|=0x8000;

}
}

w=0;/*
for(i=(m+17);i<(27+m);i++)
{
if(total[i]>18 && total[i]<25)
w>>=1;
if(total[i]>39 && total[i]<45)
{
w>>=1;
w|=0x8000;

}

}
w>>=6;
printf("K=0x%X total[1]=%d w=0x%x\r\n",k,total[1],w); */
s=0;
for(i=(m+17);i<(25+m);i++)
{
if(total[i]>18 && total[i]<25)
s>>=1;
if(total[i]>39 && total[i]<45)
{
s>>=1;
s|=0x80;

}
}

r=0;
for(i=(m+25);i<(33+m);i++)
{
if(total[i]>18 && total[i]<25)
r>>=1;
if(total[i]>39 && total[i]<45)
{
r>>=1;
r|=0x80;

}

}

t=255-r;
n=0;
if(t==s)
{
printf("s=ox%x, r=0x%x, t=0x%x\r\n",s,r,t);
tp1=12;
switch(s)
{
case 0x43:
n=0x12;

break;

case 0x47:
n=0x16;

break;

case 0x42:
n=0x01;

break;

case 0x41:
n=0x02;

break;

case 0x40:
n=0x03;

break;

case 0x46:
n=0x04;

break;

case 0x45:
n=0x05;

break;

case 0x44:
n=0x06;

break;

case 0x4a:
n=0x07;

break;

case 0x49:
n=0x08;

break;

case 0x48:
n=0x09;

break;
case 0x4e:
n=0x0a;

break;
case 0x4d:
n=0x0;

break;
case 0x4c:
n=0x1a;

break;

case 0x14:
n=0x13;

break;

case 0x16:
n=0x17;

break;

case 0x1d:
n=0x14;

break;

case 0x11:
n=0x10;

break;

case 0x15:
n=0x0e;

break;

}

}

}
}

#pragma interrupt_handler int0_isr:iv_INT0
void int0_isr(void)
{

if(temp==56)
{
if(count>240)
{

total[0]=count;
count=0;
temp=57;
mm=1;

}
}
else
{
total[mm]=count;
count=0;
mm++;

if(mm>34)
{

CLI();
display();

temp=0;
mm=0;
CLI();
all_zero();
}

}

}

//TIMER1 initialize - prescale:8
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 50uSec
// actual value: 50.000uSec (0.0%)
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0xFF; //setup
TCNT1L = 0xCE;
OCR1AH = 0x00;
OCR1AL = 0x32;
OCR1BH = 0x00;
OCR1BL = 0x32;
ICR1H = 0x00;
ICR1L = 0x32;
TCCR1A = 0x00;
TCCR1B = 0x02; //start Timer
}

#pragma interrupt_handler timer1_ovf_isr:iv_TIM1_OVF
void timer1_ovf_isr(void)
{
//TIMER1 has overflowed
TCNT1H = 0xFF; //reload counter high value
TCNT1L = 0xCE; //reload counter low value
full++;

}

//TIMER2 initialize - prescale:8
// WGM: Normal
// desired value: 108uSec
// actual value: 108.000uSec (0.0%)
void timer2_init(void)
{
TCCR2 = 0x00; //stop
ASSR = 0x00; //set async mode
TCNT2 = 0x94; //setup
OCR2 = 0x6C;
TCCR2 = 0x02; //start
}

#pragma interrupt_handler timer2_ovf_isr:iv_TIM2_OVF
void timer2_ovf_isr(void)
{
TCNT2 = 0x94; //reload counter value
all++;
}

//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
//watchdog_init();
timer0_init();
uart0_init();

MCUCR = 0x02;
GICR = 0x40;
TIMSK = 0x45; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}

void full_delay(unsigned long b)
{
full=0;
timer1_init();
while(1)
{
if(full>=b)
{
full=0;
TCCR1B = 0x00; //stop timer1
break;
}

}
}

void timer2_delay(uint b)
{

while(1)
{
if(all>(b-1))
{
all=0;
TCCR2 = 0x00; //stop timer2
break;
}

}
}

void zero_one(uint a)
{
uint b;

if(!a)
{
pluse_hi;
b=696/50;
full_delay(b);

pluse_low;
b=348/50;
full_delay(b);

}
else
{
pluse_hi;
b=696/50;
full_delay(b);

pluse_low;
b=1409/50;
full_delay(b);
}

}

void process(uchar ak)
{
uint b,m,i,a,k;
uchar ok;
SEI();
TCCR1B = 0x00; //stop timer1
full=0;
all=0;

pluse_hi;
b=8344/50;
timer2_init();
full_delay(b);

pluse_low;
b=3915/50;
full_delay(b);

m=0x611c;

for(i=0;i<16;i++)
{
a=m & 0x0001;
zero_one(a);
m>>=1;
}
m=0x3dc;
for(i=0;i<10;i++)
{
a=m & 0x0001;
zero_one(a);
m>>=1;
}

ok=255-ak;
k=ok;
k<<=8;
k|=ak;
m=k;
//printf("k=%x\r\n",k);
for(i=0;i<16;i++)
{
a=m & 0x0001;
zero_one(a);
m>>=1;
}

pluse_hi;
b=696/50;
full_delay(b);

pluse_low;
timer2_delay(978);

pluse_hi;
b=8344/50;
full_delay(b);

pluse_low;
b=3915/50;
full_delay(b);

pluse_hi;
b=696/50;
full_delay(b);

pluse_low;

while(!press)
{
;
}

CLI();
}

void main(void)
{
uint a,b,m;
uint k,msg;

init_devices();
delay_10us(1000);
printf("count1=%d\r\n",count);

timer0_ovf_isr();
CLI();
b=0;
m=0;
pluse_low;
tp1=0;
while(1)
{

if(!ir && temp==0 && a==12)
{
a=0;
initialize_eeprom();
temp=56;
count=0;
mm=0;
TCCR2 = 0x00; //stop TIMER2
TCCR1B = 0x00; //stop timer1
//printf("game_start\r\n");
SEI();
}

if(tp1==12)
{
printf("n=%x\r\n",n);
process(n);
all_zero();
CLI();
tp1=0;
}

if(ir)
a=12;

k++;
if(k>30000)
{
msg++;
k=0;
}

if(!ir)
{
msg=0;

}

if( msg>10)
{
all_zero();
msg=0;
temp=0;
CLI();
printf("time out\r\n");
}

if(!press )
{

process(0x08);
}

}

}

㈨ 求一個最簡單的紅外遙控電路高分。

你好:

——★1、電路圖中的右上角,是12V繼電器觸點的符號。K1是12V繼電器的線圈。

——★2、這個紅外線發射、接收電路圖,是最簡單的。但需要專用的紅外光敏管(圖中的Q1),否則會出現嚴重的(普通光線)干擾。

——★3、控制「LED做出反應」不需要繼電器。請看附圖。

——★4、原圖中「OUTPUT」是輸出的英文,是繼電器的觸點。

閱讀全文

與單片機紅外接收電路圖相關的資料

熱點內容
程序員賓利 瀏覽:730
初一編程軟體教學 瀏覽:917
ftp伺服器的地址是哪個 瀏覽:14
圖像模糊處理演算法 瀏覽:33
法國啄木鳥電影有哪些 瀏覽:579
javanio內存 瀏覽:549
react源碼有多長 瀏覽:60
聖經舊約電影 瀏覽:704
你經常去電影院嗎英文翻譯 瀏覽:202
androidzip換膚 瀏覽:761
按f8怎麼進命令行界面 瀏覽:607
dn20加密防盜閥 瀏覽:366
金剛鐵拳電影 瀏覽:223
小說納米程序員 瀏覽:309
國外一個換腦子的電影 瀏覽:507
安卓開屏壁紙怎麼設置 瀏覽:582
加密ceb轉pdf 瀏覽:234
《英語老師》李采譚 瀏覽:926
邵氏電影全集恐怖片 瀏覽:740
呂賓的電影作品有哪些 瀏覽:919