资源描述
基于鼠标的随动系统设计摘 要单片机现在的应范围越来越广泛,单片机能够使用的液晶显示器也是越来越多。我们在单片机系统中引入鼠标,通过单片机将鼠标移动行程的二位编码进行采集和显示,然后通过单片机的输出控制步进电机的位置移动,形成一个位置随动系统。位置随动系统又称伺服系统,主要用于解决位置跟随的控制问题。 该课题要研究的是对鼠标的二维编码用单片机采集并显示出来,同时发送给两个步进电机驱动器使之移动,完成X-Y坐标的随动定位。该设计的优点是首先基于单片机的应用系统,具有体积小、重量轻、性价比高以及可靠性较高;然后在单片机系统中引入鼠标可以提高工作效率,方便用户;最后将可编程控制的单片机应用于步进电机随动系统,可使其具有较大程度的可改变性。关键词:PS2鼠标接口1602显示步进电机驱动 8051单片机ABSTRACT The first SCM was invented in 1980th,after that ,the SCM is gradual widely used in many places,such as the aircraft instrumentation,the time control and data processing of industrial automation system,camera,robot,integrated circuit and so on. The main content of this paper is that we link the PS2 mouse and the SCM together,so that the 1602LCD can show the place and button states on the screen,and then pass the number of the x,y coordinate to the drive of the step motor,the step motor will move and stop in the place you want.Keywords:the interface of PS2mouse and SCM,1602LCD,the drive of step motor目 录第一章 绪论.1 1.1 课题研究的目的和意义.1 1.1.1单片机系统设计背景.1 1.1.2单片机的基本知识.1 1.2 MCS-51系列单片机介绍.2 1.2.1 基本特性.2 1.2.2 MCS-51单片机的硬件组成结构.2 1.2.3 MCS-51的引脚功能.7第二章 硬件电路设计.10 2.1基于鼠标的随动系统的总体方案设计.10 2.2硬件电路设计.10 2.2.1 PS2接口电路设计.10 2.2.2 显示电路设计.12 2.2.3 步进电机驱动设计.14 2.2.4 电源电路设计.18 2.2.5 复位电路设计.19 2.2.6 晶振电路设计.19第三章 软件设计.21 3.1 总体方案流程图.21 3.2 鼠标接口程序模块.22 3.3 显示程序模块.24 3.4 步进电机随动定位程序模块.29致谢.30参考文献.31 附录1: 设计电路图.32 附录2: 鼠标接口程序.32 附录3: LCD1602显示程序.37 附录4: 步进电机驱动程序.40第一章 绪 论1.1 课题背景1.1.1单片机系统设计背景二十世纪是经济和科技飞速发展的世纪,电脑,互联网的出现在很大程度上改变了人们的生活,而单片机的诞生,更是深刻的改变了我们周围的世界。自从它诞生以来,由于其在结构和指令系统方面的无可替代的优点,似的单片机深受民用电器和仪器仪表领域的欢迎和重视。随着单片机种类的增多,应用范围的扩大,功能的更新,现在单片机已经逐渐成为微型计算机的一个非常重要的分支。目前单片机逐渐融入了人类生活的各个方面渗透到,我们几乎很难发现生活中没有使用单片机的地方。从军工行业导弹的导航装置,军用民用飞机上的各种仪表盘,广泛使用的各种智能IC(Integrated Circuit)集成电路卡,到小汽车的安全保障系统,照相机、冰箱,微波炉,电磁炉,洗衣机的控制等等,这些都离不开单片机。单片机现在的应范围越来越广泛,单片机能够使用的液晶显示器也是越来越多。我们在单片机系统中引入鼠标,通过单片机将鼠标移动行程的二位编码进行采集和显示,然后通过单片机的输出控制步进电机的位置移动,形成一个位置随动系统。位置随动系统又称伺服系统,主要用于解决位置跟随的控制问题。所以该课题要研究的是对鼠标的二维编码用单片机采集并显示出来,同时发送给两个步进电机驱动器使之移动,完成X-Y坐标的随动定位。该设计的优点是首先基于单片机的应用系统,具有体积小、重量轻、性价比高以及可靠性较高等优点。然后在单片机系统中引入鼠标可以提高工作效率,方便用户,最后将可编程控制的单片机应用于步进电机随动系统,可使其具有较大程度的可改变性。1.1.2单片机的基本知识SCM即单片微型计算机作为微型计算机的一个非常重要的分支,特别适用于控制领域,所以又把单片微型计算机称为微控制器(Microcontroller)通常,单片机由单块集成电路芯片构成,内部包含有计算机的基本功能部件:中央处理器CPU(central processing unit)、随机存储器RAM(random access memory)、只读存储器ROM(read only memory)和I/O接口电路等。所以,单片机只需要与适当的软件及外部设备相结合,便可成为一个单片机控制系统。图1-1 典型单片机的基本组成结构1.2 MCS-51系列单片机介绍 MCS-51单片机是美国Intel公司的8位高档单片机系列,是在MCS-48系列基础上发展而来的。在该系列里,有多种机型,性能特点也各不相同用户可根据需要挑选。 1.2.1基本特性在MCS-51系列里,所有产品都是以8051为核心电路发展起来的,他们都具有8051的基本结构和软件特征。从制造工艺上看,MCS-51系列中的旗舰基本上可分为HMOS(High-speed MOS,高速MOS)和CMOS两类。CMOS器件的特点是电流小且功耗低(掉电方式下消耗10A),但对电平要求高(高电平大于4.5V,低电平小于0.45V),HMOS对电平要求低(高电平大于2.0V,低电平小于0.8V),但功耗大。 1.2.2 MCS-51单片机的硬件组成结构MCS-51单片机的内部的各功能部件可以划分为CPU,存储器,I/O端口,定时器/计数器和中断系统五部分。如下图所示。图1-2 MCS-51单片机内部结构框图1.2.2.1 CPU结构8051它的里面的CPU为字节长度二进制8位的所谓中央内部处理单元。8051的内部的CPU是由数字运算器ALU,控制器的组成部分以及专用的寄存器组,一共三部分电路构成。1.算术功能逻辑部件(ALU)8051的算术逻辑部件是一个性能非常强的运算器,它一方面可以进行一些加减乘除的四则运算,另一方面也能够实现与,或,非,异或类的逻辑运算,它还具有传送数据,移位,判断和转移程序类别的功能。8051ALU由一个加法器,两个8位暂存器(TMP1与TMP2)和一个性能卓越的布尔处理器组成。8051时钟频率可达12MHz。2.可定时的控制部件时序控制单元播放控制器,时序控制逻辑,指令的寄存器作用,以及振荡器的OSC和其它电路。指令的寄存器红外程序存储器用于存储从脚本,定时控制指令中使用的逻辑脚本删除登记解码,并与OSC的执行命令,合作生产的定时脉冲,完成指令的执行情况。振荡器(振荡器)是控制器的核心,该控制器可提供时钟脉冲。 3.专用的寄存器组专用的寄存器组主要是用来指导当前需要执行指令内存的地址,其存放的操作数和它的指示的指令执行的状态。专用的寄存器组,其主要包括了程序的计数器,即PC,累加器A,程序的状态字,即PSW,堆栈的指示器,即SP,数据的指针和通用寄存器,即DPTR和B。(1)程序的计数器(PC)程序的计数器(PC)是一个二进制的存放16位的地址程序寄存器,专是来存放下一条要执行的指令的内存的地址,能自动加1.(2)累加器(A)累加器A也被称作ACC,它是个有特殊的用途地二进制8位的寄存器,专是用来存放的操作数或者是它的运算结果。CPU在执行一种运算之前,两操作数其中一个通常是应在累加器(A)里面,运算完成以后,累加器(A)中才能够得到运算的结果。(3)通用的寄存器(B)通用的寄存器(B)是专为用来做乘法以及除法的设置的一种寄存器,也同样是一个二进制的8位的寄存器,它是由八个的触发器所组成。这种寄存器在其乘法或者除法之前,是用来作存放的乘数或者是除数,而且在乘法或者除法完成之后,用来存放所得乘积的高八位数值或除法所得的余数的数值。(4)程序的状态字(即PSW)PSW它是一个有8位的标志性寄存器,它是用来存放一些指令执行之后的一些相关的状态。PSW中的各个位的状态一般是在一些指令执行的过程中,其自动而形成的,但是,也能够由用户不同的需要,从而采用传送的指令,使其加以改变。(5)堆栈指针(SP)堆栈指针SP是一个8位寄存器,能自动加1或减1,专门用来存放一些堆栈栈顶的地址。一般计算机的堆栈是按照“后进先出”或者“先进后出”的规律来存取一些DATA的RAM的区域。8051片子内部得RAM一共有大小是128B,其地址的范围是00H到7FH,所以这个区域其中的任何的子域都能够用来作为堆栈区。堆栈区其有栈底和栈顶之分,栈底由栈底的地址标识,栈顶是由栈顶的地址指示。栈底的地址它是一直固定不变,这决定了相应的堆栈在RAM内部的物理内存的位置,栈顶的地址始终是在SP中,就是由SP所指示,是能够被改变的,它是决定了堆栈里面是否存放着数据。因此,党堆栈中为无数据时,栈顶地址与栈底地址必然重合。堆栈里面的数据是由一条PUSH的指令压入内存和一条POP的指令弹出来的,PUSH的指令可以使SP之中的内容加1,POP的指令相反,可使SP减1.(6)数据指针(即DPTR)数据指针(即DPTR),它是一个16位寄存器,是由两个的8位的寄存器,即DPH钰DPL组合而成。其中DPH为DPTR的高8位,DPL为DPTR的低8位。DPTR可以用来存放片内ROM的地址,也可以用来存放片外RAM和片外ROM。 1.2.2.2 存储器结构MCS-51的存储器不仅有ROM和RAM之分,而且有片内和片外之分。MCS-51的片内存储器集成在芯片内部,是MCS-51的一个组成部分;片外存储器是外接的专用存储器芯片,MCS-51只提供地址和控制命令,需要通过印刷电路板上三总线才能联机工作。1. 存储器地址分配存储器的地址分配有三个地址空间,三个地址空间是:ROM存储器地址空间(包括片内ROM和片外ROM),地址范围是0000H-FFFFH;片内RAM地址空间,地址范围是00H-FFH;片外RAM地址空间,地址范围是0000H-FFFFH.2. 片内ROM8031没有ROM,只有8051才有4KB ROM,地址范围是0000H-0FFFH。3. 片外RAMMCS-51的片内RAM容量有128个存储单元;可以用来存放操作数,操作结果和实时数据。MCS-51可以对片外RAM进行读/写。4. 片内RAM8052AH/8752BH的片内RAM共有256个存储单元,地址范围是00H到FFH。其中,00H-7FH为片内的RAM的低128字节区,80HFFH为片内RAM的高128字节区。在00H-7FH这个地址空间中,根据不同的功能又能够分成工作的寄存器区和位寻址区以及便笺区这样三个子的区域。5. 具有特殊功能的寄存器(即SFR,80H到FFH)具有特殊功能的寄存器指的是有特殊的用途的寄存器的集合。SFR其实际的个数和对应的单片机的型号相关;8051和8031中有SFR都是21个,8052中的SFR是26个。每一个的SFR都是占有一个的RAM的单元,它们离散地分布于80H到FFH得地址范围之内,不被SFR所占用的那些RAM单元,其实际上不存在。 表1-1 特殊功能寄存器一览表符号物理地址名称*ACCE0H累加器*BF0HB寄存器*PSWD0H程序状态子SP81H堆栈指针DPL82H数据的寄存器(低8指针)DPH83H数据的寄存器(高8指针)*P080H通道0*P190H通道1*P2A0H通道2*P3B0H通道3*IPB8H中断的优先级别控制*IEA8H中断的允许级控制器TMOD89H定时器的方式选择*TCON88H定时器的控制器*+T2CONC8H定时器2控制器TH08CH定时器0的高8位TL08AH定时器0的低8位TH18DH定时器1的高8位TL18BH定时器1的低8位+TH2CDH定时器2高8位+TL2CCH定时器2低8位+RCAP2HCBH定时器2捕捉寄存器高8位+RCAP2LCAH定时器2捕捉寄存器低8位*SCON98H串行的控制器SBUF99H串行数据的缓冲器PCON87H电源的控制器注:*可以位寻址+仅8052有1.2.2.3 I/O端口I/O端口又叫做I/O接口。I/O端口是MCS-51单片机对于外部的实现控制以及信息交换的必经通道,是一个过度的集成的电路,是用于信息的传送过程中速度的匹配与增强它负载的能力。I/O端口有串行端口和并行端口之分,串行I/O端口每次只能够传送一位的二进制的信息,并行I/O端口每次能够传送出一组的(8位)二进制的信息。1.并行I/O端口 8051包括四个并行I/O端口,分别的命名是P0,P1,P2和P3,且四个并行的I/O端口中,每一个端口都能够实现双向I/O的功能。即CPU既可以由四个并行的I/O端口中的随意的一个能输出数据,又可以从它们那里输入数据。2.串行I/O端口 8051有一个全双工的可编程I/O端口。此串行I/O端口既能够在程序的控制下将CPU的8位的并行的数据转化成串行的数据并且逐位地从发送的数据线,即TXD中发送出去,也能够把RXD线上串行的接收到得数据变成8位的并行的数据送回给CPU,且这样串行的发送以及串行的接收是能够单独进行的,也可以同时进行。1.2.2.4 定时器/计数器 8051内部有两个16位可编程序的定时器/计数器,命名为T0和T1。T0由两个8位寄存器TH0(高8位)和TL0(低8位)拼装而成。和T0类同,T1也由TH1和TL1拼装而成。 T0和T1有定时器和计数器两种工作模式,在定时器模式下,T0和T1的计数脉冲可以由单片机时钟脉冲经12分频后提供,故定时时间和单片机时钟频率有关。在计数器模式下,T0和T1的计数脉冲可从P3.4和P3.5引脚上的输入。1.2.2.5 中断系统 计算机的终端是指的是CPU原程序暂停执行而变为外部的设备服务(即执行中断的服务程序),并且在服务完成后回到了原程序的整个的执行过程。中断系统指的是可以处理上面所说的中断的过程所必须部分的电路。 中断源指的是能够产生中断的请求性信号的源泉。8051一共能够处理5个中断源所发出来的中断的请求,可以将五个中断的请求信号来经过排队以及控制,并且响应那其中优先权能最高的那个中断请求。8051中的五个的中断源是有内部的和外部的之分:外部的中断源一共有两个,一般指外部的设备;内部的中断源共有三个,一般是有两个的定时器或者计数器得中断源以及一个串行的中断源。 8051的中断系统主要有IE(Interrupt Enable,中断允许)控制器和中断优先级控制器IP等电路组成。1.2.3 MCS-51的引脚功能MCS-51 系列中,各类单片机是相互兼容的,只是引脚功能略有差异。图1-3 40引脚双列直插封装图8051有40条引脚,共分为端口线,电源线和控制线三类。1.端口线(48=32)8051共有四个并行I/O端口,每个端口都有8条端口线,用于传送数据/地址。(1) P0.7-P0.0:这组引脚共有8条,位P0口所专用。这8条引脚共有两种不同的功能。第一种的情况是其8051中不附带片外的存储器,P0口能够作为通用的I/O口使用,P0.7-P0.0用于传送CPU内的输入/输出的数据。第二种的情况是其8051附带片外的存储器,P0.7-P0.0在CPU内访问片外的存储器时侯,先是用来传送片外的存储器中的低8位的地址,然后将传送CPU中对片外的存储器的读写数据。(2)P1.7-P1.0:这8条引脚和P0口得8条引脚类似。(3)P2.7-P2.0:这组引脚的第一功能和上述两组引脚第一功能相同,即能够作为通用的I/O使用。它的第二功能和P0口引脚的第二功能相配合,用于输出片外的存储器中的高8位地址,共同选中片外的存储器的单元,但并不能像P0口那样还可以传送储存器的读写数据。(4)P3.7-P3.0:这组引脚第一功能和其余三个端口的第一功能一样。第二功能做控制用,每个引脚不全相同。表1-2 P3口各位之1其第二功能P3口的位第二功能注释P3.0RXD串行数据的接收口P3.1TXD串行数据的发送口P3.2 INT0外中断0之输入P3.3INT1外中断1之输入 P3.4T0计数器0之计数输入 P3.5T1计数器1之计数输入 P3.6WR外部的RAM写信号 P3.7RD外部RAM读信号2.电源线(2条)VCC为+5V的电源线,VSS是接地线。3.控制线(6条)(1)ALE/PROG:地址的锁存允许/编程线,配合P0口中引脚中的第二个功能的使用。(2)EA/VPP:允许访问片外存储器/编程电源线,可控制8051使用片内ROM还是使用片外ROM.若EA=1,则允许使用片内ROM;若EA=0,则允许使用片外ROM。(3)PSEN:片外ROM选通线,在执行访问片外ROM的指令MOVC时,8051自动在PSEN线上产生一个负脉冲,用于为片外ROM芯片的选通。其他情况下,PSEN线均为高电平封锁状态。(4)RST/VPD:复位/备用电源线。可以使8051处于复位工作状态。(5)XTAL1和XTAL2:片内震荡电路输入线,这两个端子用来外接石英晶体和微调电容,即用来连接851片内OSC的定时反馈回路。第二章 硬件电路设计2.1 基于鼠标的随动系统的总体方案设计总体设计流程图如下:鼠 标鼠标其它电路8051单片机1602液晶显示M1M2驱动芯片图2-1 系统总体方案设计2.2 硬件电路设计2.2.1 PS2接口电路设计 2.2.1.1 PS2鼠标的接口规范 鼠标的功能是把它自己的二维位移转换成数字代码,通过这个接口发送。当鼠标在最小距离或拖动一个按钮状态变化,它的动作与协议将信息翻译后就可以反映距离和按钮,然后通过一次或多次发送到主机信息的规定,主机上的鼠标驱动程序按照转变信息将供用户调用其他程序。传统的鼠标使用RS232标准接口,单向传递信息; PS2鼠标使用的是独特接口的规范,信息能够双向的传输。 1. 工作模式 PS2鼠标包括复位,增量流,远程控制,回送4种模式。复位的模式本职是一待机的模式,通电之后自动地进入复位模式;回送的模式是把主机所发送的信息按字节(OECH,0FFH例外)直接返回,可用来检查鼠标和接口错误的情况,或到OECH OFFH然后退出进入复位模式,远程控制模式下,鼠标是唯一的积极响应主机命令自己不主动发送信息给主机的模式;增量流模型是鼠标的正常工作模式,在这种模式下,只要鼠标检测到自己运动或按钮状态变化,主动发送状态报告给主机。当鼠标接通电源后自动进入复位模式,如果鼠标接收到主机的启动命令进入增量流模型,也就是进入正常工作状态。 2.接口规范PS2鼠标用针微型接插件,实际电路中只使用了其中四个引脚,如图2-2所示。图2-2PS2鼠标硬件接口规范2.2.1.2 PS2鼠标接口设计由于PS2鼠标接口使用5V的正常工作电压,并且和TTLTTL逻辑电平兼容,所以8051单片机本身可和鼠标直接连接,同时51单片机准双向I/O口满足集电极开路条件,因此,采用图2-3的硬件连接方案。由于正常工作时,鼠标向上发送信息是随机的,所以为了保证快速的响应,时钟引脚必须接终端引脚引脚,即接到P3.2(INT0),而数据引脚可以接任何一根准双向引脚。图2-3 单片机和PS2鼠标的硬件接口2.2.2 显示电路设计在单片机系统中应用晶液显示器作为输出器件有以下几个优点:显示质量高,体积小、重量轻,功耗低。2.2.2.1 1602简介 字符型液晶显示模块是一种专门显示字母,数字,符号等点阵式LCD,我选用的是16*2型液晶显示,16脚带背光型,它的最佳工作电压是5V,工作电流是2.0mA。图2-4 1602字符型液晶显示器实物图1. 1602LCD的基本参数及引脚功能 图2-52.1602LCD技术参数: 显示容量:162个字符 芯片工作电压:4.55.5V 工作电流:2.0mA(5.0V) 模块最佳工作电压:5.0V 字符尺寸:2.954.35(WH)mm3.引脚功能说明1602LCD各引脚接口说明如表2-1所示:表2-1:引脚接口说明表编号符号引脚说明编号符号引脚说明1VSS电源地9D2数据2VDD电源正极10D3数据3VL液晶显示偏压11D4数据4RS数据/命令选择12D5数据5R/W读/写选择13D6数据6E使能信号14D7数据7D0数据15BLA背光源正极8D1数据16BLK背光源负极2.2.2.2硬件原理图1602液晶显示模块可以和单片机AT89C51直接接口,电路如图 图2-8 1602与AT89C51接口电路图2.2.3 步进电机驱动设计2.2.3.1.步进电机概述步进电机是将电脉冲信号转换成角位移或线位移的开环控制元件。步进电机的角位移和脉冲数成正比,转速和脉冲频率成正比。 我选用的是四相8拍步进电机,用单极性直流电源供电。只要能对步进电机得各项绕组按照适当的时序通电,就可以使步进电机转动。 1.步进电机的工作原理步进电机的工作是一步步进马达转动,它的目的是将脉冲电信号转变为相应的角位移或线位移。步进电机的转速的高低,胜诉或者降速,启动或者停止取决于电脉冲的频率高低或者有没有信号。 图2-9是该四相步进电机工作原理示意图。图2-9 步进电机的工作原理示意图开始时,给开关SB供电,其余三项断开,B相的磁极与转子的0和3号齿相对齐,而且,转子的1号和4号齿便与C、D两相绕组的磁极产生相应的错齿,2号和5号齿也和D、A亮相绕组的磁极产生相应的错齿。当给开关SC供电,其余三项断开时,由于C相绕组的磁力线和1、4号齿之间磁力线的作用,使转子转动,1、4号齿和C相绕组的磁极对齐。而0、3号齿和A、B相绕组产生错齿,2、5号齿就和A、D相绕组磁极产生错齿。给四相绕组按合适的顺序轮流供电,步进电机转子就会沿A-B-C-D的方向转动。3.步进电机的驱动系统的简介步进电机是不可以直接将其接到交直流的电源上就工作,所以必须使用步进电机的驱动器。设计中的步进电机的驱动系统由单片机、ULN2004芯片和步进式电机的本体一共三个部分组合而成。ULN2004是一款耐高压大电流的达林顿管驱动器,有7个NPN达林顿管。单片机发出不仅脉冲信号与方向信号,每当发出了一个步进脉冲,步进电机的驱动器就会驱动步进式电机的转子旋转一个角度,单片机的方向信号决定步进电机的旋转方向是顺时针还是逆时针。2.2.3.2步进电机驱动电路此电路是步进电机的驱动部分,我选用的是ULN2004芯片来驱动的。如图2-10。图2-11 步进电机驱动部分2.2.4电源部分电源部分利用LM7812和LM7805芯片得到12V和5V的电压,其中12V电压给步进电机供电,5V电压则给单片机供电。分别如图2-12、图2-13所示。图2-12 产生12V的电压给步进电机供电图2-13 产生5V的电压给单片机供电2.2.5 复位电路设计 8051的复位有自动上电抚慰和人工按钮复位两种,在本设计中,我们采用开关复位电路。电路如下图所示:图2-14 按键复位电路2.2.6 晶振电路设计 石英晶振起振,会在XTAL2线上输出一个3V左右的正弦波,以便使MSC-51单片机内的OSC电路按石英晶振相同频率自激震荡。通常,OSC的输出时钟频率fOSC为0.5-16MHz,典型值为12MHz或11.0592MHz。电容C01和C02可以帮助起振,典型值为30pf,调节它们可以达到微调fOSC的目的。 石英晶振电路如下图所示:图2-15 石英晶振电路第三章 软件设计 3.1 总体方案流程图开 始1602初始化步进电机参数设置1602显示x,yPS2鼠标初始化按下左键按下左键和右键1602显示坐标初始值1602显示鼠标当前坐标值显示按下左键显示按下左键按下右键显示按下右键X,Y当前坐标值转化为两步进电机脉冲数步进电机按脉冲数运动图3-1 接口程序流程 3.2 鼠标接口程序模块主机和PS2的鼠标之间的信息传输是按照字节进行的,主机一般的命令为1个字节,或者2字节(个别命令),鼠标返回到主机的命令响应是1,2或3个字节,鼠标主动发送的信息固定为3个字节。辅助位加字节就构成了一个消息帧字节,包括一个启示位,一个停止位,一个校验位和8位数据,如图2,每个宽度完全由鼠标控制显示。 在PS2接口中,信息的整个传送的活动决定权根据主机来决定,传送的节奏是由鼠标来控制。没当鼠标根据需要来发送信息的时侯,它会首先检查一下时钟是否处于高电平,在确认之后,在其数据线上开始发起始位,然后经过时钟的通知,主机来接收数据,每个时钟的脉冲到时下降沿时,主机开始采样数据,共11个时钟的脉冲经过后,字节的传送结束,此时鼠标发现,若时钟是低电平,则说明此时主机是禁止将鼠标使用到总线,从而发送的过程不能够启动。 图3-3 PS2接口的信息上行(鼠标直到主机)时序当主机在需要发送指令的时侯,它首先会把时钟强制定在低电平于100s以上,之后于数据线上发起起始位,进而释放时钟线,并通知鼠标进行接收数据,同时主机必须恰好在每一个时钟脉冲高电平的期间放置下一个数据在数据线上,11个时钟脉冲过后,字节的传送结束,如果信息的上行的过程仍正在进行当中,主机发出的100s低电平将迫使鼠标终止发送,转入数据接收过程。图3-4 PS2接口信息下行(主机到鼠标)时序1.鼠标接口流程图 开始程序初始化发送数据读出数据数据处理结束奇偶校验YN2.鼠标接口程序(详细见附录2)/函数声明void INT1_init(void);/外部中断INT0初始化void delay120us(void);/延时120us 函数定义void mouse_write_dat(unsigned char dat); /发送数据void mouse_read_dat(void);/读出数据void mouse_data_process(void);/数据处理void mouse_init(void);/鼠标初始化3.3 显示程序模块1.1602LCD的指令说明及时序1602液晶模块内部的控制器共有11条控制指令,如表2-2所示:表2-2 1602模块内部控制指令序号指令RSR/WD7D6D5D4D3D2D1D01清显示00000000012光标返回000000001*3置为输入模式00000001I/DS4显示开/关控制0000001DCB5光标或者字符移位000001S/CR/L*6置功能00001DLNF*7置字符存贮器的地址0001字符存贮器的地址8置数据存贮器的地址001显示数据存贮器地址9读忙标志或地址01BF计数器地址10写数到CGRAM或DDRAM)10要写的数据内容11从CGRAM或DDRAM读数11读出的数据内容表2-3:基本操作时序表读状态输入RS=L,R/W=H,E=H输出D0D7=状态字写指令输入RS=L,R/W=L,D0D7=指令码,E=高脉冲输出无读数据输入RS=H,R/W=H,E=H输出D0D7=数据写数据输入RS=H,R/W=L,D0D7=数据,E=高脉冲输出无2.1602LCD的RAM地址映射及标准字库表 液晶显示模块是一个慢显示器件,所以在执行下一条指令之前之前一定要检查模块的忙标志为低电平,也就是说,看它是不是已经完成上一条指令的执行。如果要显示字符,首先需要先输入它的字符地址,也就是说需要告诉模块在哪个位置显示字符,图2-6是1602的内部显示地址。图2-6 1602LCD内部显示地址 例如第一行第五个字符的地址是05H,那么直接写入05H,这样不能将光标定位在第一行第五个字符的位置,因为写入显示地址时要求最高位D7恒定为高电平1,所以实际的数据应该是00000101B(05H)+10000000B(80H)=10000101B。 一般的1602液晶显示模块内部的CGROM已经存储了160个不同的点阵字符图形,如表2-4所示,每一个字符都有一个固定的代码,比如大写的英文字母“Q”的代码是01010001B(51H),显示时CGROM把地址51H中的字符图形显示出来,我们就可以看到字母“Q”。表2-4CGROM和CGRAM中字符代码与字符图形对应关系3.显示流程图开始LCD初始化写入指令写入数据显示定位输出定位字符串输出二进制数字结束4.LCD1602显示程序(祥见附录3)/函数声明void LCD_busy (void); /检测LCD是否忙void LCD_init (void); /LCD初始化void LCD_cmd (unsigned char cmd); /写入指令void LCD_dat (unsigned char dat); /写入数据void LCD_pos (unsigned char x, unsigned char y); /显示定位void LCD_prints(unsigned char x, unsigned char y, unsigned char *s); /定位输出字符串void LCD_printn(unsigned char x, unsigned char y, unsigned int num); /定位输出16位二进制数字3.4 步进电机随动定位程序模块1. 步进电机程序(详见附录4)static unsigned int count; /计数static int step_index; /步进索引数,值为07static bit turn; /步进电机转动方向static bit stop_flag; /步进电机停止标志static int speedlevel; /步进电机转速参数,数值越大速度越慢,最小值为1,速度最快static int spcount; /步进电机转速参数计数static int x;void delay(unsigned int endcount); /延时函数,延时为endcount*0.5毫秒void gorun(); /步进电机控制步进函数致 谢历时一个月的毕业设计终于告一段落,我的毕业设计是基于单片机的随动系统设计,由于自己在单片机的学习方面存在纰漏,所以在做毕业设计的过程中我遇到了很多困难和问题,所以向老师咨询了很多,我的辅导老师也竭尽全力的给了我很多鼓励和帮助,对我的设计提出了很多好的建议和方案,在此非常感谢他。然后还要感谢的是我的同学,他们在专业方面和资料搜集方面给了我很多帮助,能在完成自己的毕业设计的前提下花很多时间帮助我,我表示非常敬佩和感谢。我的毕业设计能够顺利完成离不开他们的帮助,在这里深表感谢。参考文献1 胡汉才,单片机原理及其接口技术,清华大学出版社,20102 于静,张立新,PS2鼠标与51系列单片机的软硬件接口,北京石油化工学院学报 2008.09,No.3.3 谢勇全,基于单片机控制的CCD随动系统设计,吉首大学物理科学与信息工程学院4 1602相关资料 网页: 附录1 系统电路图附录2鼠标接口程序/防止被重复定义引用#ifndef _PS_mouse_H_#define _PS_mouse_H_sbit mouse_sda = P35;/鼠标数据线sbit mouse_clk = P33;/鼠标时钟线/数据定义unsigned char n, m;/循环变量unsigned int mouse_word;/接收字16bitsunsigned char mouse_data3;/接收字节缓冲区unsigned int move_x;/横坐标unsigned int move_y;/纵坐标bit mouse_left;/左键bit mouse_right;/右键bit mouse_middle;/中键/函数声明void INT1_init(void);/外部中断INT0初始化void delay120us(void);/延时120us 函数定义void mouse_write_dat(unsigned char dat); /发送数据void mouse_read_dat(void);/读出数据void mouse_data_process(void);/数据处理void mouse_init(void);/鼠标初始化/外部中断INT0初始化void INT1_init(void) EA = 1;/总中断EX1 = 1;/外部中断PX1 = 1;/中断优先级IT1 = 0;/低电平触发/延时120us 函数定义void delay120us(void) unsigned char i, j; for(i = 23; i 0; i-) for(j = 1; j 0; j-);/发送数据/发送11位数据:1START-8DATA-1PARITY-1STOP/并接收一个应答位ack = 0void mouse_write_dat(unsigned char dat)unsigned char i; /循环变量bit parity; /奇校验位EX1 = 0; /关闭外部中断ACC = dat;/存入累加器A,得到P(为偶校验)parity = P; /获得奇校验位mouse_clk = 0;/拉低时钟线delay120us(); /至少延时100usmouse_sda = 0;/发送起始位mouse_clk = 1;/释放时钟线mouse_sda = 1;/释放数据线for(i = 0; i = 1;/下降沿写入数据while(mouse_clk); /等待设备把时钟线拉低while(!mouse_clk); /等待设备把时钟线拉高mouse_sda = parity;/发送奇校验位while(mouse_clk); /等待设备把时钟线拉低while(!mouse_clk); /等待设备把时钟线拉高mouse_sda = 1;/发送停止位while(mouse_clk); /等待设备把时钟线拉低while(!mouse_clk); /等待设备把时钟线拉高while(mouse_sda); /等待接收应答位(总是为0)while(mouse_clk); /等待设备把时钟线拉低while(!mouse_clk); /等待设备释放时钟线while(!mouse_sda); /等待设备释放数据线EX1 = 1; /打开外部中断INT0/奇校验bit check_parity(void)ACC = mouse_datam;if(P = (bit)(mouse_word & 0x0200) return 1; /奇校验成功则返回1else return 0; /奇校验失败则返回0/读出3字节数据void mouse_read_dat(void)mouse_datam = (unsigned char)(mouse_word 1); /去掉最高两位和最后一位if(check_parity() /奇校验成功mouse_word = 0;/清接收数据字m+; if(m = 3)mouse_data_process(); m = 0;/读出三字节数据/数据处理void mouse_data_process(void)/水平移动if(mouse_data0 & 0x10) move_x -= 256 - mouse_data1; /x坐标减else move_x += mouse_data1; /x坐标加/垂直移动if(mouse_data0 & 0x20) move_y -= 256 - mouse_data2; /y坐标减else move_y += mouse_data2; /y坐标加if(mouse_data0 & 0x01) mouse_left = 1; /左键else mouse_left = 0;if(mouse_data0 & 0x02) mouse_right = 1; /右键else mouse_right = 0;if(mouse_data0 & 0x04) mouse_middle = 1; /中键else mouse_middle = 0;/外部中断INT0服务/接收11位数据:1START-8DATA-1PARITY-1STOPvoid INT1_intservice(void) interrupt 2 mouse_word = 1;/先向右空移一位if(mouse_sda) mouse_word |= 0x0400; /先接收最低位n+; if(n = 11) mouse_read_dat(); n = 0; /接收完成则读出数据/鼠标初始化void mouse_init(void)INT1_in
展开阅读全文