2.3.2 光信号场计数
场计数的工作原理与行计数类似,只是计数器时钟脉冲输入改为行同步脉冲。光信号到来时开始计数,当场同步脉冲到来时停止计数,触发锁存器,存储计数器中的数值,至此就获得了光点的场坐标。同时场同步脉冲会将计数器清零,开始新一场的点坐标测量。
由于摄像头采用隔行扫描方式,两场构成一帧画面,奇数场扫奇数行,偶数场扫偶数行,所以此时得到的场坐标与实际值之间有较大误差。为了提高精度,需要确定当前扫描的是奇数场还是偶数场。如果场计数器中的值为n,LM1881的奇偶场标志脚输出0,则表明当前扫描的是偶数场,光点实际应在第2n行;若输出1,表明扫描的是奇数场,光点实际应在第2n-1行。
3.单片机串口通信流程
在本系统中使用的单片机是陵阳SPCE061A,它的UART模块提供了一个全双工标准的通信口,用于与外设之间的串行通信。在使用SPEC061A的异步串行端口UART实现与PC通信时,由于SPEC061A的I/O电平和PC不一致,要采用一片MAX232进行电平转换,MAX232的RXD和TXD分别接SPCE061A的IOB10(TX)和1OB7(RX)。
根据RS-232的标准,SPCE061A单片机是按字节传输数据的。利用IOB口的特殊功能和UART IRQ中断,可以同时完成UART接口数据的接收和发送。SPCE061A单片机串行通信帧结构为:1位启动位,8位数据位,1位奇偶校验位,1位停止位。使用UART模块进行通信时,必须事先分别将管脚I0B7设置为输入状态,IOB10设置为输出状态。将波特率设置为9600b/s即可满足本系统实时数据传输要求。
初始化的代码为:
*P_IOB_Dir=0x0400; //IOB0~IOB7初始化为输入,IOB10为输出
*P_IOB_Attrib=0x0480;
*P_UART_BaudScalarHigh=0x05; //波特率设置为9600bps
*P_UART_BaudScalarLow=0x00;
*P_UART_Command1=0x0000; //允许接收、发送
*P_UART_Command2=0x00C0;
单片机数据发送程序代码片段为:
Ret=*P_UART_Command2; //检查标志位,查看上次数据是否发送完毕
Ret=Ret&0x0040;
while(Ret==0) //若没有等待继续发送
{
Ret=*P_UART_Command2;
Ret=Ret&0x0040;
*P_Watchdog_Clear=C_WDTCLR;
}
m1=m&0x000f; //将16进制m1转ASCLL码传送上位机
Hex_ASC(m1);
*P_UART_Data=m1;
4.PC机软件设计
在计算机接收端,由串口1接收单片机发来的数据,采用VB 6.0设计软件程序,串行通讯利用MSCOMM控件实现[4]。MSCOMM能十分方便地开发出使用计算机串口的计算机通信程序。在本系统中MSCOMM控件采用事件驱动方式从端口获取数据,软件处理流程为:打开串口开始接收单片机发送来的数据,首先判断数据帧的开始字节,是则关闭OnComm接收事件,然后接收数据字节,判断数据最大最小值,采用坐标转化算法将接收的坐标转化为屏幕坐标,最后打开OnComm接收事件,等待下一次OnComm事件产生。
Windows SDK中函数SetCursorPos()可以实现将鼠标光标显示在投影大屏幕上的激光点处,该函数带有两个参数x和y,表示鼠标在屏幕上的坐标。函数mouse_event()可以模拟一次鼠标事件,例如可用如下命令模拟左键单击:mouse_event MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0。这样就实现了利用激光笔光点控制目标大屏幕的鼠标指针定位,移动和单双击。
5.结束语
试验表明,装备设计合理,满足设计技术指标要求,工作稳定可靠,且具有较强的可扩充性,只需做少许改动即可适应用户更高的要求,若要求进一步提高光标定位的精度,可选择更高的晶振作为行计数器脉冲的输入,必要时对计数器加以扩展。这相当于将像素点加以细化,因而精度提高。
本装置是配合计算机,投影仪而用于产品演示、电化教学及学术会议等场合的理想演示用工具。经过改装后,还可用于警员、军队枪械的模拟训练,有着广阔的应用前景。