1. 實驗目的:
掌握利用紅外線實現數據傳輸的原理和方法。
2.試驗內容:
利用兩塊實驗板,利用紅外線實現實驗板A向實驗板B發送數據。并將發送和接收的數據顯示在數碼管上。
3. 硬件連接:
本實驗主要涉及到紅外模塊與數碼管模塊,確保紅外模塊中的發送和接收跳線都連接正確,同時確保數碼管模塊中的跳線連接正確。
4.試驗原理圖:
硬件原理:
利用串口來處理數據,將串口數據利用紅外發射管發送,將紅外接收管接收到的數據取反后再送回串口處理,處理后還原得到發送的數據。利用串口處理數據,簡化了數據的分解,組合,載波等一系列復雜操作,使得紅外通信大大簡單化。
軟件原理:
利用串口來發送和接收數據,大大簡化了程序的設計,將數據通過串口發送,在將收到的數據送數碼管顯示。由于紅外傳輸并不可*,可能丟失數據,在實驗的過程中我們可以觀測到,可*的數據傳輸我們暫不考慮,在下一試驗中會詳細討論這個問題。
5.實驗步驟:
1.連接紅外模塊中的發送和接收條線。
2. 在Keil中編寫程序,利用紅外線發送和接收數據,并將接收到的數據在數碼管上顯示出來。
3. 將編譯好的程序下載到實驗箱上驗證程序的正確性。
6.思考題:
1:簡析紅外探測的優點和缺點及實用范圍。
2:怎樣利用紅外探測原理來設計一個完整的防盜報警器?
下面是程序代碼:
下面是程序代碼:
/**********************************Copyright (c)********************************* ;** 西南科技大學計算機學院 ;** ;** ;** 日期: 2005.5.10 ;** 描述: 紅外數據通信實驗,本程序也通過調試,僅供參考。 ;** 實驗內容: 利用紅外線傳輸數據 ;** 適用機型: AT89S52 *********************************************************************************/ #include <at89x52.h> //定義芯片特殊功能寄存器的頭文件 #define uchar unsigned char uchar Send_data[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07 ,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; uchar count=0x00; //計時變量 uchar ptr=0x00; //取數指針 uchar Receive_data; //接收到的數據 /******************************************************* 名稱: 初始化運行環境 功能: 初始化各寄存器與端口狀態 設置串口工作方式,波特率 3138 參數: 無 返回值:無 *******************************************************/ void DeviceInit(void) { TL0=0xC0; //置定時器處置,設置中斷時間為20ms TH0=0x63; TMOD=0x01; //設定定時器/計數器0工作方式為1 IE=0x92; //允許全局中斷,允許定時器/計數器0溢出中斷,允許串口接收終端 T2CON = 0x39; //設置定時器2的工作模式為波特率發生器方式, RCAP2H = 0xFF; //設置波特率為3138Hz RCAP2L = 0x11; SCON = 0x50; //設置串口工作方式為方式1 TR2 = 0x01; //啟動定時器2*/ TR0=0x01; //啟動定時器/計數器0 P1=0xFE; } /******************************************************* 名稱: 發送模塊 功能: 利用串口發送1個字符 參數: 無 返回值:無 *******************************************************/ void SendChar(uchar dat) { SBUF=dat; //發送數據送發送緩沖區 while(TI==0); //等待發送完成 TI=0; //置發送完成標志 } /******************************************************* 名稱: 接收中斷模塊 功能: 將接收到的數據保送數碼管顯示 參數: 無 返回值:無 *******************************************************/ void Receive (void) interrupt 4 { if(RI) //當接收終端標志設立時,開始讀取接收到的數據 { RI = 0; //清除接收終端標志 Receive_data=SBUF; //將接收到的數據送緩沖區保存 P0=Receive_data; //顯示接收到的數據 } } /******************************************************* 名稱: 定時器中斷模塊 功能: 每隔一秒發送一個數據 參數: 無 返回值:無 *******************************************************/ void Timer0Over(void) interrupt 1 { count++; if(count==0x32) //每隔相同時間發送一個數據 { if(ptr<=15) { SendChar(Send_data[ptr]); ptr++; } else { SendChar(Send_data[0]); ptr=0x01; } count=0x00; //計時清零 } TL0=0xC0; //中斷時間20ms TH0=0x63; } /******************************************************* 名稱: 主函數 功能: 應用程序入口 參數: 無 返回值:無 *******************************************************/ void main() { DeviceInit(); //初始化定時器0與串口 while(1); }