紅外收發實驗
一. 實驗目的
了解紅外通訊知識,能夠應用紅外進行無線控制設計。
二. 實驗設備及器件
IBM PC 機 一臺
DP-51PROC 單片機綜合仿真實驗儀 一臺
三. 實驗內容
使用單片機的串口發送并接收數據,TxD 接到紅外發送管,RxD 接到紅外接收頭,實現無線通訊。
四. 實驗要求
通過實驗掌握紅外通訊的基本原理。
五. 實驗步驟
1. B2 區X2 插入20MHz 的晶振。
2. 將B2 區的1/512 頻率輸出端接到D3 區的DCLK。(約為39KHz,用于信號調制)
3. 將A2 區的RXD、TXD 分別連接到D3 區的DREC、DSEND。
4. 用短路器將D3 區JP9 短接(D3 區電路供電電源)。
5. 將A2 區的P10 連接到D1 區的LED1。
6. 下載程序并運行,使用較厚的白紙擋住紅外發射管紅外信號,使其反射到接收頭,
觀察LED1 是否點亮。
圖3.36 紅外收發實驗示意圖
說明:一般紅外接收模塊的解調頻率為38KHz,當它接收到38KHz 左右的紅外信
號時將輸出低電平,但連續輸出低電平的時間是有限制的(如100mS),也就是說發送
數據的低電平寬度是有限制的。
注意:發送管應與接收頭平行,否則接收頭可能接收不到來自發射管的反射光。
六. 實驗預習要求
閱讀本書的2.8.27 節內容,理解本實驗硬件結構,編寫實驗程序,編譯連接后使
用DPFlash 軟件將HEX 文件下載到TKSMonitor51 仿真器中,再復位運行調試。
七. 實驗參考程序
/*************************************************************
* 文件名:DP_51PRO_IRDA.C
* 功能:DP_51PRO 實驗儀紅外收發實驗。使用串口發送數據經調制后從紅外管輸出,
* 并通過紅外接收模塊把接收到的數據返回串口接收端,通過判斷接收到的數
* 據來控制LED 燈的亮或滅。
*************************************************************/
#include <Reg52.H>
#define uint8 unsigned char
#define uint16 unsigned int
sbit LED_CON = P1^0; // 定義LED 控制口
/*************************************************************
* 名稱:UART_SendByte()
* 功能:向串口發送一字節數據。
* 入口參數:dat 要發送的數據
* 出口參數:無
*************************************************************/
void UART_SendByte(uint8 dat)
{ SBUF = dat; // 發送數據
while(TI ==0); // 等待發送完畢
TI = 0; // 清零TI 標志
}
/*************************************************************
* 名稱:UART_RcvByte()
* 功能:接收一字節串口數據。
* 入口參數:dat 接收變量的地址指針
* 出口參數:返回0 表示沒有數據,返回1 表示接收到數據
*************************************************************/
uint8 UART_RcvByte(uint8 *dat)
{ if(RI ==0) return(0); // 若沒有接收到數據則返回0
*dat = SBUF; // 取得接收的數據
RI = 0; // 清除RI 標志
return(1);
}
/*************************************************************
* 名稱:UART_Init()
* 功能:串口初始化。模式為1 位起始位,8 位數據位,1 位停止位,波特率為9600。
* 入口參數:無
* 出口參數:無
* 說明:晶振為11.0592MHz,使用T1 作為波特率發生器。
*************************************************************/
void UART_Init(void)
{ SCON = 0x50;
TMOD = 0x20;
TH1 = 0xFD;
TR1 = 1;
}
/*************************************************************
* 名稱:main()
* 功能:主函數,初始化串口后不斷地發送及接收數據,若接收到所發送的數據則
* 點亮LED。
*************************************************************/
int main(void)
{ uint8 i;
uint16 j;
uint8 rcv_dat;
uint8 count;
UART_Init();
while(1)
{ count = 0; // 計數變量清零
for(i=0; i<50; i++) // 發送及接收50 個數據
{ UART_SendByte(0x5A);
if( UART_RcvByte(&rcv_dat)!=0 )
{ if(0x5A==rcv_dat) count++;// 若接收的數據為0x5A,則計數變量加1
}
}
if(count>40) LED_CON = 0; // 若接收到0x5A 的個數大于40 個時,點亮LED
else LED_CON = 1; // 否則熄滅LED
for(j=0; j<500; j++);
}
return(0);
}
八. 實驗思考題
(1) 如何編寫其它編碼格式的通訊程序?
(2) 紅外通訊的距離與什么因素有關?使用兩臺實驗儀進行測試,一臺發送,另一
臺接收。
評論
查看更多