微型机与应用
WEIXINGJI YU YINGYONG
2000　Vol.19　No.5　P.26-27




串行DAC与WIN95环境的通信
师恩培
摘 要：串行输入DAC的特性及WIN95环境下的通信资源，给出了串行DAC与WIN95环境通信的实现方案。
关键词：串行DAC WIN95环境 通信
　　近年来，串行DAC（数模转换器）和ADC（模数转换器）越来越多地用于计算机测控系统的控制和数据采集中。本文介绍利用WIN95下的通信函数和PC机并行口（打印机口）的连接，通过VC编程，实现串行DAC与WIN95环境通信的方法。此方法在WIN95下可以方便地控制实现数模转换，完成测控系统后向控制通道的接口，并且也同样适用于串行ADC与WIN95环境的通信。
1 串行DAC
　　本文以MAX538／MAX539串行DAC为例进行讨论。MAX539是单电源、低功耗、电压输出、12位串行DAC，具有8引脚DIP／SO封装。可应用于电池供电的测试仪器、数位偏移和增益调节器、成组操作或远程工业控制、计算机和移动控制装置、便携式电话等领域引脚如图1所示，引脚功能如表1所示。
表1 引脚功能
引脚名功能
DIN
SCLK

DOUT
AGND
REFIN
VOUT
Vno串行数据输入
串行时钟输入
片选信号
串行数据输出(级连)
模拟信号地
参考电压输入
DAC输出
电源


图1 引脚图
　　MAX538／MAX539的最大串行时钟频率约为14MHz，数字更新频率为877kHz。12位串行DAC由写入2个8位字编程，16位串行数据位被时钟依次输入DAC的高位到低位。最高位是由4位填充位（伪数据）打头。当为低时，数据在SCLK的上升沿被输入1个16位移位寄存器。在的上升沿，最低12位有效数据被送入DAC寄存器，并更新DAC的输出数据。
2 WIN95环境下的通信资源
　　WIN95的应用程序常需要具备同外围设备进行通信的能力。例如，打印机、调制解调器（MODEM）等通过并行口或串行口与计算机相连接的设备，均要通过WIN95所提供的通信接口函数与应用程序进行通信。
　　在WIN95下可利用串行应用程序接口SAPI，通过串行口（RS－232口）与其它通信设备进行交互式串行通信。但该方法由计算机送出的数据是标准的异步串行格式，即含有起始位、终止位等，且按照先低位后高位的模式发送。而MAX538／MAX539则需要接收16位串行数据，低12位为有效位，且按照先高位后低位的模式接收。因此，该串行DAC不能直接接收串行口提供（经EIA到TTL电平转换）的串行数据。
　　利用VC＋＋提供的＿outp（）函数可在WINDOWS环境下直接通过并行口输出数据，格式为： 
　　＿outp（PortAddre，Data）
　　其中ProtAddre为并行口的地址，PC机中固定为OX378；Data为并口输出的数据，其格式如图2所示。

图2 并行口数据
　　利用并行口和软件控制，按照一定的位时序输出，即可以直接产生串行DAC所需的串行数据信号和相应的时钟信号及片选信号。并行口产生DAC所需信号的原理及位时序如图3所示。

图3 并行口产生DAC各信号及其时序关系
　　其中TOUTP为＿outp函数输出周期，TBIT为串行位输出周期。由图3可见，使用3次＿outp函数可输出1位串行数据。而TOUTP1期间并口输出的数据为OX4（D7～D0为00000100B），TOUTP2输出OX1（00000001B），TOUTP3输出OX3（00000011B）等。
3 串行DAC与WIN95下的通信接口
　　利用PC机并行口和＿outp函数，通过程序控制，可以方便地实现WIN95环境与串行DAC的通信接口。具体硬件电路如图4所示。

图4 硬件连接
　　由于WIN95下并行口输出的位周期小于MAX538／MAX539的最小位周期，即发送波特率大于接收波特率，使产生的SCLK信号为一窄尖脉冲。为了能够可靠传送数据，在程序中采用了输出延迟的方法，使SCLK信号恢复正常。以下给出用VC编写的通信程序中用于产生各种波形的具体函数。
　　void output（unsigned int i） ／／输出16位串行数据
　　｛ int k；
　　　　＿outp（OX378，4）；
　　　　delay（）；
　　　　for（k＝0；k＜16；k＋＋，i＊＝2）
　　　　　｛　if（i ＆OX8000）
　　　　　　　　｛ ＿outp（OX378，1）；
　　　　　　　　　delay（）；
　　　　　　　　 ＿outp（OX378，3）；
　　　　　　　　　delay（）； 
　　　　　　　　　＿outp（OX378，1）；
　　　　　　　　　delay（）；
　　　　　　　　　｝
　　　　　　　　else
　　　　　　　　　｛＿outp）OX378，0）；
　　　　　　　　　　delay（）；
　　　　　　　　　　＿outp（OX378，2）；
　　　　　　　　　　delay（）；
　　　　　　　　　　＿outp（OX378，0）；
　　　　　　　　　　delay（）；
　　　　　　　　　　｝
　　　　　　　　｝
｝
　　void CmainFrame：：OnSend（）／／发送三角波
　　｛int a［　］＝｛4，5，6，7，8，9，10，9，8，7，6，5｝；
　　　for（int k＝0；k＜MAX1；k＋＋）
　　　｛for（int j＝0；j＜12；j＋＋）
　　　output（a［j］＊128）；
　　　　　｝
　　　｝
　　void CmainFrame：：OnSquar（）／／发送方波
　　｛int aa［］＝｛OXFFF，OXFFF，OXFFF，0，0，0｝；
　　　for（int k＝0；k＜MAX2；k＋＋）
　　｛for（int j＝0；j＜6；j＋＋）
　　　output（aa［j］）；
　　　　　｝
　　　｝
　　void CmainFrame：：OnSin（）／／发送正弦波
　　｛for（int k＝0；k＜MAX3；k＋＋）
　　　｛for（doubleX＝0；
　　　X＜2＊3．14159；X＋＝3．14159／18）
　　　　output（sin（X）＊128＋128）；
　　　　｝
　　｝
　　其中MAX1、MAX2、MAX3分别是要产生的3种波形的周期个数，delay（）为延时函数。
4 结束语
　　利用PC机并行口及VC＋＋提供的＿outp（）函数可以实现串行DAC与WIN95环境的通信。此外，利用并行口及VC＋＋提供的＿inp（）函数也可实现串行ADC与WIN95环境的通信。上述方法在串行速率不高的场合下，不失为一种简便有效的应用方式。但在高速应用时，则须考虑PC系统的中断时间对串行传送的影响。
师恩培（山东大学威海分校计算机系264200）
参考文献
［1］黄海容．在Windows95下实现PC机与单片机AT8951的 串行通信．微型机与应用，1999；(4)
［2］王金玉．在Win32环境下实现32位串行通信．中国计算 机用户，1997；(5)
收稿日期：1999－12－28
