• 383.00 KB
  • 2022-04-22 11:50:12 发布

USB数据采集系统设计 完整版

  • 89页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'USB数据采集系统设计USB通用串行总线是计算机外设接口的发展趋势,它的最大特点就是传输速度快、即插即用、易扩展,使用非常方便,被越来越广泛的应用于工业控制和数字设备中。其连接方式非常灵活,既可使用串行连接,也可使用集线器(HUB)把多个设备连接在一起,与同PC机的USB接口相连。此外,它还可以从系统中直接汲取电源,无需单独的供电系统。本论文以西安泰达电子公司生产的USB20C模块设计了一个基于USB数据接口,数据传输和存储的系统,同时采用VB语言进行了内部程序的设计。关键字:USB接口技术AT89C51数据采集和存储89 AbstractTheUSBuniversalserialbususbisoutsidethecomputersupposestheconnectionthedevelopmenttendency,itsmostmajorcharacteristicisthetransmissionspeedquick,namelyinsertsnamelywith,iseasytoexpand,theuseisextremelyconvenient,bymoreandmorewidespreadapplicationinindustrycontrolanddigitalequipment.Itsconnectionwayextremelynimble,alsomayusetheserialconnection,alsomayusetheconcentrator(HUB)manyequipmenttoconnectin,withistogetherconnectedwiththePCmachineUSBconnection.Inaddition,italsomaydirectlyderivethepowersourcefromthesystem,doesnotneedtheindependentpowersupplysystem.WestofthepresentpaperpeacefullyandundisturbedreachedtheUSB20CmodulewhichtheelectroniccompanyproducedtodesignbasedontheUSBdataconnection,thedatatransmissionandthememorysystem,simultaneouslyusedtheVBlanguagetocarryontheinternalproceduredesign.KeyWords:USBConnectiontechnologyAT89C51……Dataacquisitionandmemory89 89 第一章.前言及总体设计方案的选择1.1.前言随着计算机技术的发展和计算机应用的普及,计算机的通信问题成了其应用的主要问题之一。而现在广泛使用的USB接口已经越来越多的应用于工业生产、数字设备等领域。USB通用串行总线将是计算机外设接口的发展趋势,将逐渐取代PC机上的RS232协议口。USB具有速度快,即插即用,易扩展等优点,被越来越广泛的使用。但是仍然有很多的设备上面没有USB接口,而接收的数据又以USB的方式出现,那么在数据的接收端则要求将USB信号转换成传统的RS232信号以便接收;89 另一方面也会出现一端以RS232方式通信,而另一端为USB接口。他们都同样的涉及到USB与RS232的相互转换问题。本课题所研究的内容就是就是要设计这样一个转换系统,使其能够实现他们之间的相互转换。要实现这种转换,第一种方案是采用普通单片机加专用USB接口芯片;采用带USB接口的单片机,即专用US13控制器芯片。目前国外有很多半导体厂商都设计生产出自己的USB接口芯片,例如USBN9602(NationalSemiconductor公司)、PDIUSBDI2(Philips公司)和USS820/825(Lucent公司);Cygnal公司生产的CP201使用也相当方便。在国内方面:凌阳公司生产的SPCP825A芯片就带有UART与USB格式转换的功能;南京沁恒电子公司生产的CH341、CH372、CH375等芯片都是很好的USB接口芯片。这种方案的优点是:开发人员可以利用现有单片机开发系统开发外设应用程序,缺点是硬件设计比较复杂,调试麻烦。第二种方案是采用西安泰达电子公司生产的USB20C模块为器件,USB20C是于西安电子有限公司设计的USB2.0C设备通用接口模块,它隐藏了通过USB总线进行数据传输所需要的烦琐技术细节.应用程序通过调用本模块提供的函数,可以把相应的功能转变成模块硬件接口上的一系列脉冲和电平,发送到外围逻辑,进行指定的数据传输,从而极大的简化USB设备的设计工作.USB设备的应用目前在国外处于高速发展阶段,在国内也已广泛运用,在USB数据采集,USB工业控制等领域已经取得了一定的成果,在现实中等到成功的运用。USB2.0协议,数据传输速度高达480MBPS,如此高的传输速率能用于1.0的传输速率所无法满足的地方。如高时实性的工业设备控制,动态图象实时传输等。随着时代的进步和技术的发展,USB必将在更广泛的领域得到更深层次得应用。VISUALBASIC系列软件是美国MICROSOFT公司推出得,是很好得程序设计系统。我们将借助它方便,快捷以及功能强大等特点来完成这次毕业设计。89 1.2设计方案的选择1.2.1硬件:USB20C可以作为用户系统的嵌入式模块使用,用户无需深入了解USB的协议及底层控制操作,就像操作PC总线一样,通过USB接口实现对用户系统的控制。对于笔记本电脑来说,使用USB接口的意义更加重大,通用的USB接口不仅使笔记本电脑对外的连接变得方便,更可以使笔记本电脑生产厂商不再需要为不同配件在主板上安装不同的接口,这使主板的线路,组件的数量以及复杂程度都有不用程度的消减,从而使系统运行中的散热问题得到很好的改善。也将促进更高主频的处理器可以迅速应用在移动计算机中,使笔记本电脑于PC的差距进一步缩小。USB20C控制模块发挥了USB2.0高速数据传输的特点,尤其适合于高速数据采集及图象数据传输设备,用于医疗,地震,振动,监控,虚拟仪器,科研实验室,工业生产现场领域的数据采集设备,特别是为便携式笔记本电脑和日益流行的饿掌上电脑数据采集提供了极为广阔的发展空间。89 本论文的硬件主要有三部分组成:西安泰达电子公司生产的USB20C模块,单片机AT89C51及模数转换ADC0809。外部模拟信号从ADC0809的8个输入口进入,经模数转换后变成数字信号输出到单片机AT89C51内进行信息处理,单片机连接到USB20C模块上,数据传输到模块上进一步处理,最后连接到个人计算机中。本设计的硬件连接框图如下所示:ADC0809AT89C51USB20C模块个人计算机1.2.2.软件设计:USB接口数据采集系统软件主要由USB芯片软件程序,USB系统驱动程序和计算机应用程序三大部分组成。本设计采用的USB20C接口c,USB芯片软件程序由USB20C自带,不需另外编写。USB系统驱动程序采用中断方式完成软件的编写;同时,为了保证程序的模块化及良好的可移植性,在设计中采用分层结构进行软件的编写。89 本论文的程序主要为上位机程序,考虑到大一时学过VB程序设计,所以在本文中的上位机程序均才用VB来编。89 第二章硬件电路的设计本设计要涉及大量的电路基础知识,为更详细的介绍本设计的思想,接下来将介绍有关电路方面的知识,包括:MCS-51系列单片机的介绍,51单片机的通信原理,USB20C的使用说明,模数转换器A/D0809的介绍,特别是对USB20C,本章对其进行了重点介绍。在各小节进行子电路的设计,在第三节将子电路综合起来,进行总电路的连接和设计。2.1模数转换电路模拟信号转换成数字信号示进行本设计的第一步,所以即显得格外的重要。而模数转换涉及到模数转换器选择的问题,也涉及到单片机的接口问题,所以在进行电路设计前对51单片机及A/D转换器进行适当的介绍示很有必要的。89 2.1.1.51系列单片机简介2.1.1.1、8051简介MCS-51是由美国INTEL公司生产的一系列单片机的总称,包括8031,8051,8751,87C51、89C51、8032,8052等。下图是本课题中87C51引脚图和逻辑符号图:图3.1引脚图和逻辑符号2.1.1.2、MCS-51单片机引脚功能89 1、电源:单片机使用的是5V电源,其中正极接VCC引脚,负极接VSS引脚。2、振荡电路:单片机是一种时序电路,必须提供脉冲信号才能正常工作,在单片机内部已集成了振荡器。当使用外接晶体振荡器时,接(18)、(19)脚。3、ALE/PROG(30):地址锁存控制信号,高电平有效。在系统扩展时,ALE用于控制把P0口输出的低8位地址锁存起来,以实现低位地址和数据的隔离。4、复位电路,RST/VPD(9):复位信号输入端。8051接通电源后,在时钟电路作用下,该脚上出现两个机器周期(24个振荡周期)以上的高电平,使内部复位。第二功能是VPD,即备用电源输入端。当主电源VCC发生故障,降低到低电平规定值时,VPD将为RAM提供备用电源,以保证存储在RAM中的信号不丢失。5、EA/VPP:内部和外部程序存储器选择线。EA=0时访问外部ROM0000H~FFFFH;EA=1时,地址0000H~0FFFH空间访问内部ROM,地址1000H~FFFFH空间访问外部ROM。6、PSEN(29):片外程序存储器选通信号,低电平有效7、输入/输出口引脚P0、P1、P2和P3:P0口(39~32):该端口为漏极开路的8位准双向口,负载能力为8个高LSTTL负载,它为8位地址线和8位数据线的复用端口。P1口(1~8):它是一个内部带上拉电阻的8位准双向I/O口,P1口的驱动能力为4个LSTTL负载。P2口(21~28):它为一个内部带上拉电阻的8位准双向I/O口,P2口的驱动能力也为4个LSTTL89 负载。在访问外部程序存储器时,它作存储器的高8位地址线。P3口(10~17):P3口同样是内部带上拉电阻的8位准双向I/O口,P3口除了作为一般的I/O口使用之外,其还具有特殊功能。2.1.1.3.、8051单片机的结构特点8051单片机是MCS-51系列单片机的一个产品。MCS-51系列单片机是Intel公司推出的通用型单片机。8051单片机是HMOS工艺的,它的片内程序存储器ROM为掩膜型的,在制造芯片时已将应用程序固化进去,使它具有了某种专用功能。其特点如下:1.数据存储器(RAM):片内为128个字节(单元),片外最多可外扩至64K字节。2.程序存储器(ROM):片内为4K字节,片外最多可外扩至64K字节。3.中断系统:有5个中断源,2级中断优先权。4.定时器/计数器:2个16位的定时器/计数器,具有四种工作方式。5.串行口:1个全双工的串行口,具有四种工作方式。6.并行口:4个8位并行I/O口,即P0口、P1口、P2口、P3口。89 7.特殊功能寄存器(SFR):共有21个,用于对片内各功能模块进行管理、控制、监视。实际上是一些控制寄存器和状态寄存器,是一个特殊功能的RAM区。8.位处理器(CPU):为8位的CPU,且内含一个1位CPU(位处理器)不仅可处理字节数据,还可进行位变量的处理。9.片内振荡器及时钟电路,具有布尔代数的运算能力。2.1.1.4、单片机的时钟电路与复位电路(一)时钟系统的设计80C51系列单片机片内时钟振荡器与外部谐振电路如图3.2.3所示,其片内振荡器与外部谐振电路构成了一个并联谐振的时钟振荡电路。外部谐振电路并行连接石英晶体或陶瓷谐振器QC和负载电容C1、C2、QC通常都按时钟频率选择相应的石英谐振器。80C51系列单片机可使用的外部独立时钟振荡器产生时钟信号。使用外部时钟信号时,输入连接如图3.2.2,3.2.1是本课题中使用的时钟电路:89 (二)复位电路(1)典型的上电复位电路如图3.3.1(本课题中使用到):(2)外部复位电路如图3.3.2:(3)上电及外部复位电路如图3.3.3(本课题中使用到):(4)上电外部复位电路如图3.3.4:89 2.1.1.5、系列单片机的中断系统中断是指中央处理器CPU正在处理某事情的时候,外部又发生了某一件事需要CPU迅速处理,于是CPU暂时中断当前的工作,转入处理所发生的事件,中断处理完后在返回到原来的地方继续处理原来的事件。8051中一共有5个中断源:两个外部中断INT0和INT1,两个计数/定时器中断T1和T2,一个串行口中断。本课题中用到了串行中断,INT0/1,其电气连接见电气原理图,在应用程序中也有体现。(一)MCS-51中断系统的控制寄存器89 定时器/计数器控制寄存器TCON(地址是88H,可以按位寻址)D7D6D5D4D3D2D1D0TF1TF0IE1IT1IE0IT0 · IE1/IE0:外部边沿触发中断请求标志,其功能和操作类似于TF0。 · IT1/IT0:外部中断类型控制位,通过软件设置或清除,用于控制外中断的触发信号类型。IT1=1是边沿触发,IT=0是电平触发。·SCON是串行口控制寄存器,地址为98H,低二位是串行口的发送/接收中断标志:· TI:MCS-51串行口的发送中断标志,在串行口以方式0发送时,发送完8位数据,由硬件置位。但是CPU响应中断请求后,必须有“CLRTI”或“ANLSCON,#0FDH”等指令来清零TI。· RI:串行口接收中断标志,若串行口接收器允许接收,并以方式0工作,每当接收到8位数据时,RI被置1,若以方式1、2、3方式工作,当接收到半个停止位时,TI被置1表示串口接收器正向CPU申请中断。同样RI标志由用户的软件清“0”中断允许寄存器IE(地址为A8H,可以按位寻址)D7D6D5D4D3D2D1D0EAESET1EX1ET0EX0· EA:中断总控制位,EA=1,CPU开放中断。EA=0,CPU禁止所有中断· ES:串行口中断控制位,ES=1允许串行口中断,ES=0,屏蔽串行口中断。89 · ET1/0:定时/计数器T1中断控制位。ET1为1允许T1中断,为0禁止T1中断。· EX1/0:外中断1中断控制位,EX1为1允许外中断1中断,为0禁止中断。中断优先级寄存器IP8051单片机有高/低优先级两个中断优先级,每个中断源都可以编程为高优先级和低优先级。两级中断通过使用IP寄存器设置,地址为B8H,可以按位寻址:D7D6D5D4D3D2D1D0PSPT1PX1PT0PX0其中各位为1时,被声明为高优先级中断,为0时声明为低优先级中断。8051复位时,IP被请“0”,5个中断源都在同一优先级,若几个中断源同时产生中断请求,则CPU按照片内硬件优先级链路的顺序响应中断,顺序如下:中断源外部中断0(IE0)高定时器/计数器0(TF0)外部中断1(IE1)89 定时器/计数器1(TF1)串行口中断(RI/TI)低(二)中断响应过程中断响应的条件:MCS-51工作时,在每个机器周期中都会去查询一下各个中断标记,在下列三种情况之一时,CPU将封锁对中断的响应:(1)CPU正在处理一个同级或更高级别的中断请求。(2)现行的机器周期不是当前正执行指令的最后一个周期。要等整条指令都执行完了,才能响应中断。(3)当前正执行的指令是返回批令(RETI)或访问IP、IE寄存器的指令,则CPU至少再执行一条指令才应中断。CPU响应中断时,把当前下一条指令的地址送入堆栈,根据中断标记,将中断入口地址送入PC程序指针,CPU取指令根据PC中的值,程序就会转到中断入口处继续执行。每个中断向量地址间隔了8个单元,如0003-000B,在中断处安排一个LJMP指令,这样就可以把中断程序跳转到任何地方,例如:ORG0000H89 LJMPSTART;跳转主程序ORG0003HLJMPINT0;转外中断0ORG000BHRETI中断程序完成后,执行一条RETI指令,执行这条指令后,CPU将会把堆栈中保存着的地址取出,送回PC,那么主程序就会从主程序的中断处继续往下执行了。中断优先级处理与中断嵌套:优先级的问题发生在几个中断同时产生的情况,或者是已发生在一个中断,又有一个中断产生时的情况。如果有低优先级的中断正在执行,那么高优先级的中断出现,CPU则会响应这个高优先级中断,即高优先级中断可以打断低优先级中断,反之则不行。下图面是一个中断嵌套流程:89 2.1.1.6、控制寄存器8051单片机通过引脚RXD(P3.0,串行数据接收端)和引脚TXD(P3.1,串行数据发送端)与外界通讯。SBUF是串行口缓冲寄存器,包括发送寄存器和接收寄存器。它们有相同名字和地址空间,但不会出现冲突。  串行通信控制寄存器SCON表二:串行口的工作方式及接收/发送控制。字节地址为98H,其各位定义如下数据位D7D6D5D4D3D2D1D0位名称SM0SM1SM2RENTB8RB8TIRI位地址9FH9EH8DH9CH9BH9AH99H98H表三:(1).SM0、SM1:串行口工作方式选择位,其定义如下SM0、SM1工作方式功能描述波特率00方式08位移位寄存器Fosc/1289 01方式110位UART可变10方式211位UARTFosc/64或fosc/3211方式311位UART可变其中fosc为晶振频率(2).SM2:多机通信控制位    多机通信是工作于方式2和方式3。本课题不涉及,在此不作介绍。(3).REN:允许接收位    REN用于控制数据接收的允许和禁止,REN=1时允许接收,REN=0时禁止接收。    (4).TB8:发送接收数据位8    在方式2和方式3中,TB8是第9位数据位。在多机通信中同样亦要传输这一位,并且它代表传输的地址还是数据,TB8=0为数据,TB8=1时为地址。    (5).RB8:接收数据位8    在方式2和方式3中,RB8存放接收到的第9位数据,用以识别接收的数据特征。    (6).TI/RI:发送/接收中断标志位,在前面中断一章已作介绍。电源管理寄存器PCON:主要是设置SMOD位,当SMOD=1时,串行口波特率加倍。系统复位默认为SMOD=0。中断允许寄存器IE:其中ES=1允许串行中断,ES=0,禁止串行中断。在本课题中既涉及到的单片机对其性能及内存无特殊要求,可选最常用的一种,例如AT89C51单片机。89 2.1.2.模数转换芯片的介绍及选择在测控系统中。除了数字量之外,还存在大量的模拟量,如:温度,压力,流量,速度,电压,电流等。而计算机只能处理数字量,要实现对模拟量的测量和控制,首先必须将模拟量转换成数字量(A/D转换)。相反。计算机输出时有时也需要将数字量转换成模拟量(D/A转换)。目前,A/D转换和D/A转换电路都已集成化,它们就有体积小,功能强,可靠性高,误差小,功耗底,与计算机接口简单等特点。A/D转换是把模拟量转换成数字量的过程.A/D转换的方法很多,如:频率法.双斜积分法,逐次逼近法等.其性能指标也很多,如:分辨率,转换时间,转换精度,电源,输出特性等.ADC0809是一种典型的A/D转换器.它是采用逐次逼近法的8位8通道的A/D转换器.+5V单电源供电.转换时间在100us左右.ADC0809为28引脚,双列直插芯片,其引脚如图8-51所示.各引脚功能如下:IN7~IN0:8位模拟量输入端;D7~D0:8位数字量输出端口;89 START:A/D转换启动信号输入端;ALE:地址锁存应许信号.高电平有效;EOC:转换结束信号,高电平有效;OE:输出应许控制信号,高电平有效;CLK:时钟信号输入端;A.B.C:转换通道的地址;VREF(+):参考电源的正端;VREF(-):参考电源的负端;VCC:电源负端;GND:地.ADC0809由一个8位A/D转换器,一个8路模拟开关,8路模拟地址锁存译码器和一个三态数据输出锁存器组成.当ALE为高电平时,通道地址输入到地址锁存器中,下降沿将地址锁存,并译码.在START上跳沿时,所有的内部寄存器清0,在下降沿时,开始进行A/D转换,此期间START应保持低电平.需要注意的是,在START下降沿后10us左右,转换结果信号EOC变为低电平,EOC低电平时,表示正在转换,变为高电平时,表示转换结束.OE为输出应许信号,控制三态输出锁存器输出数据,OE=1,应许转换结果输出.因本设计对模数转换器并无特殊要求,所以一般的模数转换芯89 即可实现将进入的模拟信号转换为数字信号。本设计采用最常用的转换芯片ADC0809。2.1.3.模数转换电路图2.1.3.1.单片机与ADC0809的连接是一个很常见的数模转换电路,现将在本设计中要用到的此电路略画如下:D0~D7ABCCLKEOCSTARTALEOEP0AT89C51ALEINT1WRP2.0RD/41≥1189 ≥112.1.3.2 单片机内数据采集的子程序:数据采集框图主程序ORG0000HAJMPMAIN置数据首地址及通道计数器,通道地址为IN0ORG0013HAJMPPINT1MAIN:MOVR1,#30H置INT1边沿触发MOVR7,#08H89 MOVDPTR,#FEF8H启动IN0A/DSETBIT1SETBEXI8路采完SETBEAMOVX@DPTRA禁止INT1中断LOOP:MOVA,R7结束JNZLOOPCLREXISJMP$PINT1:MOVXA,@DPTR89 MOVX@R1,AINCR1INCDPTRDECR7MOVX@DPTR,ARET12.2USB模块接口电路这个模块接口电路是本设计的重点设计电路,依据USB模块的说明及单片机的相关知识,即可设计出满意的电路。因此,在论文中对USB模块进行详细的介绍就显得很有必要了。2.2.1USB20C模块介绍89 2.2.1.1.模块参数。USB20C是于西安电子有限公司设计的USB2.0C设备通用接口模块,它隐藏了通过USB总线进行数据传输所需要的烦琐技术细节.应用程序通过调用本模块提供的函数,可以把相应的功能转变成模块硬件接口上的一系列脉冲和电平,发送到外围逻辑,进行指定的数据传输,从而极大的简化USB设备的设计工作本模块提供两种数据传输模式地址IO模式批量数据传输模式以设计一个AD数据采集器为例可以使用地址IO模式执行初始化设置采样参数读取状态等功能使用批量数据传输模式读取采样得到的大批量数据本模块是一个USB2.0设备同时也兼容USB1.1标准但是会降低数据传输速度标准USB接口高性能USB接口器件符合通用串行总线USB2.0版规范高速DMA读写控制读写速度大于20Mbyte/Sec系统驱动文件DLL动态连接库用户不必编写任何驱动程序MT工艺低功耗系统超小体积模块化设计,无需外接电源简化的标准外部总线:8位数据总线双向5位地址总线单向输出9根读写控制线89 配备I2C存储模块提供一个48MHz(30MHz)的时钟输出提供5V电源输出USB20C可以作为用户系统的嵌入式模块使用用户无需深入了解USB的协议及底层控制方法就像操作PC总线一样通过USB接口实现对用户系统的控制对于笔记本电脑来说使用USB接口的意义更加重大通用的USB接口不仅使笔记本电脑对外的连接变得方便更可以使笔记本电脑生产厂商不再需要为不同配件在主板上安置不同的接口这使主板的线路组件的数量以及复杂程度都有不同程度的削减从而使系统运行中的散热问题得到了改善也将促进更高主频的处理器可以迅速应用在移动计算机中使笔记本电脑与桌面PC的差距进一步缩小USB20C控制模块发挥了USB2.0高速数据传输的特点尤其适合于高速数据采集及图像数据传输设备用于医疗地震振动监控虚拟仪器科研实验室工业生产现场领域的数据采集设备特别是为便携式笔记本电脑和日益流行的掌上电脑数据采集提供了极为广阔的发展空间USB20C模块示意图2.2.1.2.硬件描述89 本模块提供了8位数据总线5位地址总线3位地址IO所需的控制信号9位批量传输所需的控制信号以及其他的辅助控制信号辅助控制信号本模块提供了4根辅助控制信号DMAINGCLKOUTSCLSDADMAING正在批量数据传输指示信。本信号为数据传输模式指示信号由本模块输出高电平指示工作于批量数据传输模式低电平指示工作于地址IO模式本信号由函数USB20C_STARTDMAREADUSB20C_STARTDMAWRITE设置为高电平由函数USB20C_ENDDMA设置为低电平CLKOUT模块内单片机时钟输出信号本信号输出模块内单片机的时钟本信号由函数USB20C_SETCPUCS控制可以设定时钟的频率是否输出是否翻转SCLSDA外接I2C器件信号本信号用于外扩I2C存储器使用时需要把本模块的这两个信号管脚与外扩的I2C器件的相应管脚相连这两个信号已经在模块内上拉不需要外部上拉89 外扩I2C存储器件的芯片地址只能是23456之一地址017已经被本模块使用外扩器件不得使用SCL时钟信号上的工作频率可以由函数USB20C_SetI2CFrequency函数选择为400KHz/100KHz2.12.1.12.1.22.1.3Xi’anDATAElectronicCo.Ltd.029-8527242185277568http://www.dataie.com5USB20C使用说明西安达泰电子有限责任公司2.2数据总线本模块提供8位宽的数据总线两种数据传输模式共用此数据总线当工作于地址IO模式并且PWR信号有效或者工作于批量传输模式DMARD信号有效并且DMACSDMAOE有效时数据总线处于输出状态否则数据总线处于输入状态地址总线本模块提供5位宽的地址总线地址总线总是由本模块输出以下函数可以改变地址USB20C_SETADDRESSUSB20C_INPUTUSB20C_OUTPUTUSB20C_MULTINPUTUSB20C_MULTOUTPUTUSB20C_MIXEDIO89 当使用后三个函数时地址会根据函数的参数而改变函数调用结束后地址为函数参数指定的最后一个地址2.3Xi’anDATAElectronicCo.Ltd.029-8527242185277568http://www.dataie.com6USB20C使用说明西安达泰电子有限责任公司2.4地址IO所需的控制信号本模块提供了3个地址IO所需的控制信号PWRPRDPWAITPWR地址写本信号为地址写的写脉冲是一个低电平脉冲本脉冲由函数USB20C_OUTPUTUSB20C_MULTOUTPUT产生当进行一次地址写时本模块首先更新地址总线把数据总线定义为输出并输出数据然后使PWR=0接着判断PWAIT状态等待PWAIT=1此时可以等待外部单片机等慢速逻辑执行或者超时超时时间由模块内单片机的工作频率决定具体时间待测最后使PWR=1把数据总线定义为输入完成一次地址写PRD地址读本信号为地址读的读脉冲是一个低电平脉冲本脉冲由函数USB20C_INPUTUSB20C_MULTINPUT89 产生当进行一次地址读时本模块首先更新地址总线把数据总线定义为输入使PRD=0接着判断PWAIT状态等待PWAIT=1或者超时然后从地址总线读取数据并把此数据返回主机最后使PRD=1完成一次地址读PWAIT等待外围逻辑本信号为一个输入信号一般情况下当外部逻辑为单片机等慢速逻辑时需要使用本信号如果外部逻辑为一个CPLD则可以悬空本信号管脚当外部逻辑为单片机等慢速逻辑时先由外部逻辑把本信号拉低则本模块在地址IO时会在PWRPRD脉冲有效后会插入等待周期等待外部逻辑执行完指定的读/写后外部逻辑把本信号拉高本模块检测到PWAIT=1后结束PWRPRD脉冲外部逻辑检测到PWRPRD无效后再次使PWAIT=0准备好下一次读/写地址IO的时序图注图中PWAIT信号应该反向2.4.12.4.22.4.32.4.4Xi’anDATAElectronicCo.Ltd.029-8527242185277568http://www.dataie.com7USB20C使用说明西安达泰电子有限责任公司注图中PWAIT信号应该反向Xi’anDATAElectronicCo.Ltd.029-8527242185277568http://www.dataie.com8USB20C使用说明西安达泰电子有限责任公司2.5批量数据传输所需的控制信号本模块提供了9个批量数据传输所需要的信号他们分别是DMACSDMARDDMAWRDMADIRDMAOEPKTENDFIFOEMPTYFIFOFULLIFCLKDMACS89 模块选择信号由外部逻辑提供低电平有效当整个设备需要本模块与其他外部逻辑需要共享数据总线时使DMACS=1可以使本模块断开与外部总线的链接本模块将忽略DMARDDMAWRDMAOEPKTEND信号DMARD由外部逻辑提供低电平脉冲有效当使用USB20C_DMAWRITE从主机向设备写数据时数据首先从主机传送到本模块内的缓冲区内外部逻辑使用DMARD脉冲从本模块的缓冲区内读取主机发来的数据当DMAOE有效时读到的数据在DMARD为低电平时从数据总线输出当DMAOE无效时数据总线悬空但是DMARD脉冲依然有效只不过数据不能输出DMAWR由外部逻辑提供低电平脉冲有效当使用USB20C_DMAREAD主机从设备读数据时外部逻辑首先使用DMAWR脉冲把数据写入本模块的缓冲区内然后数据从本模块内的缓冲区内传输到主机DMADIR读/写控制信号由本模块输出高电平批量读数据数据从设备传向主机低电平批量写数据数据从主机传向设备DMAOE89 由外部逻辑提供低电平有效当DMAOE有效时外部逻辑从本模块内部缓冲区读数据时在DMARD为低电平时读到的数据从数据总线输出当DMAOE无效时数据总线悬空但是DMARD脉冲依然有效只不过数据不能输出PKTEND由外部逻辑提供低电平脉冲有效在批量读数据时外部逻辑使用DMAWR把数据写入本模块内部缓冲区每写满一个数据包后如果本模块连接在USB2.0总线上则每个数据包为512字节如果连接在USB1.1总线上则数据包为64字节数据会自动传送到主机如果需要传输一个不满的数据包短包比如需要传输31个字节则外部逻辑应该在写31个字节数据后产生一个PKTEND脉冲本模块接收到一个PKTEND脉冲后会把接收到短包发送回主机FIFOEMPTY本模块内部缓冲区空标志由本模块输出低电平有效本信号在批量写数据时使用本模块内部提供了2048字节的批量写数据缓冲区在批量写数据时主机首先发送数2.5.12.5.22.5.32.5.42.5.52.5.62.5.7Xi’anDATAElectronicCo.Ltd.029-8527242185277568http://www.dataie.com9USB20C使用说明西安达泰电子有限责任公司据到本模块的内部缓冲区本模块接收到数据后会使本信号无效表示内部缓冲区已经有数据共外部逻辑读取外部逻辑检测到本信号无效开始从本模块缓冲区读取数据数据全部读出后本信号重新有效此时外部逻辑应停止从本模块读取数据FIFOFULL本模块内部缓冲区满标志由本模块输出低电平有效本信号在批量读数据时使用89 本模块内部提供了2048字节的批量读数据缓冲区在批量读数据时如果本模块的内部缓冲区不满则模块使本信号无效表示可以向本模块内部缓冲区写数据外部逻辑检测到正在批量读数据而且本信号无效开始向本模块写数据每写满一个标准数据包如果本模块连接在USB2.0总线上则每个数据包为512字节如果连接在USB1.1总线上则数据包为64字节后如果主机正在使用USB20C_DMAREAD函数读取数据则数据自动发送到主机如果主机一直没有读取数据则在外部逻辑写满2048个字节后模块内部缓冲区满本信号有效此时外部逻辑应停止写数据。2.2.2.USB模块与单片机的接口电路根据以上USB模块的说明,可设计出多个其与单片机的接口电路,例如以下两种:89 考虑到本设计的内部程序不大,不需要太多的扩展,且尽量使设计更简单,本设计采用第一种连现方法,既采用5根地址线,8根数据线。为了进一步提高数据采集的效率,本设计采用中断工作方式。首先求定时器初值:我们利用定时器每隔1毫秒控制产生宽度为2个机器周期的负脉冲,由P1.0送出。时钟频率为12MHZ。设定时器初值为X,则定时1毫秒时,应有:(213-X)*10-6=1*10-3?式中机器周期为1毫秒,可求的X=7096=1101110111000B,其中高8位DDH赋给THO,底五位赋给TLO,由于系统复位后,TMOD被清,正好处于定时器方式0状态,且GATE=0,也可步设置TMOD。程序如下:ORG0000HAJMPMAIN89 ORG000BHAJMPTOINTORG100HMAIN:MOVTH0,#0DDHMOVTL0,#18HMOVIE,#82HSETBTROLOOP:SJMPLOOPORG200HTOINT:CLRP1.0SETBP1.0MOVTH0,#0DDHMOVTL0,#18HRETI以上既为单片机内部的中断程序。89 下面为其程序框图:中断程序框图INT1中断取转换结果通道地址+1通道计数-1启动一次A/D通道返回2.2.3.总体电路的设计将以上各单元电路组合起来,就可得到完整的硬件电路如下:89 单片机内部程序:ORG0000HLJMPMAIN;复位,转主程序ORG0013HLJMPPINT1;中断,转中断服务子程序MAIN:MOVR1,#30H;置数据区首地址89 MOVR7,#08H;置通道数MOVDPTR,#FEF8H;置0809通道0地址SETBIT1;置边沿触发方式SETBEXI;开中断SETBEA;CPU开中断MOVX@DPTRA;启动0通道A/DDECR7;通道数减1SJMP$;等待中断ORG0200H;中断服务子程序PINT1:MOVXA,@DPTR;读A/D值89 MOVX@R1,A;存A/D值INCR1;修正数据区地址INCDPTR;修正通道地址MOVX@DPTR,A;启动下一通道A/DDJNZR7,GORETI;判断8路采集完否CLREX1;8路采集已完,关中断MAIN:MOVTH0,#0DDHMOVTL0,#18HMOVIE,#82HSETBTROLOOP:SJMPLOOPORG200HTOINT:CLRP1.089 SETBP1.0MOVTH0,#0DDHMOVTL0,#18HRETIMOVDPTR,#2000H;置USB数据地址LOOP:MOVR0,#30H;传采集数据MOVR7,#08H;置循环次数MOVA,R0;存数据MOV·DPTR,A;传数据至USB20C接口INCR7;次数自动减1DJNZR7,LOOP;判断是否完RETI;数据采集完89 单片机主程序框图开始单片机初始化开USB中断发送数据至USB8位数据送完禁止INTI中断8路采完启动IN0A/D设INT1边沿触发89 第三章软件设计3.1.VisualBasic简介VisualBasic语言诞生于1991年,为人们开发图形用户界面的应用程序提供了有力的工具,它是近年来被广泛使用的一种高级语言。VisualBasic继承了BASIC语言简单易学的特点,又增加了许多新的功能,它采用当前最新的程序设计思想:面向对象与事件驱动,使编程变得更加方便,快捷。使用VisualBasic既可以开发个人或小组使用得小型工具,又可以开发多媒体软件,数据库运用程序,网络运用程序等大型软件。USB2.0数据采集系统需要硬件和软件两部分组成,硬件由USB信号模拟器以及计算机组成,软件由测试软件和动态数据库组成.在测试程序中处理各种数据,显示处理结果,在动态数据库中进行数据的存储,读取操作.3.2.USB20C函数接口介绍.3.2.1,USB设备操作函数89 函数名函数功能备注①设备操作关键函数USBDLLInit初始化USB总线的设备对象USBDLLDone关闭设备,且释放USB总线设备对象USB_GetStatus读状态输入信息USB_Inport从数据总线读一个字节USB_Outport输出一个字节的数据USB_BulkInport批量读数据USB_SetControl设置控制输出②辅助函数USB_ReadADOnce设置并读取一次AD转换值USB_LastError获得USB错误信息使用需知VisualC++:要使用如下函数关键的问题是:首先,必须在您的源程序中包含如下语句(注意参考VC示范程序中的StdAfx.h头文件中的用户填加部分):#include“C:USB203INCLUDEusb203.h”注:以上语句采用默认路径,应根据您的安装情况确定usb203.h头文件的正确路径,当然也可以把此文件拷到您的源程序目录中。其次,您还应该在VisualC++编译环境软件包的ProjectSetting对话框的Link属性页中的Object/LibraryModule输入行中加入如下指令:C:USB203usb203.lib89 注:以上语句采用默认路径,应根据您的安装情况确定usb203.lib的路径,当然也可以把此文件拷到您的源程序目录中。为了驱动程序和相关接口尽量精炼快速,所以没有加任何调试代码,因此用户在使用VC接口的时候应使用发行版本进行源代码编译(Win32Release),而不应该使用调试版本(Win32Debug)。具体方法是在源代码编译前,执行Build总菜单中的SetActiveConfiguration子菜单命令,便可实现其发行版的设置,然后再编译,即可生成发行版的应用程序。VisualBasic:要使用如下函数一个关键的问题是首先必须将我们提供的模块文件加入到VB工程中。其方法是选择VB编程环境中的工程菜单,执行其中的"添加模块"命令,在弹出的对话中选择usb203.bas模块文件,该文件的路径为用户安装驱动程序后其子目录SamplesVB的下面。3.2.2.函数原型说明关于VisualC++函数的原型请参考usb203.h头文件(forVisualC++)或usb203.bas(forVisualBasic)。另外请注意,因考虑VisualC++和VisualBasic两种语言的兼容问题,在下列函数说明和示范程序中,所举的VisualBasic程序均是需要编译后在独立环境中运行。所以用户若在解释环境中运行这些代码,我们不保证能顺利运行。UsbBusVer2.dll函数说明定义了以下的函数返回值。#defineUSBERR_SUCCESS0成功#defineUSBERR_INVALIDGUID1错的GUID,可能设备没有安装。89 #defineUSBERR_INVALIDINTERFACEDATA2错的接口信息。#defineUSBERR_NOMEMORYFORDEVICEDATA3没能分配内存。#defineUSBERR_CANNOTGETDEVICEDATA4没有得到设备信息。#defineUSBERR_CANNOTOPENPIPE5不能打开“管道”。#defineUSBERR_INVALIDUSER6程序没有使用DLL的权限。#defineUSBERR_CANNOTWRITEINFOPIPE7“写”信息管道出错。#defineUSBERR_CANNOTREADINFOPIPE8“读”信息管道出错。#defineUSBERR_CANNOTREADMAINPIPE9“读”数据管道出错。其中,错误1-5只可能由函数USBDLLInit返回。UsbBusVer2.dll动态连接库定义了以下的函数。int_stdcallUSBDLLInit(HANDLEinstance);int_stdcallUSBDLLDone();int_stdcallUSB_GetStatus();int_stdcallUSB_Inport(charAddr);int_stdcallUSB_Outport(charAddr,charData);89 int_stdcallUSB_BulkInport(charAddr,WORDLen,void*Data,int*ReadLen);int_stdcallUSB_SetControl(charData);int_stdcallUSB_ReadADOnce(void*Data,int*ReadLen);int_stdcallUSB_LastError();下面是函数功能的详细说明。1、初始化函数:int_stdcallUSBDLLInit();应用程序在调用其他函数之前应该首先调用本函数,本函数的主要功能是初始化设备句柄,以及确认设备没有被占用。如果在本调用之前本DLL已经被另一个应用程序使用,则本次调用会返回USBERR_INVALIDUSER错误。如果没能初始化设备句柄,则会返回错误1-5之一。2、结束函数:int_stdcallUSBDLLDone();本函数的功能是释放设备句柄。应用程序结束之前应该调用本函数以释放设备句柄。3、读状态输入信息:int_stdcallUSB_GetStatus();89 本函数的功能是读当前状态总线的数据,函数返回输入状态,低4位数据有效。4、从数据总线读一个字节:int_stdcallUSB_Inport(charAddr);本函数先把地址Addr写入地址总线,然后从数据总线读一个字节数据(总线上的RD会产生一个低电平脉冲),函数返回值为数据。5、输出一个字节的数据:int_stdcallUSB_Outport(charAddr,charData);本函数先把地址Addr写入地址总线,然后把数据Data写入数据总线(总线上的WR会产生一个低电平脉冲)。6、批量读数据:int_stdcallUSB_BulkInport(charAddr,WORDLen,void*Data,int*ReadLen);需要读大量数据时使用本函数。Addr是将要输出在地址总线上的地址,Len指示数据长度(以64字节为单位),Data指向一个应用程序提供的数据缓冲区,ReadLen指示读到了多少数据(以字节为单位)。例如:需要读32k字节数据,则数据缓冲区至少要32k,Len应该为512,如果读数据成功则ReadLen应为32768。7、设置AD并读取转换值:int_stdcallUSB_ReadADOnce(void*Data,int*ReadLen);获得16个字节,8个字,对应8个模拟通道的转换数据。89 8、设置控制总线:int_stdcallUSB_SetControl(charData);本函数的功能是把数据Data输出到控制总线,低4位数据有效。9、获得错误信息:int_stdcallUSB_LastError();返回USB操作的错误代码。代码含义参照上述说明。3.3程序设计因程序的驱动程序在USB20C模块里已经有了,所以在这就不用再编写,而在此编写的程序主要为PC机的上位机程序。本系统主要功能是用于USB接口数据传输速率检测,要完成此功能,需要模拟数据输入系统,模拟数据输出系统,检测程序,数据库系统几大部分组成,这几个相对独立的子系统通过VB程序软件进行联系.首先,为了更简洁明了的编写此程序,现将上位机的程序框图绘制如下:3.3.1上位机程序框图89 启动USB程序检测USB设备设置设备参数接受模拟信号数据接受数据伟有效数据?启动检测程序数据分析数据的存储显示等待下组模拟信号数据结束89 3.3.2.VB程序设计OptionExplicitDimlvwItemAsListItemDimstrGetAsStringDimiAsIntegerDimblUpAsBooleanDimblDownAsBooleanDimdriverIndexAsIntegerPrivateSubcboI2cType_Click()i2cType=newClsMechod.Get_I2CType_Value(cboI2cType.Text)EndSub89 SubInitialControl()WithLvw.ColumnHeaders.Add,,"调用函数",3000.ColumnHeaders.Add,,"返回状态",1000.ColumnHeaders.Add,,"状态说明",Me.Width-3100EndWithEndSubPrivateSubcmdADRead_Click()frmADRead.ShowEndSubPrivateSubcmdExit_Click()USB20C_Done89 UnloadMeEndSubPrivateSubcmdInitial_Click()"确定当前系统上连接了几个本模块?"DevNo第几个连接到当前系统的模块。DevNo=0表示第1个连接到当前系统的模块。CallCloseDrive"关闭已打开的设备gApiLong=USB20C_Init(driverIndex,i2cType)IfgApiLong>0ThenSelectCasegApiLongCase189 CallAddMessageList("USB20C_Init",gApiLong,"全速(USB1.1)模式")Case2CallAddMessageList("USB20C_Init",gApiLong,"高速(USB2.0)模式")EndSelectElseCallAddMessageList("USB20C_Init",gApiLong,"调用错误")ExitSubEndIf"模块是否工作于高速模式gApibl=USB20C_WorkAtHighSpeedIfgApiblThenCallAddMessageList("USB20C_WorkAtHighSpeed",gApibl,"系统工作在高速模式")Else89 CallAddMessageList("USB20C_WorkAtHighSpeed",gApibl,"系统工作在全速模式")EndIf"断开与模块的连接"gApiLong=USB20C_Done()"CallAddMessageList("USB20C_Done",gApiLong,"断开与当前设备的连接")EndSubPrivateSubcmdIo_Click()DimiAddAsByteDimstrHexAsStringstrHex="FF"Fori=1ToLen(strHex)iAdd=iAdd*16+GetVal(Mid(UCase(strHex),i,1))89 NextigApibl=USB20C_SetAddress(iAdd)"MsgBox"GetErrorCode"&USB20C_GetLastErrorIfgApiblThenCallAddMessageList("USB20C_SetAddress",gApibl,"调用成功")ElseCallAddMessageList("USB20C_SetAddress",gApibl,"调用失败")EndIfnewNumber.iAdd=iAddgApiLong=USB20C_Input(newNumber.iAdd)gApiLong=USB20C_Input(newNumber.iAdd)IfgApiLongThen89 CallAddMessageList("USB20C_Intput",gApiLong,"调用成功")ElseCallAddMessageList("USB20C_Intput",gApiLong,"调用失败")EndIfnewNumber.iAdd=8gApibl=USB20C_Output(newNumber.iAdd,CByte(255))"gApibl=USB20C_Output(newNumber.iAdd,CByte(255))IfgApiblThenCallAddMessageList("USB20C_Output",gApibl,"调用成功")ElseCallAddMessageList("USB20C_Output",gApibl,"调用失败")89 EndIfEndSubPrivateSubcmdReadAD_Click()frmReadAD.Show1EndSubPrivateSubcmdSetNumber_Click()frmNumber.ShowEndSubPrivateSubcmdUp_Click()WithcmdUpIf.Caption="输入"Then89 blUp=True.Caption="输出"CallUSB20C_Output(2,3)CallUSB20C_Output(2,1)IfblDown=FalseAndblUpThen"CallUSB20C_Output(2,1)ElseCallUSB20C_Output(2,1)CallUSB20C_Output(2,3)EndIfCallcmdUpColor(False)CallTxtShape1Enabled(True)ExitSub89 Else.Caption="输入"IfblDown=FalseAndblUpThenCallUSB20C_Output(2,0)ElseCallUSB20C_Output(2,2)EndIfblUp=FalseCallcmdUpColor(True)CallTxtShape1Enabled(False)EndIfEndWith89 EndSubSubTxtShape1Enabled(eblAsBoolean)txtShape1.Enabled=eblEndSubSubTxtShape2Enabled(eblAsBoolean)txtShape2.Enabled=eblEndSubSubcmdUpColor(blColorAsBoolean)DimiAsIntegerFori=1To8IfblColorThenShape1(i).FillColor=&HFF00&"RGB(255,0,0)ElseShape1(i).FillColor=RGB(0,0,0)89 EndIfNextiEndSubPrivateSubcmdDown_Click()WithcmdDownIf.Caption="输入"ThenblDown=True.Caption="输出"CallcmdDownColor(False)IfblUp=TrueThenCallUSB20C_Output(2,3)ElseCallUSB20C_Output(2,2)89 EndIfCallTxtShape2Enabled(True)ExitSubElse.Caption="输入"CallcmdDownColor(True)IfblUp=FalseAndblDownThenCallUSB20C_Output(2,0)ElseCallUSB20C_Output(2,0)CallUSB20C_Output(2,1)EndIf89 CallTxtShape2Enabled(False)blDown=FalseEndIfEndWithEndSubSubcmdDownColor(blColorAsBoolean)DimiAsIntegerFori=1To8IfblColorThenShape2(i).FillColor=&HFF00&"RGB(255,0,0)ElseShape2(i).FillColor=RGB(0,0,0)EndIf89 NextiEndSubPrivateSubCommand1_Click()DimiAsIntegerlistReadValue.ClearnewNumber.iAdd=&H7gApibl=USB20C_Output(2,1)ArrData(0)=&HBArrData(1)=0ArrData(2)=&HF89 ArrData(3)=&H4ArrData(4)=&HBArrData(5)=1gApibl=USB20C_MultInput(6,ArrData(0))"Num≤60IfgApiblThenCallAddMessageList("USB20C_MultInput",gApibl,"调用成功")ElseCallAddMessageList("USB20C_MultInput",gApibl,"调用失败")EndIfFori=0To5listReadValue.AddItem"A1="&Round((ArrData(i)*2.5)/4095,5)&"V"Nexti89 DimstrErrTxtAsStringstrErrTxt=newClsMechod.GetErrToStr(USB20C_GetLastError)MsgBox(strErrTxt)EndSubPrivateSubCommand2_Click()DimsByteAsBytesByte=&H0gApibl=USB20C_Output(2,1)EndSubPrivateSubCommand3_Click()89 frmDMA.Show1EndSubPrivateSubForm_Load()CallInitialControlCallnewClsMechod.Set_StatusBar(Me,sBar)CallAddcboIc2TypeCallScan_UsbDriverCallcmdUpColor(True)CallcmdDownColor(True)EndSubPrivateSubForm_Resize()89 OnErrorResumeNextCallnewClsMechod.Set_StatusBar(Me,sBar)Piccmd.Left=Me.Width-150-Piccmd.WidthPiccmd.Height=Me.ScaleHeight-sBar.HeightWithLvw.Width=Me.ScaleWidth-Piccmd.Width-50.Top=Me.ScaleHeight-.Height-sBar.Height+20listReadValue.Left=.LeftlistReadValue.Top=cboDriver.Top+cboDriver.Height+100"Me.ScaleHeight-.Height-listReadValue.Height-sBar.HeightlistReadValue.Height=.Top-cboDriver.Top+cboDriver.Height-700listReadValue.Width=cboDriver.Left+cboDriver.WidthEndWithEndSub89 SubAddMessageList(OptionalByValstrCallTypeAsString,OptionalByValgValueAsString,OptionalByValstrShuoMingAsString)OnErrorResumeNextDimipAsIntegerDimiCheckAsIntegerWithLvwip=.ListItems.CountForiCheck=1Toip.ListItems(iCheck).Checked=FalseNextiCheckSetlvwItem=.ListItems.Add(,,strCallType,,1)lvwItem.SubItems(1)=gValuelvwItem.SubItems(2)=strShuoMingIfip>0Then89 .ListItems(ip+1).Checked=True.SetFocus.ListItems(ip+1).EnsureVisibleEndIfEndWithEndSubSubAddcboIc2Type()WithcboI2cType.AddItem"I2C24c01".AddItem"I2C24c02".AddItem"I2C24c04".AddItem"I2C24c16".AddItem"I2C24c32"89 .AddItem"I2C24c64".AddItem"I2C24c128".AddItem"I2C24c256".ListIndex=0EndWithEndSubSubScan_UsbDriver()USB20C_DonegApiLong=USB20C_EnumDeviceCountWithcboDriver89 .ClearIfgApiLong>0ThenFori=1TogApiLong.AddItemiNexti.ListIndex=0driverIndex=.ListIndexCallAddMessageList("USB20C_EnumDeviceCount",gApiLong,"已连接"&gApiLong&"个设备")ElseCallAddMessageList("USB20C_EnumDeviceCount",gApiLong,"当前系统未连接任何模块")MsgBox"系统未连接到任何设备。",vbQuestion,TiShiExitSubEndIf89 EndWithgApiLong=USB20C_Init(driverIndex,i2cType)IfgApiLong>0ThenSelectCasegApiLongCase1CallAddMessageList("USB20C_Init",gApiLong,"全速(USB1.1)模式")Case2CallAddMessageList("USB20C_Init",gApiLong,"高速(USB2.0)模式")EndSelectElseCallAddMessageList("USB20C_Init",gApiLong,"调用错误")ExitSub89 EndIfEndSubPrivateSubForm_Unload(CancelAsInteger)CallCloseDriveUnloadMeEndSubPrivateSubLvw_MouseDown(ButtonAsInteger,ShiftAsInteger,xAsSingle,yAsSingle)IfButton=2ThenMe.PopupMenuMnuLvwClearEndIfEndSub89 PrivateSubMnuAllCLear_Click()Lvw.ListItems.ClearEndSubPrivateSubMnuDelSelect_Click()IfNotLvw.SelectedItemIsNothingThenLvw.ListItems.RemoveLvw.SelectedItem.IndexEndIfEndSubSubCloseDrive()USB20C_Done89 EndSubPrivateSubtxtShape1_Change()IfNotIsNumeric(txtShape1.Text)ThentxtShape1.Text=""ElseIftxtShape1.Text>255ThentxtShape1.Text=255newShapeValue.iAdd=&H0newShapeValue.hexValue=Trim(txtShape1.Text)CallUSB20C_Output(newShapeValue.iAdd,newShapeValue.hexValue)ElsenewShapeValue.iAdd=&H0newShapeValue.hexValue=Trim(txtShape1.Text)CallUSB20C_Output(newShapeValue.iAdd,newShapeValue.hexValue)EndIf89 IftxtShape1.Text=""ThentxtShape1.Text=0newShapeValue.iAdd=&H0newShapeValue.hexValue=Trim(txtShape1.Text)CallUSB20C_Output(newShapeValue.iAdd,newShapeValue.hexValue)EndIfEndSubPrivateSubtxtShape2_Change()IfNotIsNumeric(txtShape2.Text)ThentxtShape2.Text=""ElseIftxtShape2.Text>255ThentxtShape2.Text=255newShapeValue.iAdd=&H189 newShapeValue.hexValue=Trim(txtShape2.Text)CallUSB20C_Output(newShapeValue.iAdd,newShapeValue.hexValue)ElsenewShapeValue.iAdd=&H1newShapeValue.hexValue=Trim(txtShape2.Text)CallUSB20C_Output(newShapeValue.iAdd,newShapeValue.hexValue)EndIfIftxtShape2.Text=""ThentxtShape2.Text=0newShapeValue.iAdd=&H0newShapeValue.hexValue=Trim(txtShape2.Text)CallUSB20C_Output(newShapeValue.iAdd,newShapeValue.hexValue)EndIf89 EndSub89 第四章.结论根据以上的设计,将硬件原理图绘制成PCB板,并且把板子做出来,将单片机内部程序烧进单片机中,将采用VB编的上位机程序拷进PC机中进行调试,结果可以顺利进行外部模拟信号的采集,达到了预先的设计效果。(机房演示)!89 .谢辞这个毕业设计论题对我来说,是个很大的挑战。平时自以为学得可以,其实到真正用得时候,才知道自己还没入门,这次毕业设计之所以能较顺利的完成,得益于各位老师得帮助。别是乐老师,我每次遇到不懂得问题是,要么打话向他咨询,要么立马跑到办公室来,向他请教。在此对老师表示特别的感谢,对曾指导我的各位老师表示感谢这次毕业设计我主要有如下三方面的收获:1通过对USB2.0数据采集系统的设计,使我对单片机外围接口的硬件设计有了更进一步的了解。使我能够进一步掌握程序设计语言解决实际问题的方法,在操作当中把所学到的用于实际的编程里去。89 2在USB2.0接口数据采集系统的设计中,使我能够提高分析问题,查阅资料,吸收新知识的能力,在分析解决问题时比以前有了很大进步。一些很常见的错误可以避免和解决。3.通过USB2.0接口数据采集系统和指导老师乐绍文老师的指导使我能进一步对VB有了熟练的操作,并且在分析,编程方面比以前有了更大的提高。但深感遗憾的使,我这个毕业设计使直接利用西安电子科技公司现有的模块进行的第二次开发,对USB1.1,2.0等通信协议不是很了解,这些都只有在将来的学习与工作中加以补充。再次感谢各位老师!祝老师们工作顺利!89 .附录附录一USB20C模块外部接口总图,A1一张附录二,VB软件框图        ,A1一张附录三,硬件接口简易框图      ,A2一张附录四,VB程序流程框图      ,A2一张附录五,USB20C硬件连接图,A2一张89 89 .参考文献1MCS-51单片机原理及接口技术哈尔冰工业大学出版社。马家辰孙玉德张颖编2单片机原理与控制技术。机械工程出版社。张志良主编。3单片机与嵌入式系统论文集,北航出版社,深圳市计算机行业协会主编48051单片机基础教程,科学出版社,陈明荧编著89 5单片机原理及接口技术,西安电子科技大学出版社,懂晓红主编,邱士安主审。89'