利用西门子DQ模块控制移位寄存器的,模拟串行通信

news/2025/3/15 7:25:36/文章来源:https://www.cnblogs.com/xiacuncun/p/18234879

1. 背景

  • 以前了解过串行通信的方法但是没有详细了解过具体实现。趁着手上有的一堆破铜烂铁尝试自己去实现一个最简单的串行控制。
    目的是通过移位寄存器的不同位的表达,达到2*2=4个的继电器管断组合,达到切换矩阵的目的。
    这里只记录一下程序实现,不记录硬件电路。

2. 材料

  • 移位寄存器:SN74AHC594
  • 固态继电器:4个
  • 电源模块及外围器件,若干
  • CPU1500+DQ16

3. 原理

  • 选择的是一个8位移位寄存器,当响应bit等于1的时候,动作相应的继电器,组合应用。
  • 移位寄存器的时钟(CLOCK)上升沿的时候会把对应的数据(DATA)状态传出(左移)。
  • 8位数据传递完成后,片选信号(CS)拉高,完成一次数据传递过程。片选信号不用依靠时钟传递。

4. 程序过程

  • 写入数据选择
//for 2 - 2 switch module//1.select number
IF #IO_enable AND NOT #IO_reset THEN#statSwitchNbr := #I_switch_nbr;
END_IF;CASE #statSwitchNbr OF//default0:#statShiftregister := 2#00000000;//normal10:#statShiftregister := 2#01100010;//cross20:#statShiftregister := 2#00010100;//short30:#statShiftregister := 2#00000110;//short40:#statShiftregister := 2#01110000;//wire break50:#statShiftregister := 2#00000000;ELSE//others#statShiftregister := 2#11111111;
END_CASE;
//#tmpRel := Serialize(SRC_VARIABLE := #statShiftregister, DEST_ARRAY => #statShiftArr, POS := #tmpPos);
#statShiftArr[7] := #statShiftregister.%X0;
#statShiftArr[6] := #statShiftregister.%X1;
#statShiftArr[5] := #statShiftregister.%X2;
#statShiftArr[4] := #statShiftregister.%X3;
#statShiftArr[3] := #statShiftregister.%X4;
#statShiftArr[2] := #statShiftregister.%X5;
#statShiftArr[1] := #statShiftregister.%X6;
#statShiftArr[0] := #statShiftregister.%X7;
  • 时钟信号
    • 按照以前做的两个定时器实现高低电平切换的方法实现了此处的时钟信号
//2. clock
#data_clock(In_switchtime := T#1000ms,In_startAlternate := #IO_enable,Out_switchtime_up=>#statClock_up,Out_switchtime_Down=>#statClock_down);
  • 数据写入信号
    • 时钟信号的低电平半区内,等待一小段时间后写入数据(等待是为了数据写入稳定)。写入数据后,时钟信号的高电平脉冲会触发数据写进移位寄存器内。一个循环结束。
//3. shift register
#time_data(IN := #statClock_down,PT := T#500ms);//4. output data
IF #IO_enable AND NOT #IO_reset THENIF #time_data.Q AND NOT #statPulserArr[0] THEN#O_Data := #statShiftArr[#statData_count];#statData_count := #statData_count + 1;END_IF;#statPulserArr[0] := #time_data.Q;
END_IF;
  • 数据发送完成后,片选信号激活
//6. output cs
#time_cs(IN:=#statClock_up,PT:=T#100MS);IF #statData_count > 7 AND #time_cs.Q THEN#statCS := true;
END_IF;
#O_cs := #statCS;
  • 完成数据发生,以及复位功能实现
//7. finish
#time_finish(IN:=#statCS,PT:=t#100MS);
IF #time_finish.Q THEN#statCS := false;#IO_enable := false;#IO_reset:=false;#statData_count := 0;RESET_TIMER(#time_data);RESET_TIMER(#time_cs);RESET_TIMER(#time_finish);
END_IF;//8. reset
IF #IO_reset AND NOT #statPulserArr[2] THEN#statSwitchNbr := 0;#IO_enable := false;
END_IF;
#statPulserArr[2] := #IO_reset;
#time_reset(IN := #IO_reset,PT := t#50ms,Q => #statReset);
IF #statReset THEN#IO_enable := true;
END_IF;

5. 整体代码如下

//for 2 - 2 switch module//1.select number
IF #IO_enable AND NOT #IO_reset THEN#statSwitchNbr := #I_switch_nbr;
END_IF;CASE #statSwitchNbr OF//default0:#statShiftregister := 2#00000000;//normal10:#statShiftregister := 2#01100010;//cross20:#statShiftregister := 2#00010100;//short30:#statShiftregister := 2#00000110;//short40:#statShiftregister := 2#01110000;//wire break50:#statShiftregister := 2#00000000;ELSE//others#statShiftregister := 2#11111111;
END_CASE;
//#tmpRel := Serialize(SRC_VARIABLE := #statShiftregister, DEST_ARRAY => #statShiftArr, POS := #tmpPos);
#statShiftArr[7] := #statShiftregister.%X0;
#statShiftArr[6] := #statShiftregister.%X1;
#statShiftArr[5] := #statShiftregister.%X2;
#statShiftArr[4] := #statShiftregister.%X3;
#statShiftArr[3] := #statShiftregister.%X4;
#statShiftArr[2] := #statShiftregister.%X5;
#statShiftArr[1] := #statShiftregister.%X6;
#statShiftArr[0] := #statShiftregister.%X7;//2. clock
#data_clock(In_switchtime := T#1000ms,In_startAlternate := #IO_enable,Out_switchtime_up=>#statClock_up,Out_switchtime_Down=>#statClock_down);//3. shift register
#time_data(IN := #statClock_down,PT := T#500ms);//4. output data
IF #IO_enable AND NOT #IO_reset THENIF #time_data.Q AND NOT #statPulserArr[0] THEN#O_Data := #statShiftArr[#statData_count];#statData_count := #statData_count + 1;END_IF;#statPulserArr[0] := #time_data.Q;
END_IF;//5. output clock
#O_clk := #statClock_up;//6. output cs
#time_cs(IN:=#statClock_up,PT:=T#100MS);IF #statData_count > 7 AND #time_cs.Q THEN#statCS := true;
END_IF;
#O_cs := #statCS;//7. finish
#time_finish(IN:=#statCS,PT:=t#100MS);
IF #time_finish.Q THEN#statCS := false;#IO_enable := false;#IO_reset:=false;#statData_count := 0;RESET_TIMER(#time_data);RESET_TIMER(#time_cs);RESET_TIMER(#time_finish);
END_IF;//8. reset
IF #IO_reset AND NOT #statPulserArr[2] THEN#statSwitchNbr := 0;#IO_enable := false;
END_IF;
#statPulserArr[2] := #IO_reset;
#time_reset(IN := #IO_reset,PT := t#50ms,Q => #statReset);
IF #statReset THEN#IO_enable := true;
END_IF;

6. 调试过程

  • 刚开始的脉冲,如图标记出来的脉冲其实是被扔掉的,程序里面一共会记录8个上升脉冲,但是标记的这一个并不会被记录在内。当然针对这种情况,也可以通过程序把时钟的第一个上升沿过滤掉,但是没有必要,因为这个数据最后还是会被扔掉的,移位寄存器只记录了从最后一个数据开始倒数8位数据长度。

  • 按照程序的写法,此时发送的数据是2#01100010,所以观察的时钟的每一个上升沿,按照时间顺序应该是0->1->1->0->0->0->1->0

  • 结束时候片选信号如下,因为enable结束的时刻把所有过程信号都清零了,所以最后一个时钟高电平很短。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/720910.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024-06-06 前端开发环境

前言:今天公司给我配了台电脑,要我装一下环境,故此记录一下。 一.nvm:node版本管理器,全称Node Version Manage。使用它不用单独跑去node官网下载node,nvm提供了更便捷的下载方式。 下载链接:https://github.com/coreybutler/nvm-windows/releases上面两个任选一个即可。…

【Unity】Texture下载、保存、加载

代码块 网络下载图片 // 2017之后推荐使用UnityWebRequest IEnumerator DownloadTexture(string url){WWW www = new WWW (url);yield return www;if (www.isDone) {texture = www.texture;} }保存图片到本地 void SaveTexture(){string savePath = Application.persistentData…

算法金 | 再见!!!KNN

大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」KNN算法的工作原理简单直观,易于理解和实现,这使得它在各种应用场景中备受青睐。 我们将深入探讨KNN算法,从基本概念到实现细节,从算法优化到实际应用,我们都会一一…

苹果macOS系统U盘版/恢复版基础安装教程

目前,刻录U盘进行安装是主流选择,这样安装调试好的黑苹果macOS问题最少,也较为稳定。镜像恢复安装的方式,某宝上的远程安装的商家都是这么干的,但是其中很大一部分商家存在一个严重问题:macOS 从10.14 开始全面采用了 APFS 文件系统,但是当时的恢复软件无法支持这个文件…

[操作系统] MenuetOS :最轻量的、非Linux的、开源操作系统

1 MenuetOS 概述1.1 简介MenuetOS是一款由英国软件工程师Ville Mikael Turjanmaa和Madis Kalme开发的、开放源码的32/64位操作系统。 该系统完全由x86汇编语言在2000年编写完成。 MenuetOS的设计目标是去除操作系统编程中的复杂化和错误部分,具有轻量级、高性能和强大的功能等…

IT-Tools.Tech: 助力开发人员和IT工作者!

IT-Tools.Tech: 为开发者提供便捷的在线工具it-tools.techIT-Tools.Tech[1] 是一个专为开发者设计的在线工具平台,提供了多种实用的开发工具,帮助简化工作流程,提高工作效率。平台上的工具涵盖了从文本处理、编码解码到图像处理等多方面需求,满足不同开发任务的要求。 主要…

手机版 - imessage信息群发,苹果imessages短信,imessages推信,苹果手机推信,苹果imessage群发实现原理

Apple公司全线在mac os与ios两个操作系统上内置了FaceTime与iMessage两个应用。完美替代运营商的短信与电话。并且FaceTime与iMessage的帐号不仅仅与Apple ID 绑定,同时也与使用这Apple ID的手机号码绑定,这样的漏洞自然给无孔不入的群发垃圾信息商们提供了后门。这样iPhone的…

Web 网页性能及性能优化

Web 网页性能及性能优化 一、Web 性能 Web 性能是 Web 开发的一个重要方面,侧重于网页加载速度以及对用户输入的响应速度 通过优化网站来改善性能,可以在为用户提供更好的体验 网页性能既广泛又非常深入 1. 为什么性能这么重要? 1. 性能关乎留住用户 性能对于任何在线业务都…

C# .NET 6 使用WorkFlow Core 创建工作审批流

1,背景工作流思想在上世纪60年代就有人提出过;70年代就有人开始尝试,但是由于当时许多的限制,工作流一直没有成功的被实现;80年代才出现第一批成功的工作流系统;90年代工作流技术走向了第一个发展高峰期;90年代后至今工作流出现了很多版本,但是主旨还是不变的,为了使我…

简单实现Viper配置管理

本文由 ChatMoney团队出品简介 前面实现的一个简易suno-api。是使用cookie来获取suno-token发起请求的。当时并没有通过配置的方式来获取cookie,而是直接在代码中写死了cookie的值,这种做法并不好,所以现在打算把cookie值改造为一个配置,通过viper来读取。 什么是viper Vipe…

全局 type 类型的寻找 typescript 类型 - fabric.Canvas

全局 type类型的寻找 typescript 类型 - fabric.Canvas declare type ExtCanvas = fabric.Canvas & {isDragging: boolean;lastPosX: number;lastPosY: number; };这个代码 没有定义 fabric.Canvas,然后看看提示说在namespace定义了。这个是子项目,没有type定义,上父项目…

Linux中sed命令b选项屏蔽指定的处理区域

001、Linux中sed命令b选项屏蔽指定的处理区域[root@pc1 test2]# ls a.txt [root@pc1 test2]# cat a.txt ## 测试数据 1 01 02 a 2 03 04 a 3 05 06 a 4 07 08 5 09 10 k 6 11 12 a 7 13 14 8 15 a i 9 17 18 a [root@pc1 test2]# sed 1,3b; s/a/Q/ a.tx…