![]() |
|
||||||||||||||
| | 网站首页 | 数据库教程 | web编程 | 服务器 | 程序设计 | | ||
|
||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 用VC实现PC并行端口数字信息的输入/输出 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
作者:佚名 文章来源:不详 点击数: 更新时间:2007-8-26 ![]() |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
目前,在实验室和工业应用的各种控制系统中,串口是常用的计算机与外部控制系统之间的数据传输通道。
本文介绍PC并行端口在单片机等控制系统中作为数字I/O口的应用。在控制系统中,有许多的数字开关量、数字控制信号、数字信号等,都可以通过计算机并行端口进行采集;并将采集的数字信号经计算机处理后形成数字控制信号,再从计算机的并行端口输出进行各种自动控制。 一、PC并行端口介绍 目前,计算机中的并行接口主要作为打印机端口,接口使用的不再是36针接头而是25针D形接头。所谓“并行”,是指8位数据同时通过并行线进行传送,这样数据传送速度大大提高。 现在常见的并口有五种:SPP型、PS/2型、EPP型、ECP型和多模式接口,大多数PC机配有SPP并口: SPP标准并行口有4位、8位、半8位:4位口一次只能输入4位数据,但可以输出8位数据;8位口可以一次输入和输出8位数据;半8位也可以。 PS/2简单双向并行口:它引入双向数据端口,这种双向数据端口容许外设每次向PC机发送8位信息。PS/2型并口是指所有具有双向数据端口,但不支持后面介绍的EPP或ECP模式的并行接口。 三、PC并行口数字输入/输出 (1):将WinIo.dll、WinIo.sys、WINIO.VXD三个文件放在程序可执行文件所在目录下; bool _stdcall InitializeWinIo();void _stdcall ShutdownWinIo(); (2):安装与卸载 bool _stdcall InstallWinIoDriver(PSTR pszWinIoDriverPath, bool IsDemandLoaded = false);bool _stdcall RemoveWinIoDriver(); (3):读写I/O口 bool _stdcall GetPortVal(WORD wPortAddr, PDWORD pdwPortVal, BYTE bSize);bool _stdcall SetPortVal(WORD wPortAddr, DWORD dwPortVal, BYTE bSize); GetPortVal函数从指定端口读取一个BYTE/WORD/DWORD类型的值;
如果我们把这8支脚当成一般的数字输出的脚位看待,上述8支脚就相当于是8个数字输出的位置一般,我们就可以把它们当成是8个可以自由控制的输出点。当我们通过数据端口传送数据时,就是改变这8支脚的电平状态;而接受方也按照相同的编码原则解释,就可以获得传送的数据。 状态寄存器 状态端口或称状态寄存器保存的是5个输入(S3~S7)的逻辑状态。S0~S2位不出现在并口连接器中。除了S0以外,状态寄存器是只读的,读出数据信息是状态端口引脚上的逻辑状态。S0是支持EPP传输并口的超时标志信息,可以用软件方法清零。在许多并口中,状态输入接有上拉电阻。状态端口引脚是Pin10~Pin13、Pin15,其定义如下:
上表中所谓的(基地址+1)指的是:如果我们的LPT地址是378H,在加上1就是379H;这个地址是专门用来传递打印机的状态的。和数据地址比较起来不一样的是,这里地址并非在连接器的脚位上均有对应点。在这个状态的显示上只有5个脚位有对应,位S0~S2是没有的--最起码是无法让计算机有对应的值可读取。 如果打印机接到并口上,那么打印机的状态将会通过这几支脚传送到PC,程序只要去基地址+1的位置读取数值即可知道现在打印机所处的状态。由于这几支脚可以让打印机传送状态给PC,那么我们可以把这几支脚位拿来当作数字输入的通道;我们可以让这几支脚位的状态发生电位的改变,而利用程序去读取这些脚位的数值,即可实现数据的输入。 控制寄存器 控制端口或称控制寄存器保存了C0~C3的4位的控制信息。C4~C7不出现在并口连接器中。一般来说,这些位被用来输出,然而大多数SPP中,控制位为集电极开路/漏极开路模式,也就是说,它们同样可以用作输入。要从控制位上读取外部逻辑信号,首先将向相应的输出写入“1”,然后读取控制寄存器的值即可。但是,为了提高交换速度,大多数支持EPP和ECP接口中,控制位工作在不能用作输入的推拉模式下。在一些多模式接口中,控制位采用的是改进型的推拉模式,可以用作输入。控制端口引脚是Pin1、Pin14、Pin16和Pin17,其定义如下:
为了测试并行口的数字输出,可以准备12支LED发光二极管,将LED的阳极分别与数据端口引脚Pin2~Pin9和控制端口引脚Pin1、Pin14、Pin16、Pin17相连接;将LED的阴极连接在一起与并行口的归地引脚GND相连即可。在实际控制应用中不能这样连接,因为数据端口引脚、控制端口引脚输出的电流非常小,只有10mA左右,必须添加 其它硬件电路。 (1):数据端口数字输出的VC实现
//获得数据端口地址WORD m_nport=(WORD)0x378;//获得要写入数据端口的值WriteValue(数据范围为0~255)DWORD m_nValue=(DWORD)WriteValue;//调用WinIo库函数SetPortVal写端口值SetPortVal(m_nport, m_nValue, 1);//write a BYTE value to an I/O port (2):控制端口数字输出的VC实现 //获得控制端口地址WORD m_nport=(WORD)0x37A; //获得控制端口的值,保持高位值不变,将要输出的值从低4位输出,且使连接器上的电位状态与想输出的值一致DWORD temp_dwPortVal;unsigned int temp_aa;GetPortVal(m_nport, &temp_dwPortVal, 1); //reads a BYTE value from an I/O porttemp_aa=(unsigned int)temp_dwPortVal;temp_aa=temp_aa&0x0F0; //取低8位值,将低4位置为0;高4位不变;temp_aa=temp_aa^0x0B; //将低4位中C0、C1、C3置为1,C2置为0;高4位不变; //获得要写入控制端口的值WriteValue(数据范围为0~15)unsigned int WriValue;WriValue=WriteValue&0x0F; //取低4位;temp_aa=temp_aa^WriValue; //将写入值的低4位中的C0、C1、C3取反,C2位不变,高4位保持端口值不变SetPortVal(m_nport, (DWORD)temp_aa, 1); //写出的值中,高4位保持端口原来的值不变,//低4位是写入什么电平,连接器上既是什么电平 (3):数据端口及控制端口组合成12位数字输出的VC实现 //获得端口地址WORD m_nportData=(WORD)0x378;WORD m_nportControl=(WORD)0x37A;//获得要写入端口的值WriteValue(数据范围为0~4095)DWORD m_nValue=(DWORD)(WriteValue&0x0FF);//取低8位值SetPortVal(m_nportData, m_nValue, 1);//write a BYTE value to Data portDWORD temp_dwPortVal;unsigned int temp_aa;GetPortVal(m_nportControl, &temp_dwPortVal, 1); //reads a BYTE value from an I/O porttemp_aa=(unsigned int)temp_dwPortVal;temp_aa=temp_aa&0x0F0; //取低8位值,将低4位置为0;高4位不变;temp_aa=temp_aa^0x0B; //将低4位中C0、C1、C3置为1,C2置为0;高4位不变;unsigned int WriValue;WriValue=WriValue>>8;//取高4位值temp_aa=temp_aa^WriValue; //将写入值的低4位中的C0、C1、C3取反,C2位不变,高4位保持端口值不变SetPortVal(m_nportControl, (DWORD)temp_aa, 1); //写出的值中,高4位保持端口原来的值不变,//低4位是写入什么电平,连接器上既是什么电平 PC并行口数字输入的VC实现 DWORD dwPortVal;unsigned int ValueGet=0;//获得端口地址WORD m_nport=(WORD)0x379;//获得端口数据GetPortVal(m_nport, &dwPortVal, 1);ValueGet=(unsigned int)dwPortVal;ValueGet=ValueGet^0x80; //保持得到的State值与连接器处的值一直;ValueGet=ValueGet&0xF8; //去掉S0 ~S2位;ValueGet=ValueGet>>3; //右移3位,将S7~S3变为低5位 (2):控制端口数字输入的VC实现 //获得端口地址WORD m_nport=(WORD)0x37A;//===== 将C0~C3位置1,即使连接器上为高电平 ,使控制端口为输入端口=====DWORD temp_dwPortVal;unsigned int temp_aa;GetPortVal(m_nport, &temp_dwPortVal, 1); //获取端口的当前值temp_aa=(unsigned int)temp_dwPortVal;temp_aa=temp_aa&0x0F0; //取低8位值,将低4位置为0;高4位不变;temp_aa=temp_aa^0x4; //将低4位中C0、C1、C3置为0,C2置为1;高4位不变;SetPortVal(m_nport, (DWORD)temp_aa, 1); //写出的值中,高4位保持端口原来的值不变,//低4位是写高电平,即使连接器上是高电平//=============================================================unsigned int ValueGet=0;DWORD dwPortVal;//获得端口数据GetPortVal(m_nport, &dwPortVal, 1);ValueGet=(unsigned int)dwPortVal; ValueGet=ValueGet^0x0B; //保持C0,C1,C3位的值与连接器处的值一至;ValueGet=ValueGet&0x0F; //去掉高4位值 (3):控制端口及状态端口组合成9位数字输入的VC实现 unsigned int ValueGet=0;//获得端口地址WORD m_nportState=(WORD)0x379;WORD m_nportControl=(WORD)0x37A;//Read State PortDWORD dwPortVal;unsigned int ValueState=0;GetPortVal(m_nportState, &dwPortVal, 1);ValueState=dwPortVal;ValueState=ValueState^0x80; //保持得到的State值与连接器处的值一直;ValueState=ValueState&0xF8; //去掉S0 ~S2位;ValueState=ValueState<<1; //左移1位,将S7~S3变为高5位//Read control Port//========== 将C0~C3位置1,即使连接器上是高电平 ,使控制端口为输入端口=====GetPortVal(m_nportControl, &dwPortVal, 1); //获取端口的当前值ValueGet=(unsigned int)dwPortVal;ValueGet=ValueGet&0x0F0; //取低8位值,将低4位置为0;高4位不变;ValueGet=ValueGet^0x4; //将低4位中C0、C1、C3置为0,C2置为1;高4位不变;SetPortVal(m_nportControl, (DWORD)ValueGet, 1); //写出的值中,高4位保持端口原来的值不变,//低4位是写高电平,即使连接器上是高电平//=============================================================unsigned int ValueControl=0;GetPortVal(m_nportControl, &dwPortVal, 1);ValueControl=(unsigned int)dwPortVal; ValueControl=ValueControl^0x0B; //保持C0,C1,C3位的值与连接器处的值一至;ValueControl=ValueControl&0x0F; //去掉高4位值//get 9bit valueValueGet=ValueState^ValueControl; 五、结束 本文来源:http://blog.csdn.net/jiaohe2000/archive/2007/08/14/1742708.aspx
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 文章录入:admin 责任编辑:admin | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
| | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站公告 | 网站地图 | 管理登录 | | |||
|