❶ 紅外發射 單片機 紅外接收
單片機一般都是 5V的,紅外先導通電壓一般在1.2V左右,你可以串一個220-560歐的電阻一灌流的方式連接在單片機任意一腳(如 P1.0)
接收頭3隻腳,一叫電源正,一腳電源負,一腳是信號腳直接接到單片機的 任意一腳(如 P3.2),這兩個東西功率都很低的,接收頭待機電流1毫安不到,接收的時候就10毫安左右。發射在電阻為220歐的時候電流也在20毫安不到,沒有問題的。
但我需要提示你的是,同一單片機即發送又接受肯定不行的,因為程序做不了,不比串口哦!所以我建議你用兩個來做(一個發,一個收),我用電視機遙控器來發送,單片機來接收,解碼,用來控制別的東西,效果不錯!!
❷ 單片機如何實現紅外遙控
以下文件是51單片機實現遙控解碼,通過數碼管顯示鍵碼的程序,P0口驅動數碼管段選,p2.6和p2.7為數碼管位選,接收頭連到P3.2口。此程序以通過驗證,可以直接編譯使用,另外還有一個繼電器和蜂鳴器的控制,不用可以屏蔽掉。
;********************************************************************************
;* 描述: *
;* 遙控鍵值讀取器 *
;* 數碼管顯示, P0口為數碼管的數據口 *
;* *
;********************************************************************************
;遙控鍵值解碼-數碼管顯示 *
;********************************************************************************/
#include <reg51.h>
#include <intrins.h>
void IR_SHOW();
void delay(unsigned char x);//x*0.14MS
void delay1(unsigned char ms);
void beep();
sbit IRIN = P3^2;
sbit BEEP = P3^7;
sbit RELAY= P1^3;
sbit GEWEI= P2^7;
sbit SHIWEI= P2^6;
unsigned char IRCOM[8];
unsigned char code table[16] =
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
main()
{
IE = 0x81; //允許總中斷中斷,使能 INT0 外部中斷
TCON = 0x1; //觸發方式為脈沖負邊沿觸發
delay(1);
IRIN=1;
BEEP=1;
RELAY=1;
for(;;)
{
IR_SHOW();
}
} //end main
void IR_IN() interrupt 0 using 0
{
unsigned char i,j,k,N=0;
EA = 0;
I1:
for (i=0;i<4;i++)
{
if (IRIN==0) break;
if (i==3) {EA =1;return;}
}
delay(20);
if (IRIN==1) goto I1; //確認IR信號出現
while (!IRIN) //等 IR 變為高電平
{delay(1);}
for (j=0;j<4;j++)
{
for (k=0;k<8;k++)
{
while (IRIN) //等 IR 變為低電平
{delay(1);}
while (!IRIN) //等 IR 變為高電平
{delay(1);}
while (IRIN) //計算IR高電平時長
{
delay(1);
N++;
if (N>=30) {EA=1;return;}
}
IRCOM[j]=IRCOM[j] >> 1;
if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}
N=0;
}//end for k
}//end for j
if (IRCOM[2]!=~IRCOM[3]) {EA=1;return;}
IRCOM[5]=IRCOM[2] & 0x0F;
IRCOM[6]=IRCOM[2] & 0xF0;
IRCOM[6]=IRCOM[6] >> 4;
beep();
EA = 1;
}
void IR_SHOW()
{
P0 = table[IRCOM[5]];
GEWEI = 0;
SHIWEI = 1;
delay1(4);
P0 = table[IRCOM[6]];
SHIWEI = 0;
GEWEI = 1;
delay1(4);
}
void beep()
{
unsigned char i;
for (i=0;i<100;i++)
{
delay(5);
BEEP=!BEEP;
}
BEEP=1;
}
void delay(unsigned char x)//x*0.14MS
{
unsigned char i;
while(x--)
{
for (i = 0; i<13; i++) {}
}
}
void delay1(unsigned char ms)
{
unsigned char i;
while(ms--)
{
for(i = 0; i<120; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
❸ VS1838B紅外接收頭單片機編碼原理是什麼具體點的!
首先紅外發射接收可以用串口。。
但是我先講個比較簡單的吧,剛開始你紅外發射假設你發的是01010101(八位),以450us的低電平和900us的高電平代表「0」;以450us的低電平和1200us的高電平代表「1」;如果發01010101
波形這個你應該可以想像吧?
然後接收的話你用一個以38khz為載波的紅外一體化接收頭(如:1838);
載波是需要加在發射端的,這個先不講;
先說接收吧,既然發送的一個0,那怎麼去檢測一個0呢?
就用一個外部中斷加上一個定時器可以吧?(51一般都這么用。如果有捕捉中斷的話如avr那就跟方便了,但原理一樣),外部中斷以下降沿觸發;當這個下降沿來的時候開始用定時器計時,一直計時到下一個下降沿,前面說的,(以450us的低電平和900us的高電平代表「0」;以450us的低電平和1200us的高電平代表「1」)如果我檢測到兩個下降沿之間的時間是1350us那是不是就代表是0,如果是1650us就是1,剩下的就同理了~~~不管你發幾位,都是一位發過來我就記錄一位,都記錄好就開始處理你先接收到0然後是1(01010101) 那我等到這個值後,是不是就代表一種編碼? 你也可以是00000000,或者11111111,你發射接收明白了就可以控制了。。。
❹ VS1838B紅外接收頭單片機編碼原理是什麼具體點的!
接收紅外遙控信號,並進行翻轉放大
比如遙控發送
4.5ms高4.5低作為頭碼,0.56高+0.565低為0;0.56高+1.69低為1
則VS1838B接收輸出為
4.5ms低+4.5高作為頭碼,0.56低+0.565高為0;0.56低+1.69高為1
判斷時間長短區分01就OK了