微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > MCU和DSP > 基于单片机的主从红外通信系统的研究与设计

基于单片机的主从红外通信系统的研究与设计

时间:11-04 来源:互联网 点击:
1、引言

红外通信是目前比较常用的一种无线数据传输手段,其具有无污染、信息传输稳定、信息安全性高以及安装使用方便等优点,并且可以在很多场合应用,如家电产品,工业控制、娱乐设施等领域。红外通信是利用950nm近红外波段的红外线作为传递信息的载体,通过红外光在空中的传播来传递信息,由红外发射器和接收器实现。发射端将二进制数字信号调制成某一频率的脉冲序列,经电光转换电路,驱动红外发射管以光脉冲的形式发送到空中。接收端将接收到的光脉冲转换成电信号,再经解调和译码后恢复出原二进制数字信号。本文设计了一种基于单片机PIC18F248的主从式红外通信系统,主要设计了红外接口电路以及主机和从机通信软件流程。

2、系统硬件电路设计

在主从式红外通信系统中,主机及从机的红外发射电路相同,红外线的载波频率都为38KHz,在同一时间内,可以是主机发射,从机接收;或者从机发射,主机接收。

2.1 红外发射电路设计

红外发射器电路主要由单片机,驱动管Q1和Q2、红外发射管D1等组成,电路如下:



红外发射器工作原理为:单片机通过I/O端口控制整个发射过程。其中,红外载波信号采用频率为38KHz的方波,由PIC18F248的CCP模块的PWM功能实现,并由CCP1端口传输到三极管T2的基极。待发送到数据由单片机的TX端口以串行方式送出并驱动三极管Q1,当TX为“0”时使Q1管导通,通过Q2管采用脉宽调制(PWM)方式调制成38KHz的载波信号,并由红外发射管D1以光脉冲的形式向外发送。当TX为“1”时使Q1管截止,Q2管也截止,连接Q1和Q2的两个上拉电阻R1和R3把三极管的基极拉成高电平,分别保证两个三极管可靠截止,红外发射管D1不发射红外光。因此通过待发送数据的“0”或“1”就可控制调制后两个脉冲串之间的时间间隔,即调制PWM的占空比。比如若传送数据的波特率为1200bps,则每个数位“0”就对应32个载波脉冲调制信号。红外发射管D1采用TSAL6200红外发射二极管,其实现将电信号转变成一定频率的红外光信号,它发射一种时断时续的高频红外脉冲信号,由于脉冲串时间长度是恒定的,根据脉冲串之间的间隔大小就可以确定传输的数据是“0”还是“1”。

2.2 红外接收电路设计
红外接收电路主要采用Vishay公司的专用红外接收模块HS0038B。接收电路及HS0038B内部结构如下:





接收电路工作原理为:当接收到载波频率为38KHz的脉冲调制信号时,首先,HS0038B内的红外敏感元件将脉冲调制红外光信号转换成电信号,再由前置放大器和自动增益控制电路进行放大处理,然后通过带通滤波器进行滤波,滤波后的信号由解调电路进行解调,最后由输出电路进行反向放大并输出低电平;未接收到载波信号时,电路则输出高电平。这样就可以将断断续续的红外光信号解调成一定周期的连续方波信号,并通过单片机的串口输入单片机,由单片机处理后便可以恢复出原始数据信号。

3、主从式红外通信软件设计

主从式红外通信中主机红外接收、发送电路与从机的电路完全相同,红外线的载波频率也相同。在红外通信系统中,若采用不同载波频率来区分主机及从机之间的通信可以通过改善红外发射和接收电路的频率特性,但是这样会大大提高硬件成本,本系统通过配置适当的通信协议来降低硬件成本。为了避免发射时造成对本机的干扰,系统采用异步半双工通信模式,在同一时间内可以是主机发送,从机接收;也可以是从机发射,主机接收。主机及从机通信流程如下:



主机通信过程为:(1) 上电初始化,完成UART的工作模式、波特率的设置(系统波特率为2400bps);CCU模块PWM工作模式、PWM频率设定。CCU模块工作在对称的、非反向的PWM模式,频率38KHz,占空比50%;(2) 等待数据发送控制信号到来;(3) 若接收到发送控制信号,则立即通过红外串行发送16字节数据;(4) 通过红外接口接收从机返回的16字节数据;(5) 比较接收到的16字节与发送到16字节数据,若一致则发送下一个数据,否则重发该数据。

从机通信过程为:(1) 上电初始化,完成UART的工作模式、波特率设置;CCU模块PWM工作模式、PWM频率设定;(2) 通过红外接口从主机接收16字节数据;(3) 判断是否为重发数据,若是则覆盖前次接收到的数据。

主机和从机通信过程包括的函数主要有系统初始化函数UART_Init(),向串口发送数据函数UART_SendByte()、 串口接收红外信号数据 UART_RcvByte( )等。部分函数程序代码如下:

UART_SendByte(unit8 dat) //向串口发送数据
{ SBUF = dat; //发送数据
while(TI = =0; // 等待发送完毕
TI = 0;
}
unit8 UART_RcvByte() //接收串口数据
{if(RI = =0) return(0); //若没有接收到数据,则返回0
*dat = SBUF;
RI = 0;
return(1);
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top