摘 要
USB(Universal Serial Bus)是一种新型的通用串行总线,它是快速的、双向的、同步的、可以热插拨的、动态连接且价格低廉的串行接口。正是基于这一特点,现在很多的计算机外设都有USB接口。本文正是利用这一新型USB接口来设计上位机与下位机系统之间的通信。利用新型的一线式数字温度传感器测量温度,并通过USB接口和计算机端应用软件进行通信。
本文首先介绍了本系统相关的背景知识以及USB的通信协议,进而介绍温度控制的基本意义,提出利用USB设备芯片CH372、一线式数字温度传感器DS18B20和单片机AT89C51来开发基于USB温度控制系统。采集的温度数据通过USB接口上传到上位PC机上,并利用应用软件对其进行处理。上位机应用软件用C ++ builder 编写,其运用CH372接口芯片的动态链接库建立起上位机和下位机之间的通信机制。上位机将采集到的温度数据在PC机上显示出来,并且显示实时温度采集图像。
此外,应用软件可以对下位机进行温度极限设置等简单控制功能,当采集到的温度超过某一设定极限温度,则对系统进行报警。另外下位机还为今后的扩展保留一定的资源。
1 背景知识
在USB产生之前,外设与PC机的通信主要是通过PC机主板上所提供的各种接口来
实现,如ISA接口、PCI接口、串行接口等,这些老式的接口存在着很多缺点:非共享式接口、体积大、接口规格不统一、采用传统的I/O模式等等。为了克服老式接口这些缺点,PC机制造商和用户迫切需要一种新型的外设连接方式。这时USB应运而生,它是一种快速、快速、双向、同步、廉价、并支持热插拨功能的串行接口。
早在1995年,就已经有PC机带有USB接口了,但由于缺乏软件及硬件设备的支持,这些PC机的USB接口都闲置未用。1998年后,随着微软在Windows 98中内置了对USB接口的支持模块,加上USB设备的日渐增多,USB接口才逐步走进了实用阶段。
这几年,随着大量支持USB的个人电脑的普及,USB逐步成为PC机的标准接口已经是大势所趋。在主机(host)端,最新推出的PC机几乎100%支持USB;而在外设(device)端,使用USB接口的设备也与日俱增,例如数码相机、扫描仪、游戏杆、磁带和软驱、图像设备、打印机、键盘、鼠标等等。正是USB具有热插拔、共享式接口、携带方便、标准统一、可以连接多个设备等这样的优点,才使USB得于快速的发展。
本文将利用这一新型计算机接口来设计温度控制系统。
2 系统概述
本章将对基于USB接口的温度控制系统在工业上的应用进行分析,并介绍系统的特点、功能以及使用到的开发工具。
2.1 系统的特性
由于该系统利用USB接口,所以具有USB的实时传送数据,与上位机进行信息交流,而上位机又可以连接在互联网上,所以远程的PC机也可以利用互联网对温度检测系统进行查看等各种操作。该系统利用先进的温度传感器,可以对温度快速的进行反应,把温度数据传到下位机进行初步处理数据,进而与上位机通信。总的来说,该系统有以下几点特点:
·工作人员可以远离生产环境通过计算机对其进行查看处理;
·多点温度测量;
·全天候检测温度,并可以在没有工作人员的参与下对生产环境进行简单处理;
·对生产环境的温度进行设计极限温度,一旦超过极限温度,系统将对起进行报警,并停止生产环境的工作;
·测量温度误差比较精确,在0.5℃内;
2.2 系统的功能
该系统主要有以下功能:
(1)对温度进行检测。利用该系统可以远离恶劣生产环境的情况下,对其进行温度测量;
(2)对现场温度进行实时采集;并在PC机上显示出来;
(3)在PC机上实时做出温度图像;工作人员在电脑上便可以直观的得到系统温度图像;
(4)简单的系统控制;通过计算机上的应用软件可以对温度设置,一旦超过极限温度,发出报警,进而通知工作人员快速的对生产现场进行各种相应操作,这样可以防止温度超出极限温度;
(5)在上位机端的应用软件上提供系统使用帮助。用户可以利用该功能帮助对系统进行操作。
2.3 系统开发平台
本次系统需要用到的开发工具为:keil C、 C++ builder、Protel、计算机、烧写器。
Keil C是目前世界上最好的MC-51单片机的汇编和C语言的开发工具。支持汇编、c语言以及混合编程。同时具备功能强大的软件仿真和硬件仿真。C++ builder 是计算机高级语言C++比较好用的编程工具,它是属于一种可视化的计算机语言。 Protel是世界上最好的硬件电路图制作的工具。
3 系统总体设计
3.1 系统整体方框图
根据前面的分析,知道系统要实现以上功能,必须由以下几部分组成:温度采集单元、下位机温度初步处理单元、USB设备接口、上位机应用程序。
系统的结构原理图如图3.1:
图3.1系统整体实现的结构原理图
温度传感器单元对生产温度环境进行测量,将测量温度传给下位机(单片机),单片机对采集到的温度进行初步处理后,将处理了的数据通过USB接口上传给PC机上位机,而上位机将实时的显示采集到的温度,如果要对现场环境进行处理,则上位机可以发送命令,经过USB接口传送到下位机,下位机根据接受到的数据并对其进行分析,进而做出处理,如报警等各种操作。
3.2 系统方案比较
对于本系统,方案的选择是根据温度传感器来选择。
目前市场上有两种传感器:模拟传感器和数字集成传感器,对于选择不同的传感器将会有不同的方案。下面给出两种不同的方案,并对其进行分析,最终选择其中一种方案。
3.2.1系统两种可行方案
方案1:选择模拟传感器
所谓模拟传感器,简单的说就是传感器对被测量的物质感应,并随着检测的不同做出不同的反应,但这一反应是有规律的,而且有规律的输出模拟信号。由于单片机是数字信号系统,只能识别数字信号,所以这种方案要想利用单片机对温度信号进行处理,必须将对模拟输出量数字化,也就是说要对其输出的模拟电压或电流转换成数字信号,这么一来就系统要加入模拟信号转换成数字信号的处理单元,通常,实现这一功能的是A/D转换器,市场对于这一A/D转换器有不少类型。所以选择这一方案也是可以有效而快速的设计出本系统。
图3.2给出使用模拟传感器这一方案的设计原理图。
图3.2 方案1的结构原理图
方案2:选择数字传感器
今天随着计算机的飞速发展以及单片机的日益普及,世界进入了数字时代,人们在处理被测信号时首先想到的是信息处理器(单片机或计算机)。具有输出数字信号便于电脑处理的传感器就是所谓的数字传感器。
数字传感器是近几年才出现的并得到广泛的应在在实践当中,所谓数字传感器,进一步的讲,就是将模拟传感器产生的信号经过放大、A/D转换、线性化及量纲处理后变成纯粹的数字信号,是在模拟传感器上加入数字处理单元,并将数字单元集成在一块芯片上,所以输出的是数字信号,便于数字处理机对其直接进行处理。
图3.3给出利用数字传感器设计的方案图:
图3.3 方案2的结构原理图
3.2.2方案最终选择
以上已经提出了两种方案,下面对这两重方案进行分析,并做最后方案选择:
分析近几年来传感器的发展,我们知道传感器在未来的发展中将会向以下的方向发展:(1)向高精度发展。随着自动化生产程度的不断提高,对传感器的要求也在不断提高,必须研制出具有灵敏度高、精确度高、响应速度快、互换性好的新型传感器以确保生产自动化的可靠性。目前能生产精度在万分之一以上的传感器的厂家为数很少,其产量也远远不能满足要求。(2)向高可靠性、宽温度范围发展。传感器的可靠性直接影响到电子设备的抗干扰等性能,研制高可靠性、宽温度范围的传感器将是永久性的方向。提高温度范围历来是大课题,大部分传感器其工作范围都在-20℃~70℃,在军用系统中要求工作温度在-40℃~85℃范围,而汽车锅炉等场合要求传感器工作在-20℃~120℃,在冶炼、焦化等方面对传感器的温度要求更高,因此发展新兴材料(如陶瓷)的传感器将很有前途。(3)向微型化发展。各种控制仪器设备的功能越来越大,要求各个部件体积能占位置越小越好,因而传感器本身体积也是越小越好,这就要求发展新的材料及加工技术,目前利用硅材料制作的传感器体积已经很小。如传统的加速度传感器是由重力块和弹簧等制成的,体积较大、稳定性差、寿命也短,而利用激光等各种微细加工技术制成的硅加速度传感器体积非常小、互换性可靠性都较好。(4)向微功耗及无源化发展。传感器一般都是非电量向电量的转化,工作时离不开电源,在野外现场或远离电网的地方,往往是用电池供电或用太阳能等供电,开发微功耗的传感器及无源传感器是必然的发展方向,这样既可以节省能源又可以提高系统寿命。目前,低功耗损的芯片发展很快,如TI2702运算放大器,静态功耗只有1.5mA,而工作电压只需2~5V。(5)向智能化数字化发展。传感器一般都是非电量向电量的转化,工作时离不开电源,在野外现场或远离电网的地方,往往是用电池供电或用太阳能等供电,开发微功耗的传感器及无源传感器是必然的发展方向,这样既可以节省能源又可以提高系统寿命。目前,低功耗损的芯片发展很快,如TI2702运算放大器,静态功耗只有1.5mA,而工作电压只需2~5V。
由于模拟传感器,没有把模拟转化为数字处理单元集成在一块芯片上,这样必带来传感检测单元的体积大等各个方面的影响,再者,模拟转化成数字单元也需要单片机对其进行处理,这样会浪费时间、资源。所以这样一来我们知道数字传感器在未来必将取代模拟传感器。而且随着数字传感器的发展,现在市场上数字传感也不是那么贵,本次系统对温度精度的要求不是很高,所以选择方案二。
4 系统硬件设计
4.1 中央处理器----AT89C51
AT89C51由美国Atmel 公司生产的,是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位单片机,该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。下文将对AT89C51单片机做简单介绍。
(1) AT89C51的特点
AT89C51具有以下几个特点:
①中央处理器CPU;
②AT89C51与MCS-51系列的单片机在指令系统和引脚上完全兼容;
③片内有4k字节在线可重复编程快擦写程序存储器;
④全静态工作,工作范围:0Hz~24MHz;
⑤三级程序存储器加密;
⑥128×8位内部RAM;
⑦32位双向输入输出线;
⑧两个十六位定时器/计数器
⑨五个中断源,两级中断优先级;
⑩一个全双工的异步串行口;
(2)AT89C51的结构图如图4.1
图4.1 89C51的结构图
由上图,知:AT89C51主要由CPU、存储器、I/O端口等几部分组成。
(3)AT89C51的功能描述
AT89C51是一种低损耗、高性能、CMOS八位微处理器,片内有4k字节的在线可重复编程、快速擦除快速写入程序的存储器,能重复写入/擦除1000次,数据保存时间为十年。它与MCA-51系列单片机在指令系统和引脚上完全兼容,不仅可完全代替MCS-51系列单片机,而且能使系统具有许多MCS-51系列产品没有的功能。
AT89C51可构成真正的单片机最小应用系统,缩小系统体积,增加系统的可靠性,降低系统的成本。只要程序长度小于4K,四个I/O口全部提供给用户。可用5V电压编程,而且擦写时间仅需10毫秒,仅为8751/87C51的擦除时间的百分之一,与8751/87C51的12V电压擦写相比,不易损坏器件,没有两种电源的要求,改写时不拔下芯片,适合许多嵌入式控制领域。工作电压范围宽(2.7V~6V),全静态工作,工作频率宽在0Hz~24MHz之间,比8751/87C51等51系列的6MHz~12MHz更具有灵活性,系统能快也能慢。
AT89C51芯片提供三级程序存储器加密,提供了方便灵活而可靠的硬加密手段,能完全保证程序或系统不被仿制。P0口是三态双向口,通称数据总线口,因为只有该口能直接用于对外部存储器的读/写操作。
(4)AT89C51引脚功能及说明
图4.2是AT89C51的引脚
①口线:P0、P1、P2、P3口。
P0口是三态双向口,通称数据总线口,为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。因为只有该口能直接用于对外部存储器的读/写操作。P0口也用以输出外部存储器的低8位地址。由于是分时输出,故应在外部加锁存器将此地址数据锁存,地址锁存信号用ALE。
P1口是专门供用户使用的I/O口,是准双向口。P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P2口是从系统扩展时作高8位地址线用。不扩展外部存储器时,P2口也可以作为用户I/O口线使用,P2口也是准双向口。
P3口是双功能口,该口的每一位均可独立地定义为第一I/O功能或第二功能。作为第一功能使用时操作同P1口。P3口的第二功能如表4.1所示。
②控制口线:PSEN(片外选取控制)、ALE(地址锁存控制)、EA(片外存储器选择)、RESET(复位控制);
③电源及时钟:VCC、VSS、XTAL1、XTAL2 操作方法。
表4.1 P3口的第二功能
④操作方法
程序存储器加密。AT89C51芯片程序存储器有三级硬件加密,能够有效地保证系统不被仿制和软件不被复制,加密等级设置见附录2。
工作模式。AT89C51有间歇和掉电两种工作模式。间歇模式是由软件来设置的,当外围器件仍然处于工作状态时,CPU可根据工作情况适时地进入睡眠状态,内部RAM和所有特殊的寄存器值将保持不变。这种状态可被任何一个中断所终止或通过硬件复位。
掉电模式是VCC电压低于电源下限,振荡器停止振动,CPU停止执行指令。该芯片内RAM和特殊功能寄存器值保持不变,直到掉电模式被终止。只有VCC电压恢复到正常工作范围而且在振荡器稳定振荡后,通过硬件复位掉电模式可被终止。
4.2 温度传感器DS18B20
温度传感器是该系统的测量器件,温度传感器的好坏直接影响到测量结果,所以本文将对温度传感器的选择详细介绍。根据本次设计论文的要求,包括精度要求等,经过分析,本文决定选择数字温度传感器DSB8B20。下面将给予介绍。
(1) DS18B20的概述
DS18B20是DALLAS公司生产的一线式数字温度传感器,具有3引脚TO-92小体积封装形式;温度测量范围为-55℃~+125℃,可编程为9位~12位A/D转换精度,测温分辨率可达0.0625℃,被测环境的温度用符号扩展的16位数字量方式串行输出;其工作电源既可在远端引入,也可采用寄生电源方式产生;多个DS18B20可以并联到3根或2根线上,CPU只需一根端口线就能与诸多DS18B20通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。以上特点使DS18B20非常适用于远距离多点温度检测系统。
(2)DS18B20的内部结构
图4.3是DS18B20的内部结构图
图4.3 DS18B20的内部结构
由图可知,DS18B20主要由4部分组成:64位ROM、温度传感器、非挥发的温
警触发器TH和TL、配置寄存器。DS18B20的管脚排列如图4.4所示,
图4.4 DS18B20的管脚排列
DS18B20的3个管脚说明如下:
DQ为数字信号输入/输出端。是漏极开路一线接口。也在寄生电源接线方式时,给设备提供电源。
GND为电源地。
VDD为外接供电电源输入端(在寄生电源接线方式时接地)。
DS18B20的64位ROM保存了设备的唯一序列码,是DS18B20的地址序列码,每一个DS18B20的地址序列码是不同的,这样就可以实现一根总线上挂接多个DS18B20。高速闪存(scratchpad)包括2个字节的温度寄存器。保存了温度传感器的数字输出。该闪存还提供了对上限(TH)和下限(TL)的超标报警寄存器、配置寄存器(一个字节)的访问。TH、TL和配置寄存器是EEPROM,所以系统掉电时可以保存数据。
DS18B20利用DALLAS的单总线控制协议,实现了利用单线控制信号在总线上进行通信。由于所有的设备通过漏极开路端(DQ脚)连在总线上,控制线需要一个大约5K上拉电阻。在这一总线控制系统中,微控制器通过唯一的64位地址序列码识别和访问总线上的器件。由于地址序列码不同,所以连接在总线上的DS18B20可以说是无限的 。
(3)DS18B20的寄存器
DS18B20存储器组织结构如表4.2所示:
字节0和字节1分别包含温度寄存器的LSB和MSB,这些字节是只读的,字节2和字节3提供对TH(上限报警触发寄存器)和TL(下限报警触发寄存器)的访问,字节4包配置寄存数据,字节5、6和7保留做器件内部使用,不能被改写,当读时,这些字节返回全1值,字节8是只读的,含有字节0到字节的CRC校验。
高速闪存的第四个字节包含配置寄存器,其组织结构如下表4.3所示:
(4)DS18B20的读写时序
访问DS18B20的顺序如下:
----初始化;
----ROM命令(接着是任何需要的数据交换);
----DS18B20的函数命令(接着是任何需要的数据交换);
每一次访问DS18B20时必须要按照这一顺序,如果其中的任何一个步骤缺少或打乱,DS18B20将不会响应。
①初始化时序
初始化时序如图4.5:
图4.5 DS18B20初始化时序
所有与DS18B20的通信都要首先初始化,从而才能进行下一部的工作:控制器发出复位脉冲,DS18B20以存在脉冲响应。图4.5给出了描述。当DS18B20发出存在脉冲对复位响应时,它指示控制器该DS18B20已经在总线上并准备好操作。
②读/写时序
控制器在写时序到数据到DS18B20,在读时序从DS18B20中读数据,每一个总线时序传送一个数据位。
读/写时序见下图4.6
③写时序
有两种类型的写时序:写1时序和写0时序。控制器用写“1”时序写逻辑“1” 到DS18B20,用写“0”时序写逻辑“0”到DS18B20。所有写时序必须持续60μs,每一个写时序之间必须要至少有1μs的恢复时间。两种类型的写时序都从控制器把总线拉低开始。
为产生写“1”的时序,在将总线拉低之后,总线控制器必须在15μs内释放总线。总线释放后,5K的上拉电阻将总线电平抬高。为产生写“0”时序,在总线拉低后,控制器在整个时序内必须持续控制总线为低电平(至少60μs)。
DS18B20在控制器发出写时序后的15-60μs的时间内采样总线。如果在采样窗口期间总线为高,“1”就被写到DS18B20;如果在采样窗口期间为低电平,则“0”就被写入DS18B20。
④读时序
当总线发出读时序时,DS18B20可以发送数据到控制器。所有读时序必须持续最少60μs,每一个读时序之间必须有至少1μs的恢复时间。读时序从控制设备将总线拉低至少1μs后释放总线开始。控制器启动读时序后,DS18B20开始在总线上传送“1”或者“ 0”。DS18B20通过保持总线为高发送“1”,将总线拉低发送“0”。发送“0”时,DS18B20在60μs时释放总线;发送“1” 时,总线被上拉电阻高电平空闲状态。从DS18B20输出的数据在启动时序的下降沿后15μs有效。因此,控制器必须在时序开始的15μs内释放总线,然后采样总线状态。
通过读/写时序,控制器可以发出控制命令,对DS18B20进行读写操作。
(5)DS18B20的常用命令
①SKIP ROM [CCH]
控制器可以用这一命令同时访问总线上的所有设备而不需要发送ROM序列码信息。控制器可以使总线上的所有DS18B20同时进行温度转换。
②SEARCH ROM [F0]
当系统开始上电时,控制器必须识别总线上所有从机的ROM序列码,以确定从机的数目和它们的类型。控制器需要执行 search ROM循环足够多次才能识别所有的从设备。如果只有一个从属设备在总线上,可使用简单的Read ROM命令期待Search ROM。每一个Search ROM命令之后必须返回到事务序列的步骤(初始化)。
③READ ROM[33]
这一命令只有在总线上只有一个设备的时候使用,它使得控制器可以不用Search ROM命令就可以读出从机的64位ROM序列码。当多于一个从机设备在总线上时,如果还使用该命令,由于所有的设备企图响应该设备,这样将产生数据冲突。
④CONVRTT [44]
这一命令开始一次温度转换。变换之后,数据保存在暂存器的2个字节温度寄存器中,DS18B20回到低功耗空闲状态。如果设备工作在寄存电压模式,则这一命令发送后10μs之内,整个变换期间控制器必须在总线上能够有较强的上拉。如果DS18B20由外部电源供电,那么Convert T命令后控制器可以发出读时序。如果温度变换正在进行,那么返回“0”;如果已经完毕,则返回“1”。
⑤WRITE SCTATCHPAD [4EH]
这一命令使得控制器可以写3个字节数据到DS18B20的寄存器中。第一字节数据
到TH寄存器中,第二字节写到TL中,第3字节写到配置寄存器中。数据以最低有效位先发送。所有3字节必须在控制器发出复位或者数据丢失之前写完。
⑥READ SCRTCHPAD[BEH]
这一命令使得控制器可以读寄存器的内容。数据传送开始于字节0的最低位,直到寄存器的第9字节被读出,任何时候,如果只需部分寄存器数据,控制器可以结束读操作。
上面已经介绍了数字温度传感器的原理,下面将利用DS18B20设计温度采集模块电路。
4.3 温度采集模块电路设计
以上已经介绍了AT89C51和数字温度传感器DS18B20基本知识,下面将利用它们来设计本系统的温度采集电路。DS18B20连接到单片机的方法很简单,它有两种方法连接到电路上,既外接电源方式和寄生电源方式,这里使用的是系统提供的外接电源方式,而不采用寄生电源,只要VCC、DQ、GND连接到单片机的电源正极、一个I/O端口、电源地就可以了。但是要注意的是在DQ数据线中要加一个4.7K的上拉电阻,这一个是必须要加的,无论它是接在P1口还是P0口,这点特别注意,特别提醒。之外在电源两端之间加个0.01U的电容,这样的作用主要是滤波。
图4.7 单片机和DS18B20接口图
由图4.7,知DS18B20工作在外部电源供电方式。单片机采用采用P1.1口与DS18B20通信。下面根据单片机的初始化时序和读写时序,写出DS18B20和单片机之间的读写操作,这里只给了温度的读取,下位机部分程序在附录中给出。
这里特别提醒的是DS18B20对时序要求很高,精度要求很高,所以程序的延时对是否能读起数据起到非常关键的作用。
DS18B20读写数据程序如下:
void delaym(int time) //延时为(time*2+2)us { int s; for(s=0;s<time; s++)<="" span=""> } void write_bite(unit8 bite) //写一位数据位 { DQ=0; if(bite==1) DQ=1; //如果写"1",DQ=1; delaym(29);//延时60us提供DS18B20采样 DQ=1; //释放DQ } unit8 read_bite(void) //读一位数据位 { DQ=0; //将总线DQ拉低开始读时序 delaym(0); //延时2us DQ=1; //释放DQ; delaym(1); //延时4us后再读数据 return(DQ); } void write_byte(unit8 dat) //写一字节数据 { unit8 i; unit8 temp; for(i=0;i<8;i++) { temp=dat>>1; //右移一位 temp&=0x01; write_bite(temp); } } unit8 read_byte(void) { unit8 i,value=0; for(i=0;i<8;i++) { if(read_bite()) value|=0x01<<i; 读一字节数据,一个读时序读一位,并做移位<="" span=""> delaym(29) ; //延时60us有以完成读一位,之后再读下一位 } return(value); } unit8 DS18B20_RESET(void) { unit8 data; DQ=0; delaym(239); //保持DQ低480us DQ=1; delaym(35); da=DQ; delaym(211); return (data);//有芯片应答data=0,无则data=1 }
4.4 系统接口模块电路设计
本系统的采集模块采集到数据后,必须要经过CH372传到上位机应用软件才能实现控制下位机的各种操作。而CH372是USB接口芯片,下位机和上位机通信的要通过CH372接口芯片来完成,其和计算机的连接很简单,所以这一部分主要的硬件实现是CH372和单片机AT89C51的连接问题。
4.4.1 USB简介
USB(Universal Serial Bus)是外围设备与计算机进行连接的新型接口,既一种新型的通用串型总线接口,USB具有即插即用、热插拨、接口体积小、节省系统资源、传输可靠、提供电源、良好的兼容性、共享试通信等优点。
在USB产生之前,外部设备和计算机的通信主要是通过计算机主板所提供的各种接口,比如ISA接口、PCI接口、PS/2接口、串行接口,并行接口等,这些接口,存在这样那样的缺陷,比如接口规格不统一、不共享等为了克服上述外围设备的缺陷,P制造商和用户迫切需要一种新型的外设接口,USB正是在这样的环境下产生的,它是一种快速、双向、同步、廉价、并支持热插拨功能的串行接口。
USB是一种新型的接口,那么它必定有它的通信标准,也就是我们所说的协议,下面简单介绍USB的通信协议。
一般的,对终端用户来看,USB系统是USB设备连接到主机的简单连接,但对开放人员来说,这中连接可分为三个层次:功能层、USB设备层、USB总线接口层,且每一层都由主机和USB设备的不同功能模块组成。可以用下面的图型来形容。下图4.8是这种分层通信机制的简化。
图4.8 USB通信层次模型
由图,一个USB设备由三个功能模块组成:USB总线接口、USB逻辑设备、功能单元。USB总线接口是USB设备中的串行引擎(SIE);USB逻辑单元被看作是一个端点的集合;功能单元客户软件被看作接口的集合。
USB传输类型包括批量传输、同步传输、中断传输和控制传输,每种传输类型的传输速度、可靠性以及应用范围都不同。控制传输可靠性是最高的,但速度最慢;同步传输速度快,满足实时性,但可靠性低。在具体应用中,端点传输类型可根据传输速度和可靠性选择。
在USB通信协议中,主机取得绝对主动权利,设备只能是“听命令行事”,通过一定的命令格式(设备请求)完成通信。USB设备请求包括标准请求、厂商请求和设备类请求。设备的枚举是标准请求命令完成的;厂商请求是用户定义的请求;设备类请求是特定的USB设备类发出的请求,例如海量储存类、打印机类和HID(人机接口)类。固件编程中设备请求必须遵循一定的格式,包括请求类型、设备请求、值、索引和长度。
4.4.2 USB芯片选择
USB的传输速度可分为低速(1.5Mbps)、全速(12Mbps)和高速(480Mb/s),按传输速度来分,供选择的USB芯片类型主要有:低速(1.5Mbps)和全速(12Mbps),可选择Philips公司的PDIUSBD12和Cypress公司的EZ-USB2100系列以及国产的CH372芯片; 高速(480Mbps)可选Philips公司的ISP1581和Cypress公司的USB接口芯片CY7C68013。
本次系统要传输的速率比较少,可以所以选择全速的USB接口芯片,由于国产的芯片已经有所好转,再加上资料比较齐全,这次系统设计所选择的USB接口芯片是国产芯片CH372。
芯片介绍:
CH372是南京沁恒电子有限公司生产的新型USB接口芯片,具有8位数据总线和读、写、片选控制线以及中断输出,可以方便地挂接到单片机/DSP/MCU/MPU等控制器的系统总线上;它屏蔽了USB通信协议,用户如果没有涉及到底层开放,那么只要了解芯片的普通用法就可以快速的设计USB设备。利用CH372进行USB设备的通信设计可以如下的方框图4.9
图4.9 CH372和单片机框架连接
下面给出CH372的引脚图(图4.10)及部分命令:
图4.10 CH372的管脚
CH372芯片占用两个地址位,当A0 引脚为高电平时选择命令端口,可以写入命令;当A0引脚为低电平时选择数据端口,可以读写数据。单片机通过8 位并行口对CH372 芯片进行读写,所有操作都是由一个命令码、若干个输入数据和若干个输出数据组成,部分命令不需要输入数据,部分命令没有输出数据。命令操作步骤如下:
①在A0=1 时向命令端口写入命令代码;
②如果该命令具有输入数据,则在A0=0 时依次写入输入数据,每次一个字节;
③如果该命令具有输出数据,则在A0=0 时依次读取输出数据,每次一个字节;
④命令完成,可以暂停或者转到①继续执行下一个命令。
CH372的命令如表4.5:
表 4.5 CH372命令
代码 |
命令名称 |
输入数据 |
输出数据 |
命令用途 |
05H |
RESET_ALL |
(等40mS) |
执行硬件复位 |
|
06H |
CHECK_EXIST |
任意数据 |
按位取反 |
测试工作状态 |
12H |
SET_USB_ID |
VID 字节 PID 字节 |
设置USB的厂商VID和PID |
|
15H |
SET_USB_MODE |
模式代码 |
(等20uS) 操作状态 |
设置USB工作模式 |
22H |
GET_STATUS |
中断状态 |
获取中断状态并取消请求 |
|
28H |
RD_USB_DATA |
从当前USB中断的端点缓冲区读取数据块并释放当前缓冲区 |
||
2AH |
WR_USB_DATA5 |
向USB端点1的上传缓冲区写入数据块 |
||
2BH |
WR_USB_DATA7 |
向USB端点2的上传缓冲区写入数据块 |
4.4.3 USB设备端的接口设计
CH372芯片在本地端提供了通用的被动并行接口,包括:8位双向数据总线D7~D0、读选通输入引脚RD#、写选通输入引脚WR#、片选输入引脚CS#、中断输出引脚INT#以及地址输入引脚A0。通过被动并行接口,CH372 芯片可以很方便地挂接到各种8位单片机、DSP、MCU 的系统总线上,并且可以与多个外围器件共存。CH372芯片的RD#和WR#可以分别连接到单片机的读选通输出引脚和写选通输出引脚。CS#由地址译码电路驱动,用于当单片机具有多个外围器件时进行设备选择。INT#输出的中断请求是低电平有效,可以连接到单片机的中断输入引脚或者普通I/O 引脚,单片机可以使用中断方式或者查询方式获知中断请求。当WR#为高电平并且CS#和RD#及A0 都为低电平时,CH372 中的数据通过D7~D0输出;当RD#为高电平并且CS#和WR#及A0 都为低电平时,D7~D0上的数据被写入CH372 芯片中;当RD#为高电平并且CS#和WR#都为低电平而A1 为高电平时,D7~D0 上的数据被作为命令码写入CH372芯片中。CH372 芯片的VD+和VD-引脚应该直接连接到USB 总线上。如果为了芯片安全而串接保险电阻或者电感,那么交直流等效串联电阻应该在5Ω之内。
USB定义了四种传输类型:控制传输、快传输、中断传输和同步传输。南京沁恒公司的USB接口芯片CH372支持控制传输、批量传输、中断传输。CH372主要有两种数据流传输方式:单向数据流方式和请求应答方式。其中请求应答方式步骤如下:
① 计算机应用层按事先约定的格式将数据请求发送给CH372芯片;
② CH372 芯片以中断方式通知单片机;
③ 单片机进入中断服务程序,获取CH372的中断状态并分析;
④ 如果是上传,则释放当前USB 缓冲区,然后退出中断程序;
⑤ 如果是下传,则从数据下传缓冲区中读取数据块;
⑥ 分析接收到的数据块,准备应答数据,也可以先退出中断程序再处理;
⑦ 单片机将应答数据写入批量端点的上传缓冲区中,然后退出中断程序;
⑧ CH372 芯片将应答数据返回给计算机;
⑨ 计算机应用层接收到应答数据。
这种传输方式是必需要有计算机断发出响应才可以进行的。在本次系统设计中,可以通过向计算机发出命令,下位机根据命令来进行各种操作,包括设计报警温度,采集温度等。
由于系统不需要那么多I/O口,所以本次系统设计的单片机端不需要扩展,直接用端片机的I/O端口,值得注意的是MCU不扩展,那么P0只能口只能作为I/O口使用,而不能作为数据/地址端口复用。这一点必须注意,而P0口做普通I/O使用必需要加上拉电阻1K到10K左右。否则系统将无法运行,这点特别提醒要注意的地方。
最终CH372与单片机AT89C51之间的连接图,如下图4.11
4.11 CH372和89C51的连接图
图中P2作为CH372芯片8位双向数据总线通信端口来使用。P1和P0端口作为普通的I/O口,USB 总线包括一对5V 电源线和一对(D+、D-)数据信号线。通常,+5V 电源线是红色,接地线是黑色,D+信号线是绿色,D-信号线是白色。USB 总线提供的电源电流最大可以达到500mA,一般情况下,低功耗的USB 产品可以直接使用USB 总线提供的5V 电源。如果USB 产品通过其它供电方式提供常备电源,那么CH372 应该与单片机一起使用该常备电源并且断开USB总线的电源;如果需要同时使用USB 总线的电源,那么可以通过阻值约为1Ω的电阻R1 连接USB 总线的5V 电源线与USB 产品的5V 常备电源,并且两者的接地线直接相连接。
CH372 的CS#固定为低电平,一直处于片选状态,在单片机程序中,可以控制各个I/O引脚模拟并口时序与CH372 进行数据交换。比如控制P05、P06、P07来读、写命令。
图4.11中,可选电阻R2 用于在电源断电后将电解电容C5 中的电能及时释放掉,使VCC 及时下降到0V,确保在下次通电时CH372 能够可靠地上电复位。电容C3 用于CH372 内部电源节点退耦,C3 是容量为0.01μF 的独石或高频瓷片电容,如果对EMI 没有要求那么可以省掉C3。电容C4和C5用于外部电源退耦,C4 是容量为0.1μF的独石或高频瓷片电容。晶体X1、电容C1 和C2 用于CH372的时钟振荡电路。X1的频率是12MHz,C1和C2是容量为15pF-30pF 的独石或高频瓷片电容。
本次系统设计的USB接口硬件设计已经完成。而且应用部分的硬件设计也已经完成,下节将给出整体硬件设计的电路图。
4.5 系统硬件整体实现
下位机的应用部分是DS18B20,DS18B20采集到温度信号,并转换成数字信号然后输出到单片机AT89C51,单片机对数字信号进行处理,然后将处理的数据通过USB接口芯片传到上位机的USB设备驱动程序,上位机的主USB控制驱动程序接受来自USB设备驱动程序的数据,在计算机端的应用软件进行各种操作。反之,计算机的控制命令通过USB总线接口,把控制命令通过USB芯片传到单片机,由于本系统已经对计算机程序的命令编码过,所以单片机接受来自上位机命令,对其进行判断,从而做出不同的响应。
硬件电路整体实现电路图在附件中给出。
5 系统软件设计
本系统进行软件设计包括下位机软件设计和上位机软件设计,下位机软件设计可以使用汇编语言和单片机C语言,上位机设计可以采用的很多计算机高级语言,比如VC++、Delphi、C++ builder等,在这里选择C++ builder来编写上位机程序。至于下位机程序,主要有汇编语言、PL/M语言和C语言。汇编语言有执行效率高、速度快、与硬件结合紧密等特点,尤其在I/O端口管理时,使用汇编语言有快捷、直观的优点。但是使用汇编语言相对于高级语言,比如单片机C语言来讲,难度要大很多,而且汇编语言的呈现可读性低、开放性差。所以下位机的程序设计选择单片机C语言。下面简单介绍本次软件设计的编程工具。
5.1 软件设计开发工具
Keil C51是单片机的编写软件,是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。用过汇编语言后再使用C来开发,体会更加深刻。Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。
C++ builder是Inprise公司1998 年推出的,面向对象的32位Windows程序设计开放工具,C++ builder不仅继承了Delphi使用简便、功能强大、效率高等特点,而且它还结合了C++语言的所有优点。 C++ builder可以说是至今为止功能最强、最简单易学的Windows开发工具之一。C++ builder 6具有非常友好的集成开发环境,提供一百多个VCL组件,使开发人员不需要太多的时间编码,就能实现很多复杂的功能。它的编译器 能够自动列出VCL组件的属性和方法供程序员选择,而不必手工输入复杂的代码。正式因为这些优点,所以本次系统设计选择 C++ builder作为上位机软件设计的开发工具。
5.2 系统软件设计
系统要对温度进行采集,首先必须利用上位机对下位机(单片机)发出命令,单片机根据接收到的命令,根据预先的规则对不同的命令做出不同的处理。然后把处理结果发回上位机,上位机接收到温度数据后,根据温度数据画出数据采集图像。这就是系统要实现功能,根据这一要求,设计出系统的软件。
系统整体模块流程图如图5.1
图5.1 系统整体模块图
下面分别设计下位机和上位机的程序流程图。
5.2.1下位机的软件设计
单片机端的应用程序主要实现的功能就是对DS18B20进行采集温度,把采集到的温度通过USB接口芯片上传到计算机端的应用程序。
下位机的程序设计流程图5.2
下位机的程序流程图中包括单片机和DS18B20和单片机的通信流程图,以及单片机和USB设备接口芯片的通信流程图。
其中DS18B20和单片机的通信流程图如下图5.3
这里是单片机如何根据DS18B20的特性来控制它,进行温度转换,并读取温度。把温度数据保存在单片机端。
图5.3 DS18B20的程序流程图
单片机先初始化DS18B20温度传感器,对其复位,然后按DS18B20的时序来读写命令,DS18B20根据命令进行操作,单片机和DS18B20的通信过程主要为:单片机对DS18B20复位,跳过读写系列号操作(送0xCC命令到DS18B20),启动温度转换,再次复位,送读温度命令0xBE,读出温度。这就是单片机和DS18B20的通信过程,将得到的温度单片机在进行处理,把温度数据传到上位机。上位机实时显示温度值。为了便于说明DS18B20和单片机间的通信过程,下面给出读出DS18B20温度的程序:
unsigned int readtemperature(void) //读温度 { unit8 a=0,b=0; unit8 c,d; unsigned int t=0; float tt=0; c=DS18B20_RESET(); write_byte(0xCC); // 跳过读序号列号的操作 write_byte(0x44); // 启动温度转换 d=DS18B20_RESET(); write_byte(0xCC); //跳过读序号列号的操作 write_byte(0xBE); //读取温度寄存器等前两个就是温度 a=read_byte(); b=read_byte(); t=b; t<<=8; t=t|a; return(t); }