A. 用單片機如何作紅外線的接收
你好,我研究過紅外線,網上有賣紅外一體化接收頭的,大概8毛錢一個,它有三個引腳,分別是電源、地、還有信號端。信號端接單片機外部中斷0或外部中斷1,我編過相應的程序,用紅外遙控控制數碼管的顯示,按幾號鍵顯示幾。
B. 紅外感測器怎麼接到單片機上
將該感測器的輸出埠的信號,經過電路的處理後,達到單片機工作電壓范圍時,可有兩種方法實現於單片機的連接。
方法一:將處理後的信息接在51或52系列單片機的P3.2或P3.3口的外部中斷埠,對中斷定時器的IE=0X81或IE=0X84;TCON=0X01或TCON=0X04,在中斷子程序中可以讀數據進行處理顯示;
方法二;同上,將處理後的數據埠,接到普通的埠,即,該埠做基本的輸出用的情況不需要對埠強拉高,而,做輸入用時要對基本埠拉高,然後利用相關程序處理顯示即可。
C. 如何用單片機控制紅外對管檢測物體,詳細點,有圖最好
這個很簡單:你既然是對管,那麼,當有物體通過您的對管之間時,就擋住了您的紅外接收器通過發射器發過來的光,這樣接收端就產生信號變化,您檢測到這個信號變化就+1就可以了。這樣就知道多少個物體過去啦。
D. 紅外感測器和單片機之間怎麼連接
紅外感測器和單片機之間的連接方法:
紅外感測器絕大部分都是通過測引腳電壓換算成距離。所以一般紅外都有三根引腳,VCC和GND肯定會接噻,然後信號線接到你開啟單片機的ADC通道對應的引腳,讀該引腳的電平換算成距離。
紅外感測器如果是數據信號,有幾個腳,就用單片機幾個腳連接,然後根據輸出信號的時序寫程序讀。如果是模擬信號,就得用到A/D轉換電路。
(4)單片機紅外擴展閱讀:
紅外感測器的相關要求規定:
1、紅外線感測器利用遠紅外線范圍的感度做為人體檢出用,紅外線的波長比可見光長而比電波短。紅外線只由熱的物體放射出來,凡是存在於自然界的物體,如人類、火、冰等等全部都會射出紅外線,只是其波長因其物體的溫度而有差異而已。
2、利用紅外輻射的熱效應,探測器的敏感元件吸收輻射能後引起溫度升高,進而使某些有關物理參數發生變化,通過測量物理參數的變化來確定探測器所吸收的紅外輻射。
3、紅外感測器已經在現代化的生產實踐中發揮著它的巨大作用,隨著探測設備和其他部分的技術的提高,紅外感測器能夠擁有更多的性能和更好的靈敏度。
E. 單片機紅外
雖然你的程序寫的很工整,但是你的編程思路不對。
1.你的顯示函數,很明顯你用的是動態掃描,但是你卻用單個數碼管的控制方法。當然有可能你的電路跟我預計的不同,所以把線路圖一塊發上來。
2.中斷函數,寫的問題比較大,首先中斷函數里不要有處理的內容,還有在中斷函數函數中定義的變數是不能保持的,再有不知道你為什麼一直在用while判斷一個變數,中斷函數會自動判斷外部埠的變化的,你只需要加入中斷變化響應後的代碼就可以
F. c51單片機紅外NEC編碼解碼!
這個程序太簡單了,我之前寫過紅外發射程序的,接收程序也很簡單,你這個項目我2個小時都能幫你解決,但是89C52單片機發射38K不準需要把晶振加大,提高單片機的運行速度。
你的項目只要主機A發射紅外協議後面加一個地址,單片機B接收的時候全部進入接收狀態,判接收的地址是否符合對於單片機B的地址,如果地址符合,那就先回應一個數據例如:55FF55,主機接收到55FF55後後面開始接收數據,把接收到的數據直接寫入單片機內EEPRM裡面!
G. 單片機紅外脈沖程序
//這一段是用來檢測紅外脈沖的低電平時間的
unsigned int Ir_Get_Low()
{
TL1=0; //清0計數器低8位
TH1=0; //清0計數器高8位
TR1=1; //打開計數器
while(!Ir_Pin && (TH1&0x80)==0); //如果IR管腳一直為低電平就一直在這里等待,讓計數器一直計數
TR1=0; //管腳為高電平時關閉計數器
return TH1*256+TL1; //返回計數值,高8位乘256因為2的8次方為256
H. 51單片機 紅外
你要檢測什麼東西。物體就用反射型光電開關或對射型的,要是人體就用人體紅外開關
I. 單片機的紅外發射模塊怎麼用。。
你是要搞解碼,還是編碼呢,如果是發送因該是編碼
#include<reg52.h>
#include<INTRINS.H>
//定義硬體介面
#define KEY P1
#define Key_State_0 0
#define Key_State_1 1
#define Key_State_2 2
#define unlock 1
#define lock 0
sbit IR_OUT = P2^0;
unsigned char time_1ms_flag,display_flag,IR_data,IR_data_R;
bit key_debounce_flag,key_debounce,timer2_c_flag;
unsigned char key_state,key_debounce_C,key_num,key_num_temp,key_temp,key_R,key_attion;
void delay1s(void)
{
unsigned char a,b,c;
for(c=167;c>0;c--)
for(b=171;b>0;b--)
for(a=16;a>0;a--);
_nop_();
}
void T2_INT(void)
{
RCAP2H=(0xFFFF-1000)/256;
RCAP2L=(0xFFFF-1000)%256;//12MHz晶振下定時1ms,自動重裝
TH2=RCAP2H;
TL2=RCAP2L; //定時器2賦初值
//T2CON=0; //配置定時器2控制寄存器,這里其實不用配置,T2CON上電默認就是0,這里賦值只是為了演示這個寄存器的配置
//T2MOD=0; //配置定時器2工作模式寄存器,這里其實不用配置,T2MOD上電默認就是0,這里賦值只是為了演示這個寄存器的配置
//IE=0xA0; //1010 0000開總中斷,開外定時器2中斷,可按位操作:EA=1; ET2=1;
ET2=1;
TR2=1; //啟動定時器2
EA = 1;
}
void delay4ms500us(void) //誤差 0us
{
unsigned char a,b,c;
for(c=3;c>0;c--)
for(b=136;b>0;b--)
for(a=4;a>0;a--);
}
void delay560us(void) //誤差 0us
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=2;b>0;b--)
for(a=137;a>0;a--);
}
void delay1ms690us(void) //誤差 0us
{
unsigned char a,b;
for(b=241;b>0;b--)
for(a=2;a>0;a--);
}
void IR_CODE(void)
{
unsigned char j;
IR_data_R=~IR_data;
IR_OUT=1;
delay4ms500us();
delay4ms500us();
IR_OUT=0;
delay4ms500us();
for(j=0;j<16;j++)
{
IR_OUT=1;
delay560us();
IR_OUT=0;
delay560us();
}
for(j=0;j<8;j++)
{
if(IR_data&0x01)
{
IR_OUT=1;
delay560us();
IR_OUT=0;
delay1ms690us();
}
else
{
IR_OUT=1;
delay560us();
IR_OUT=0;
delay560us();
}
IR_data>>=1;
}
for(j=0;j<8;j++)
{
if(IR_data_R&0x01)
{
IR_OUT=1;
delay560us();
IR_OUT=0;
delay1ms690us();
}
else
{
IR_OUT=1;
delay560us();
IR_OUT=0;
delay560us();
}
IR_data_R>>=1;
}
}
void play_attion(void)
{
if(key_attion==16)
{
key_attion=0;
IR_data=0x0f;
IR_CODE();
}
if(key_attion==15)
{
key_attion=0;
IR_data=0x0e;
IR_CODE();
}
if(key_attion==14)
{
key_attion=0;
IR_data=0x0d;
IR_CODE();
}
if(key_attion==13)
{
key_attion=0;
IR_data=0x0c;
IR_CODE();
}
if(key_attion==12)
{
key_attion=0;
IR_data=0x0b;
IR_CODE();
}
if(key_attion==11)
{
key_attion=0;
IR_data=0x0a;
IR_CODE();
}
if(key_attion==10)
{
key_attion=0;
IR_data=0x09;
IR_CODE();
}
if(key_attion==9)
{
key_attion=0;
IR_data=0x08;
IR_CODE();
}
if(key_attion==8)
{
key_attion=0;
IR_data=0x07;
IR_CODE();
}
if(key_attion==7)
{
key_attion=0;
IR_data=0x06;
IR_CODE();
}
if(key_attion==6)
{
key_attion=0;
IR_data=0x05;
IR_CODE();
}
if(key_attion==5)
{
key_attion=0;
IR_data=0x04;
IR_CODE();
}
if(key_attion==4)
{
key_attion=0;
IR_data=0x03;
IR_CODE();
}
if(key_attion==3)
{
key_attion=0;
IR_data=0x02;
IR_CODE();
}
if(key_attion==2)
{
key_attion=0;
IR_data=0x01;
IR_CODE();
}
if(key_attion==1)
{
key_attion=0;
IR_data=0x00;
IR_CODE();
}
}
void main (void)
{
delay1s();
P1=0x0F;
T2_INT();
IR_OUT =0;
while(1)
{
play_attion();
}
}
void timer2() interrupt 5
{
//!!!注意!!! 定時器2必須由軟體對溢出標志位清零,硬體不能清零,這里與定時器0和定時器1不同!!!
TF2=0;
switch(key_state)
{
case Key_State_0:
if(KEY!=0x0F)
{
key_state = Key_State_1;
key_debounce_flag = unlock;
KEY=0x7F;
key_temp=KEY;
if(key_temp==0x7E){key_num_temp=4;}
if(key_temp==0x7D){key_num_temp=8;}
if(key_temp==0x7B){key_num_temp=12;}
if(key_temp==0x77){key_num_temp=16;}
KEY=0xBF;
key_temp=KEY;
if(key_temp==0xBE){key_num_temp=3;}
if(key_temp==0xBD){key_num_temp=7;}
if(key_temp==0xBB){key_num_temp=11;}
if(key_temp==0xB7){key_num_temp=15;}
KEY=0xDF;
key_temp=KEY;
if(key_temp==0xDE){key_num_temp=2;}
if(key_temp==0xDD){key_num_temp=6;}
if(key_temp==0xDB){key_num_temp=10;}
if(key_temp==0xD7){key_num_temp=14;}
KEY=0xEF;
key_temp=KEY;
if(key_temp==0xEE){key_num_temp=1;}
if(key_temp==0xED){key_num_temp=5;}
if(key_temp==0xEB){key_num_temp=9;}
if(key_temp==0xE7){key_num_temp=13;}
KEY=0x0F;
}
break;
case Key_State_1:
if(key_debounce==1)
{
key_debounce = 0;
KEY=0x7F;
key_temp=KEY;
if(key_temp==0x7E){key_num=4;}
if(key_temp==0x7D){key_num=8;}
if(key_temp==0x7B){key_num=12;}
if(key_temp==0x77){key_num=16;}
KEY=0xBF;
key_temp=KEY;
if(key_temp==0xBE){key_num=3;}
if(key_temp==0xBD){key_num=7;}
if(key_temp==0xBB){key_num=11;}
if(key_temp==0xB7){key_num=15;}
KEY=0xDF;
key_temp=KEY;
if(key_temp==0xDE){key_num=2;}
if(key_temp==0xDD){key_num=6;}
if(key_temp==0xDB){key_num=10;}
if(key_temp==0xD7){key_num=14;}
KEY=0xEF;
key_temp=KEY;
if(key_temp==0xEE){key_num=1;}
if(key_temp==0xED){key_num=5;}
if(key_temp==0xEB){key_num=9;}
if(key_temp==0xE7){key_num=13;}
KEY=0x0F;
if(key_num_temp==key_num)
{
key_state = Key_State_2;
key_R=key_num;
key_num=0;
key_num_temp=0;
}
else
{
key_state = Key_State_0;
}
}
break;
case Key_State_2:
{
if(KEY==0x0F)
{
key_state = Key_State_0;
key_attion=key_R;
/*
if(key_attion==12){out_flag=0;}
else
{
out_flag=1;
}out_flag=1;*/
//code
}
}
}
if(key_debounce_flag==unlock)
{
key_debounce_C++;
if(key_debounce_C==16)
{
key_debounce_C = 0;
key_debounce_flag = lock;
key_debounce = 1;
}
}
}
J. 51單片機怎麼用紅外線
--你是指紅外遙控解碼吧,給你一點提示,在單片機定義一個I/O口為紅外遙控的輸入埠,(紅外遙控解碼不一定要用到定時器和中斷方式.具體方法有很多的,看場合選取)當然輸入這個埠的信號是經過遙控接收電路處理過的一串數據,如TTL或者CMOS電平。再然後就是對這個輸入信號進行處理,也就是解調出遙控碼值出來,要解這個碼,首先又要知道其波形如何,即是邏輯電平和時序等問題...
建議你還是先熟知一下各種IR的遙控協議,有挺多的,典型的有NEC,飛利浦等。說說NEC的也有兩種,簡單的一種就是有32位數據,前16bit為地址碼,後16bit為遙控碼值的正碼與反碼,地址碼用於區分相同協議下不同的遙控所帶來的干擾等,正碼和反碼用於解調後進行校驗數據。不多說了,主要是找點相關資料研究研究就明白了。圖片是一個32bitNEC的遙控波形,這個波形的地址碼是807F,正碼是0x12,如果看懂了,用MCU解遙控碼就很容易了..