红外收发实验 一 实验目的 了解红外通信知识,能够应用红外线模块进行无线控制设计。 二 实验设备及器材 PC 1台 DP-51PROC单片机综合仿真实验仪 1台 三 实验内容 使用单片机的串口发送并接收数据,TXD接到红外发射管,RXD接到红外接收头,实现无线通讯。 四 红外收发原理 红外通信是利用950nm近红外波段的红外线作为传递信息的媒体。发送端将二进制信号调制为一系列的脉冲串信号,通过红外发射管发射红外信号。接收端将接收到的光脉冲转换成电信号,再经过放大,滤波等处理后送到解调电路进行解调,还原为二进制数字信号后输出。简而言之,红外通信的实质就是对二进制数字信号进行调制与解调,以便利用红外信道进行传输。 本实验的红外收发示意图如图4-30所示,通过硬件电路完成了对输入数据的调制,将调制的信号转换为光信号通过红外发射管发送数据,由红外接收头接收数据并完成对数据的调解。解调后的数据由单片机进行处理。实验仪B2区的1/512频率输出端输出用于信号调制的约为38kHz的时钟信号。 一般红外接收模块的解调频率为38kHz。当它接收到38kHz左右的红外信号时,将输出低电平,但连续输出低电平的时间是有限制的,也就是说,发送数据低电平宽度是有限制的。注意发射管应与接收头平齐,否则接收头可能接收不到来自发射管的反射光。
五 实验原理图 由于Proteus元件库中无红外发射和接收的仿真元件,所以该实验无法在Proteus软件中仿真调试,可搭试电路直接在实物板调试。红外收发的电路设计原理图4-31所示。
图4-31 红外收发电路设计原理图 红外接收头模块 六 实验步骤 实验仪D3区红外收发电路原理图如图4-32所示。实验步骤如下: (1)B2区X2插入20MHz的晶振,接上B2区的JP20号跳线。 (2)将B2区的1/512频率输出端接到D3区的DCLK(约为38kHz,用于信号调制)。 (3)将A2区的RXD,TXD分别连接到D3区的DREC,DSEND。 (4)用短路线将D3区JP9短接(D3区电路供电电源)。 (5)将A2区的P10连接到D1区的LED1。 (6)断开A1区JP15的跳线232RXD,232TXD。 (7)下载程序并运行,使用较厚的白纸挡住红外发射管发射信号,使其反射到接收头,观察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控制口 //************向串口发送一字节数据*************// // 人口参数:dat要发送的数据 //********************************************// void UART_SendByte(uint8 dat) { SBUF=dat; //发送数据 while(0==TI); //等待发送完毕 TI=0; //清零TI标志 } //************接收一字节串口数据************// //入口参数:dat接受变量的地址指针 //出口参数:返回0表示没有数据,返回1表示接收到数据 //*****************************************// uint8 UART_RcvByte(uint8 *dat) { if(0==RI) return(0); //若没有接收到数据则返回0 *dat=SUBF; //取得接受的数据 RI=0; //清除RI标志 return(1); } //************串口初始化***********************// //模式为1位起始位,8位数据位,1位停止位,波特率为9600 //晶振为11.0592MHz,使用T1作为波特率发生器 //********************************************// void UART_Tnit(void) { SCON=0x50; TMOD=0x20; TH1=0xFA; TR1=1; } //**************主函数************************// //初始化串口后不断地发送及接收数据,若接收到所发送的数据则点亮LED //*******************************************// int main(void) { uint8 i; uint16 j; uint8 rcv_dat; uint8 count; UART_Tnit(); 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 |