紅外收發(fā)實驗 一 實驗?zāi)康?/font> 了解紅外通信知識,能夠應(yīng)用紅外線模塊進(jìn)行無線控制設(shè)計。 二 實驗設(shè)備及器材 PC 1臺 DP-51PROC單片機(jī)綜合仿真實驗儀 1臺 三 實驗內(nèi)容 使用單片機(jī)的串口發(fā)送并接收數(shù)據(jù),TXD接到紅外發(fā)射管,RXD接到紅外接收頭,實現(xiàn)無線通訊。 四 紅外收發(fā)原理 紅外通信是利用950nm近紅外波段的紅外線作為傳遞信息的媒體。發(fā)送端將二進(jìn)制信號調(diào)制為一系列的脈沖串信號,通過紅外發(fā)射管發(fā)射紅外信號。接收端將接收到的光脈沖轉(zhuǎn)換成電信號,再經(jīng)過放大,濾波等處理后送到解調(diào)電路進(jìn)行解調(diào),還原為二進(jìn)制數(shù)字信號后輸出。簡而言之,紅外通信的實質(zhì)就是對二進(jìn)制數(shù)字信號進(jìn)行調(diào)制與解調(diào),以便利用紅外信道進(jìn)行傳輸。 本實驗的紅外收發(fā)示意圖如圖4-30所示,通過硬件電路完成了對輸入數(shù)據(jù)的調(diào)制,將調(diào)制的信號轉(zhuǎn)換為光信號通過紅外發(fā)射管發(fā)送數(shù)據(jù),由紅外接收頭接收數(shù)據(jù)并完成對數(shù)據(jù)的調(diào)解。解調(diào)后的數(shù)據(jù)由單片機(jī)進(jìn)行處理。實驗儀B2區(qū)的1/512頻率輸出端輸出用于信號調(diào)制的約為38kHz的時鐘信號。 一般紅外接收模塊的解調(diào)頻率為38kHz。當(dāng)它接收到38kHz左右的紅外信號時,將輸出低電平,但連續(xù)輸出低電平的時間是有限制的,也就是說,發(fā)送數(shù)據(jù)低電平寬度是有限制的。注意發(fā)射管應(yīng)與接收頭平齊,否則接收頭可能接收不到來自發(fā)射管的反射光。
五 實驗原理圖 由于Proteus元件庫中無紅外發(fā)射和接收的仿真元件,所以該實驗無法在Proteus軟件中仿真調(diào)試,可搭試電路直接在實物板調(diào)試。紅外收發(fā)的電路設(shè)計原理圖4-31所示。
圖4-31 紅外收發(fā)電路設(shè)計原理圖 紅外接收頭模塊 六 實驗步驟 實驗儀D3區(qū)紅外收發(fā)電路原理圖如圖4-32所示。實驗步驟如下: (1)B2區(qū)X2插入20MHz的晶振,接上B2區(qū)的JP20號跳線。 (2)將B2區(qū)的1/512頻率輸出端接到D3區(qū)的DCLK(約為38kHz,用于信號調(diào)制)。 (3)將A2區(qū)的RXD,TXD分別連接到D3區(qū)的DREC,DSEND。 (4)用短路線將D3區(qū)JP9短接(D3區(qū)電路供電電源)。 (5)將A2區(qū)的P10連接到D1區(qū)的LED1。 (6)斷開A1區(qū)JP15的跳線232RXD,232TXD。 (7)下載程序并運(yùn)行,使用較厚的白紙擋住紅外發(fā)射管發(fā)射信號,使其反射到接收頭,觀察LED1是否點亮。
七 實驗參考程序 1.匯編語言參考程序清單 LED_CON BIT P1.0 COUTE DATA 40H ORG 0000H LJMP MAIN ORG 0100H MAIN: MOV SP,#60H MOV SCON,0X50 MOV TMOD,#0x20 MOV TH1,0xFA SETB TR1 MAINLOOP: MOV COUTE,#0 MOV R7,#50 LOOP1: MOV SUBF,#0x5A JNB TI,$ CLR TI NOP NOP JB R2,LOOP2 SJMP LOOP3 LOOP2: CLR RI MOV A,SUBF CJNE A,#05AH,LOOP3 INC COUTE LOOP3: DJNZ R7,LOOP1 MOV A,COUTE SETB C SUBB A,#30 JC CLR_LED CLR LED_CON SJMP DELAY CLR_LED: SETB LED_CON DELAY: MOV R6,#200 DELAY1: MOV R5,#200 DJNZ R5,$ DJNZ R6,DELAY1 SJMP MAINLOOP END 2.C語言參考程序清單 #include<reg51.h> #define uint8 unsigned char #define uint16 unsigned int sbit LED_CON P1^0; //定義LED控制口 //************向串口發(fā)送一字節(jié)數(shù)據(jù)*************// // 人口參數(shù):dat要發(fā)送的數(shù)據(jù) //********************************************// void UART_SendByte(uint8 dat) { SBUF=dat; //發(fā)送數(shù)據(jù) while(0==TI); //等待發(fā)送完畢 TI=0; //清零TI標(biāo)志 } //************接收一字節(jié)串口數(shù)據(jù)************// //入口參數(shù):dat接受變量的地址指針 //出口參數(shù):返回0表示沒有數(shù)據(jù),返回1表示接收到數(shù)據(jù) //*****************************************// uint8 UART_RcvByte(uint8 *dat) { if(0==RI) return(0); //若沒有接收到數(shù)據(jù)則返回0 *dat=SUBF; //取得接受的數(shù)據(jù) RI=0; //清除RI標(biāo)志 return(1); } //************串口初始化***********************// //模式為1位起始位,8位數(shù)據(jù)位,1位停止位,波特率為9600 //晶振為11.0592MHz,使用T1作為波特率發(fā)生器 //********************************************// void UART_Tnit(void) { SCON=0x50; TMOD=0x20; TH1=0xFA; TR1=1; } //**************主函數(shù)************************// //初始化串口后不斷地發(fā)送及接收數(shù)據(jù),若接收到所發(fā)送的數(shù)據(jù)則點亮LED //*******************************************// int main(void) { uint8 i; uint16 j; uint8 rcv_dat; uint8 count; UART_Tnit(); while(1) { count=0; // 計數(shù)變量清零 for(i=0;i<50;i++) //發(fā)送及接收50個數(shù)據(jù) { UART_SendByte(0x5A); if(UART_RcvBYTE(&rcv_dat)!=0) { if(0x5A==rcv_dat) count++; //若接收的數(shù)據(jù)為0x5A |