无线电电子与电气工程百科全书 LPT端口的另一个生命。 第2部分.无线电电子电气工程百科全书 为了记录 LPT 端口上的信号,我建议组装一个由八个开关和八个电阻为 1 Ohm - 270 kOhm 的电阻组成的电路(图 1)。 开关(按钮)SW1-SW8处于该位置时,所有上触点上都出现逻辑“1”,当其中任何一个闭合时,相应触点上都会出现逻辑“0”。 引脚可以直接连接到 D0-D7 总线(引脚 2-9,地址 &H378)或连接到 ERROR、SELECT、PAPER END、ACK 和 -BUSY(引脚 15、13、12、10 和 11,地址 &H379)。
要显示来自 LPT 端口的数据,我推荐以下方案。
电阻器 R1-R8 的标称值为 270 - 330 欧姆,任何 LED,例如 AL307B。 这样的电路不需要电源,无论如何一切都会发光。 我将所有信号带给自己,一切都立即可见。 一般来说,我强烈建议在 valery-us3leh.narod.ru/dlpt.html 下载 LPT 4D HARD 分析器程序。 由瓦列里·科夫通撰写。 在这个程序的帮助下......一般来说,您会亲眼看到。 让我们在 K561LA7 芯片上组装一个矩形脉冲发生器。 发电机+5V。 事实上,将所有设备组装起来更方便,例如在155、555系列上,使信号具有TTL电平。 逻辑“零”0-0,8V,对数“一”2,4-4,2V。 561系列的便利性在于电源的多功能性——从+3V到+12V都同样能正常工作。 因此,微电路的选择仍然取决于您的喜好,唯一的问题是获得幅度不超过+ 5V的矩形脉冲。 图 3 显示了简单脉冲发生器的示意图。
发生器本身组装在元件 D1.1-D1.3 上,我只是使用元件 D1.4 来获得更“美丽”的输出脉冲前沿。 R1、R2、C1——频率设定元件。 根据这些元件参数,生成频率约为 5-7 Hz。 为了清楚起见,生成器的操作可以用下图的形式表示:
逆变器输出 D1.4 连接到 LPT 连接器(总线 D2)的引脚 0。 在使用发生器之前,需要将D0-D7总线置于数据接收模式。 为此,我们将 37 发送到 &H43A。
之后,我们开始轮询端口 &H378。
变量 A 将取值 254 或 255。为什么?
事实是,D0-D7总线切换到数据接收模式后,它们被设置为逻辑单元电平(黄行)。 当 D0 总线上出现 D0 电平时,日志“0”(蓝色行)——第一位取值为零,表示 2 + XNUMX1+22+23+24+25+26+27 = 254。 因此,我们可以跟踪 D0 总线上信号的变化,但是如果我们计算 1 秒内的变化次数,我们将得到……正确的——数字频率计数器。 会心 号码 传入的冲动 每秒 可以说一下 以赫兹为单位的频率. 所以,频率计数器程序。 该表单应有 3 个按钮和一个标签。 按钮 1 启动频率计,按钮 2 停止,按钮 3 - 退出,标签 - 指示频率。 ******************************************* 对于那些使用 inpout32.dll 选项显式 '使用端口地址的库声明 私有声明函数 Inp Lib“inpout32.dll”别名“Inp32”(ByVal PortAddress As Integer)As Integer 私有声明子输出库“inpout32.dll”别名“Out32”(ByVal PortAddress As Integer,ByVal Value As Integer) '用于计算毫秒的库声明 私有声明函数 GetTickCount Lib "kernel32" () As Long Dim FTV As Long '系统时间初始值 Dim STV As Long '系统时间结束值 Dim FV As Integer 'FV 是端口的初始状态 Dim SV As Integer 'SV 可比端口状态 Dim cntr '脉冲计数器 Dim J As Integer 'J=1 计数允许,J=0 计数不允许 Private Sub Command1_Click() Out &H37A, 43 '我们将轮胎 D0-D7 置于读取模式 FTV = GetTickCount '记住的系统时间(以毫秒为单位) J = 1 '计数 - 允许 FV = Inp(&H378) '读取端口状态 SV = FV 'SV 等于端口状态 cntr = 0 '反零 当 J <> 0 时执行 事件 STV = GetTickCount '记住当前系统时间 If STV > FTV + 1000 ThenFrequencyShow '如果一秒过去了,显示结果 FV = Inp(&H378) '不断轮询地址&H378 If FV <> SV then '如果端口状态已改变 SV = FV 'SV 等于端口状态 cntr = cntr + 0.5 ' 计数器 + 0.5 结束如果 If J = 0 Then Exit Do '如果用户按下停止 循环 END SUB Private Sub Command2_Click() '停止循环 '如果用户按下停止 Ĵ = 0 END SUB Private Sub Command3_Click() J = 0 '计数-停止 Out &H37A,0'恢复D0-D7总线状态 卸载我'退出程序 END SUB '频率显示例程 公共子频率显示() Label1.Caption = Int(cntr) & " Hz" '显示结果 cntr = 0 '反零 暂停(0.2)'延迟。 需要测量低频 FTV = GetTickCount '记住的系统时间(以毫秒为单位) END SUB '延迟例行公事。 呼叫格式:暂停(秒数) 公共子暂停(单值) 昏暗的开始,结束 开始 = 定时器 Do While Timer < 开始 + 值 事件 循环 完成=计时器 END SUB ******************************************* 对于那些使用 dlportio.dll 选项显式 '使用端口地址的库声明 私有声明函数 DlPortReadPortUchar Lib“dlportio.dll”(ByVal 端口等长)作为字节 私有声明子 DlPortWritePortUchar Lib“dlportio.dll”(ByVal 端口为长,ByVal 值为字节) '用于计算毫秒的库声明 私有声明函数 GetTickCount Lib "kernel32" () As Long Dim FTV As Long '系统时间初始值 Dim STV As Long '系统时间结束值 Dim FV As Integer 'FV 是端口的初始状态 Dim SV As Integer 'SV 可比端口状态 Dim cntr '脉冲计数器 Dim J As Integer 'J=1 计数允许,J=0 计数不允许 Private Sub Command1_Click() DlPortWritePortUchar &H37A, 43 '使D0-D7总线进入读模式 FTV = GetTickCount '记住的系统时间(以毫秒为单位) J = 1 '计数-允许 FV = DlPortReadPortUchar(&H378) '读取端口状态 SV = FV 'SV 等于端口状态 cntr = 0 '反零 当 J <> 0 时执行 事件 STV = GetTickCount '记住当前系统时间 If STV > FTV + 1000 ThenFrequencyShow '如果一秒过去了,显示结果 FV=DlPortReadPortUchar(&H378)'不断轮询地址&H378 If FV <> SV then '如果端口状态已改变 SV = FV 'SV 等于端口状态 cntr = cntr + 0.5 ' 计数器 + 0.5 结束如果 If J = 0 Then Exit Do '如果用户按下停止 循环 END SUB Private Sub Command2_Click() '停止循环 '如果用户按下停止 Ĵ = 0 END SUB Private Sub Command3_Click() J = 0 '计数-停止 DlPortWritePortUchar &H37A,0'恢复D0-D7总线状态 卸载我'退出程序 END SUB '频率显示例程 公共子频率显示() Label6.Caption = Int(cntr) & " Hz" '显示结果 cntr = 0 '反零 暂停(0.2)'延迟。 需要测量低频 FTV = GetTickCount '记住的系统时间(以毫秒为单位) END SUB '延迟例行公事。 呼叫格式:暂停(秒数) 公共子暂停(单值) 昏暗的开始,结束 开始 = 定时器 Do While Timer < 开始 + 值 事件 循环 完成=计时器 END SUB ******************************************* 和所有? 你问。 是的,仅此而已。 这就是整个程序,由于某种原因它可以工作。 Ø 如您所见,不同库的代码几乎相同,因此,在下面的示例中,我们将仅考虑库的代码 比重.dll文件 如果你仔细分析频率计数器程序代码,你会注意到计数器增加了0.5, 中心 = 中心 + 0.5, 而不是 1。事实上,该程序代码考虑了端口状态从 1 到 0 的转变,反之亦然从 0 到 1,因此,为了计算频率,您必须添加 0.5,然后输出 Label1.Caption = Int(cntr) & "hz" 或加 1 中心 = 中心 + 1, 然后输出 Label1.Caption = Int(cntr/2) & "hz" 这是数学。 顺便问一下,您是否尝试过在某些发动机的旋转轴上放置某种传感器。 也许,在这个程序的帮助下,你会得到一个很棒的转速表 J 好吧,让我们继续。 我们采用相同的脉冲发生器,而不是电阻器 R2 或 R1,而是焊接热敏电阻(文章作者去了一家汽车商店,花了 30 卢布从 VAZ-2101 购买了温度传感器)。 该热传感器根据温度改变其电阻(+3200 时为 14 欧姆)0C 和 143 欧姆,温度为 +1000C.) 由于我们改变了电阻,发电机的频率也会改变,这意味着我们得到了一个转换器 温度频率, IE。 数字温度计。 我想提请您注意这样一个事实,即电阻随温度的变化并不是线性发生的,如下图所示,
因此,向计算机“解释”100 个脉冲是 20 度,110 个脉冲是 21 度并不是很容易,但仍然是可能的。 问题仅在于代码和算法的大小。 如果我们在油箱上安装燃油传感器而不是电阻器,那么我们就会得到一个液位指示器。 构建这样的指标更方便,如下所示: 1. 我们用空罐测量脉冲频率 2. 我们添加一些音量(取决于您想要获得的等级 - 准确性)并再次测量频率 3. 依此类推,直到容器的最顶部。 如果组装下图所示的结构,您可以根据不同的原理构建液位指示器。
如果液位发生变化,那么浮子与磁铁的位置也会发生变化,因此相应的干簧管闭合(打开)。 最好使用薄壁塑料管。 该装置的方案如下:
您可以根据以下算法处理来自此类设备的信息。
Ø 有些人可能会反对我,没有必要将D0-D7总线置于读模式,这样就可以了。 对此我只能回答如下——谁愿意翻译,就让他不翻译吧。 我不会讨论这个话题。 如果 &H378 端口未处于数据接收模式并且所使用的引脚(在我们的例子中为 2 - D0 )具有逻辑“1”,则 发电机不工作。 数据传输模式下D0-D7总线的输出电流大于CMOS芯片(561LA7)的输出电流,因此不会产生。 当然,如果用镊子将触点短路到地,那么电流就不够了。 但在我看来,额外输入一行代码并按照计算机硬件开发人员的建议进行操作并不困难。 现在让我们考虑相反的过程,即将数据从计算机传输到您的设备的过程。 我们以相同的脉冲发生器为例,只需稍微改变其电路即可。
给发电机通电后,我们突然发现发电机不工作了。 并且只有当D2元件的输入1.1处出现逻辑电平“1”时才起作用。 DlPortWritePortUchar &H378,1 一切立即奏效。 这是一台计算机控制的发电机。 嗯,发生器都很小,尽管我们必须向这个装置致敬——在这么多电子电路中,它是作为基础的脉冲发生器。 我们为什么不把一些更严肃的东西连接到计算机上呢? 这是这样的计划
我们将该设备的输入连接到我们喜欢的任何输出,例如连接到 D3,我们将 GND 输入连接到连接器的公共线,但 + 12V 必须从单独的电源获取。 继电器可采用汽车。 一般来说,元素的所有参数都可以完全不同(我拿的是手头的) DlPortWritePortUchar &H378, 8 или DlPortWritePortUchar &H378, 9 или DlPortWritePortUchar &H378,10 最主要的是D3总线上应该有“1”的日志。 继电器会起作用,但你接什么是你的事。 一般来说,在开关高压设备时,有必要(以防万一)保护自己免受短路,击穿的情况,一般情况下,这样做。 这样,万一发生事故,您精彩的 LPT 端口就不会烧坏。 因此,对于此类连接,可以方便地使用端口和设备的电流隔离,例如通过光耦合器。
如果你的设备中的所有东西都“烧坏”,那么通过光 - 唉,电流不会通过,他们还没有想出这样的东西。 第二部分到此结束。 会有第三部分吗——我想会有的,但这就是它的内容…… 作者:阿列克谢·克柳什尼科夫,伊万诺沃; 出版:cxem.net 查看其他文章 部分 电脑. 读和写 有帮助 对这篇文章的评论. 科技、新电子最新动态: 用于触摸仿真的人造革
15.04.2024 Petgugu全球猫砂
15.04.2024 体贴男人的魅力
14.04.2024
其他有趣的新闻: ▪ 超耐用镁化合物 ▪ 可再生能源的危险
免费技术图书馆的有趣材料: ▪ 文章 Lokhvitskaya Nadezhda Aleksandrovna(Teffi)。 名言警句 ▪ 文章基于激光笔的照片拍摄画廊。 无线电电子电气工程百科全书 本页所有语言 www.diagram.com.ua |