关键词:串口 红外通信 虚拟逻辑分析仪
引言
红外通信技术是一种点对点的数据传输协议,是传统设备之间连接线缆的替代技术,是目前国际上普通采用的一种近程无线传输技术,常用于智能小区控制系统和电话教学交互式远程控制系统中,但是目前的家电(如空调、录像机、VCD机等)有各种不同的品牌和型号,其红外遥控编码及发送格式不尽相同。为了能够用一台通用控制器对多种不同型号的家电进行控制,本文利用功能强大的单片机和编程软件VB设计了一种基于计算机串口的通用型智能红外逻辑分析仪,它可对各种电器的红外遥控器所发射的控制信号进行识别、存贮和再现。还可通过红外硬件接口识别出红外信号并送入单片机处理,然后利用VB开发的虚拟软件在电脑屏幕上实时显示采集到的红外信号波形,便于设计人员对各种调制方式的红外信号进行“可视化”的分析与研究。
1 硬件设计
1.1 串行通信的基本原理
串行端口本质上是计算机的CPU和外部串行设备间的编码转换器。当数据从CPU经过串行端口发送出去时,字节数据被转换为串行的侠。而在接收数据时,串行的位则被转换为字节数据。在Windows环境下,串行端口是Windows系统资源的一部分。如果要使用串口进行通信,应用程序必须在使用前向操作系统提出使用串口资源的申请(创建并打开串口),然后进行相应的串口参数配置,双方的串口才可进行通信,通信完毕后,还必须释放系统资源(关闭串口)。串口通信程序的流程如图1所示。
1.2 89C51的串行口
89C51内有一个全双工的串行口,它有4种工作方式:方式0,串行接口为移位寄存器I/O方式;方式1,串行接口被控制为8位的异步通信接口,实际上,此时传送一帧住处应为10位,其中1位为起始位,8位为数据位,1位为停止位,在该方式中,波特率可变;方式2和方式3被定义为9位的异步通信接口,此时传送一帧信息为11位,其中1位起始位,8位数据位,1位可编程数据位,1位停止位,工作方式的选择由芯片内的特殊功能寄存器SCON(串行口控制寄存器)来设备。
1.3 接口电路
为了能使单片机与PC进行通信,必须使其遵循相同的通信协议。由于89C51的串行口输入/输出为TTL逻辑电平,高电平为3.8V左右,低电平为0.3V左右,因而这种以TTL电平传送数据的方式的抗干扰性较差。而计算机内部的RS-232C串行口用±12V和-12V电平方式,这种方式中,信号0和信号1的电平差别增大,从而增强了抗干扰性。但是,为了解决这种电平不一致的矛盾,必须采用一个RS-232C电平转换器,文中采用的MAX232自身带有电源电压变换器,可把+5V电压变换成RS-232输出电平所需的±10V电压,因而采用这种方式进行串行通信具有较好的性能和低廉的价格。如果通信距离较远,还可以通过增加MAX485转换器来连接MAX232以满足要求。其硬件接口电路原理如图2所示。
2 软件设计
2.1 红外遥控编码及传送格式
红外通信的基本原理是在发送端将基带二进制信号调制为一系列的脉冲串信号,然后通过红外发射管发射红外信号。常用的有通过脉冲宽度来实现信号调制的脉宽调制(PWM)和通过脉冲串之间的时间间隔来实现信号调制的脉冲调制(PPM)两种方式。本系统采用的是脉时调制方法。在调制脉冲宽度编码方式下,“0”是由时间间隔为T的一串38.5kHz载波脉冲后加时间间隔壁为T0的无载波脉冲的空闲状态来表示;而“1”是由时间间隔壁为T的一串38.5kHz载波脉冲后加时间间隔为T1的无载波脉冲的空闲状态来表示,其中T1大于T0。
图2
为了提高抗干扰能力和通讯可靠性,多数红外遥控发射器在发送二进制编码前要插入各种引导码,以便接收器识别。为了区分不同类型的遥控器,还需要发送地址码和校验码,另外不同遥控器所发送的码长也不相同。一般的传送格式如图3所示。
2.2 单片机的软件编程
单片机(下位机)部分的编程主要是完成单片机和计算机之间的串行通讯。该软件主要由串口初始化子函数、单片机内部定时器T0中断子函数、红外信号发送子函数等3大模块组成。其具体程序如下:
#include>at89x52.h)
#define byte unsigned char
#define WAR_0 P1_1 //定义接收引脚
#define LED_RECEIVE P1_0 //定义指示灯引脚
//晶振 22.1184MHz
//波特率=((xtal/12/t1_over_rate)/32)*2^pcon
byte bdata buffer=0;
sbit way0=buffer^0;
byte i=0;
bit start=0;
void send char(unsigned char word)//串口发送子函数
{
TI=0;
SBUF=word;
While(TI==0);
TI=0;
}
void t0_service(viod) interrupt 1 using 1//T0中断子函数
{
way0=WAY_0;
I++;
If(I=8)
{
TI=0;
SBUF=buffer;
I=0;
}
buffer=buffer<<1;
}
void main(void) //主函数
{
SCON=0x40; //设置串口模式
TMOD=0x22; //设置定时器模式
TH1=0xff; //定时器加载初值
TH1=0xff;
PCON=0x80; //57600bps *2 22.1184M
115200bps
TR1=1; //开定时器
TH0=0xdb; //定时器0加载初值
TL0=0xfd;
EA=1;
WAY_0=1;
ET0=1; //以上是串行初始化
While(1) //主循环
{
if(! WAY_0)
{
TR0=1; //开定时器T0中断
LED_RECEIVE=0;//LED指示灯点亮
}
}
}
2.3 上位机软件设计
上位机(计算机)软件的作用是实时采集由计算机串口接收的信号(即单片机发送的信号),同时通过VB软件编程来实现被采集红外信号的实时显示,以便于分析。
一般的IBM PC兼容型微机均提供有1至2个25针或9针的RS-232C标准串行口,简称COM1和COM2。在某些应用中,还可通过插装通信卡来获得额外的RS-232C标准串行口。利用这些串行口,微机便可以与其他数字设备(包括计算机)进行一般的数据通信。
利用Visual Basic提供的MSComm控件可以简单便携地通过应用程序实现串行通信,也可以创建功能完备、具有事件驱动功能的高级通信工具。与DOS环境下用汇编或C语言等编制的串行通信程序及Windows环境下用Visual C编制的串行通信程序相比,在使用Visual Basic的MSComm控件实现串行通信时,程序员只需关心MSComm控件对Windows通信驱动程序的API函数的接口即可,换句话说,只需要设置和监视MSComm控件的属性和事件即可。
利用VB实现串行通信主要有两种方法:一是调用Windows API通信函数;二是使用VB的通信控件(MSComm)。本文采用第二种方法,即利用通信控件再加一个定时器控件(Timer)来实现简单地串行通信。