DIY编程器网

标题: 一种简单串行鼠标控制的单片机实现 [打印本页]

作者: liyf    时间: 2014-10-5 10:51
标题: 一种简单串行鼠标控制的单片机实现
一种简单串行鼠标控制的单片机实现

摘要:通过对鼠标底层通信原理与协议的深入分析,探讨以AT89C2051单片机构成串行鼠标的实现方法;介绍鼠标编码器数据取软件的设计原理及方法,给出串行鼠标的软件设计。    关键词:鼠标 AT89C2051 软件设计
鼠标是一种快速定位器,通过移动鼠标可以快速定位屏幕上的对象,是计算机图形界面交互的必用外部设备。通常,鼠标通过微机中的串口或PS/2鼠标插口与主机连接。当在平面上移动鼠标时,通过机械或光学的方法把鼠标滚轮移动的距离和方向转换成脉冲信号传送给计算机,计算机鼠标驱动程序将脉冲个数转换成鼠标的水平方向和垂直方向的位移量,从而控制显示屏上光标箭头随鼠标的移动而移动。根据此原理,我们可利用鼠标的上位机驱动程序来设计测控系统中的编码器读取软件。

1 串行鼠标的原理及数据协议

鼠标一般划分为以下功能模块:微控制器、[img=427 align=right vspace=1 border=0,190 hspace=1 src=]http://www.diybcq.com/[/img]按键检测、位置移动检测、RS232信号产生、5V电源产生器。串行鼠标的功能框图如图1所示。
微软公司与Mouse System公司的鼠标都采用串行输入技术。微软公司的协议格式为3个字节:第1字节的6、7位固定为1,4,5位分别为左右键状态,2、3位为上下移动数据的高6、7位,0、1位为左右移动数据的高6、7位;第2、第3字节发送的都是左右上下的其余6位数据,其中Y表示上下、X表示左右移动的数据位。Mouse System公司的协议格式为5个字节:1个字节用于描述3个按键的状态,2个字节为Y方向的相对坐标,另外2个字节为X方向的相对坐标,具体协议如表1所列。由表1我们可以方便地制作鼠标。

表1 鼠标系统数据信息协议
 Mouse System格式Microsoft格式
数字位7  6  5  4  3  2  1  07  6  5  4  3  2  1  0
字节11  0  0  0  0  L  M  R1  1  L  R  Y7  Y6 X7 X6
字节2X7 X6 X5 X4 X3 X2 X1 X00  0  X5 X4 X3 X2 X1 X0
字节3Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y00  0  Y5 Y4 Y3 Y2 Y1 Y0
字节4X7 X6 X5 X4 X3 X2 X1 X0 
字节5Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 
    L=左键状态  M=中键状态  R=右键状态  1=按下  0=释放
    X7~X0=X轴(左右)运动数据  Y7~Y0=Y轴(上下)运动数据
2 AT89C51构成的鼠标电路
AT89C2051构成的鼠标接口电路如图2所示。
硬件接口分配如下:
P1口完成对按键及X、Y方向的运动扫描;
P3.1完成数据发送。
为较好地跟踪鼠标状态,采用12MHz晶振,AT89C2051每μs执行1条指令,能满足实时跟踪的要求。

[attach]32436[/attach]
图2 电路原理图

3 软件设计

设计的软件要完成按键扫描、X方向/Y方向运动扫描、数据发送等任务。在记数光电管产生脉冲的同时,将数据按照规定格式发送到主机。脉冲的个数反映了移动的距离,单位时间内脉冲数越多,鼠标移动越快。
下面以X方向为例,详细说明方向的判断及脉冲的记数。
X方向的2路信号为P1.2与P1.3,分别用X1与X2表示。当鼠标向左移动时,X1(P1.2)超前于X2(P1.3);当鼠标向右移动时,X1(P1.2)落后于X2(P1.3);假设测得X1、X2都为低电平0(图3中a),若下一次测得X1为高电平1、X2为低电平0(图3中b)。第三次检测到X1、X2电平1(图3中c),继续向左移动,直到检测到X1为低电平1、X2为高电平0(图3中d),正好检测到一个完整的脉冲,计数器加1,接着进入下一个循环。由此可见,要完成一个脉冲的计数,需要检测到四种不同的状态:X1=X2=0;X1=1,X2=0;X1=X2=1;X1=0,X2=1。
向右移动的状态为:X1=X2=0;X1=0,X2=1;X1=X2=1;X1=1,X2=0。正好与向左移动的情况相反。
由此,可以根据本次测得的状态与上一次的状态比较的结果确定鼠标移动的方向。
向上、向下的运动检测遵循同样的原则。
根据以上分析,要完成一次计数,单片机至少要对每一种状态检测一次,这就需要单片机有较高的跟踪速度。由实验测得,最短的时间间隔在b与d处,即X1=X2=0变化到X1=X2=1或者X1=X2=1变化到X1=X2=0的过程中。鼠标正常移动时,间隔一般为300μs~500μs。即使在鼠标高速移动时,最小间隔也大于80μs。当AT89C2051采用12MHz晶振时,程序正常扫描一遍的时间最大为50μs(包括数据处理与发送的时间),因此,能保证每种状态都能扫描到。
在表1中,X7~X0反映X方向移动的距离。如X值为正(X7=0),则表示鼠标向右运行;如果为负值(X7=1,即以补码表示),表示向左运行。
同理,若Y值为正,表示鼠标向下运行;若为负,则表示向上运行。
在程序中,若检测到鼠标状态有变化,则延时多个循环(在每个循环中都对鼠标状态检测一遍),作为消除按键抖动的时间。信息采用RS232格式,波特率为1200baud。为满足鼠标1位起始位、7位数据,无奇偶校验位以及2位停止位的数据格式,在程序中,对数据进行了处理,将要发送的每个字节的最高位置为1。
主程序流程如图4所示。在图中,当检测到按钮状态发化或者检测到X、Y方向运行时,置延时循环标志。为了发送3个字节信息,在串行口中断程序中置标志位,使3个字节能连续发送完。
另外,当主机检测鼠标时,需要鼠标发送初始化报告,以检测鼠标是束安装。因此,在鼠标初始化过程中,首先要发送一个字节“4DH”(“M”,D7位置“1”则为“CDH”),使主机能够检测到鼠标已经安装。
完整的程序清单见网络补充版(http://www.dpj.com.cn)。

4 结论

本文利用AT89C2051完成了鼠标移动数据的读取与PC机通信数据的传送。该系统在Windows 95、98和Win2000XP下均调试通过。文中给出的硬件原理图同样可应用于测控系统中编程器信号的读取,应用面较广。
作者: 李小路    时间: 2021-9-12 19:57
谢谢分享




欢迎光临 DIY编程器网 (http://diybcq.com./) Powered by Discuz! X3.2