红外收发实验
一. 实验目的
了解红外通讯知识,能够应用红外进行无线控制设计。
二. 实验设备及器件
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) 红外通讯的距离与什么因素有关?使用两台实验仪进行测试,一台发送,另一
台接收。
评论
查看更多