【SCL】移位和循环指令的应用(音乐喷泉改进) 您所在的位置:网站首页 scr和shr 【SCL】移位和循环指令的应用(音乐喷泉改进)

【SCL】移位和循环指令的应用(音乐喷泉改进)

2023-03-14 21:59| 来源: 网络整理| 查看: 265

移位指令:右移(SHR)左移(SHL)和循环左移/右移(ROR/ROL)指令的应用

文章目录

目录

一、移位和循环移位指令

1.左移右移

2.使用左移和脉冲实现音乐喷泉

3.循环移位指令

二、优化的其它方法

1.使用脉冲和数组

2.随机移位

总结

前言

这一章我们对音乐喷泉试验进行优化和改进,并一起来学习我们移位指令在这里的应用。

一、移位和循环移位指令 1.左移右移

 在我们前面实现音乐喷泉控制时,是使用的case of  语句来完成的,那么有没有其它的更加简便的方法方式呢!有的,移位指令就是!我们再来看一下控制要求:

7467bceaa06a4d67a52b0987c587a5b7.png

 L1到L8这8个灯以0.5s的间隔依次来闪亮,时间间隔相同,一共要用8个Q点;

左移(SHL):

 这一个是信息系统中的释义:30d1ddffe0c1478b9bc5bbcb8f2bdd17.png

d4174601da6548cbac93ed3ad2697578.png

这一个是scl中的左移指令,其中IN是要移位的一个值,上面音乐喷泉的8个灯是一个字节byte,8个位,这里IN我们填上QB0就可以了(Q0.0---Q0.7) ,N是对IN每次移位的位数(例:1,就是对QB0一次移动1位) 

1fae414d9d634fc897f19c3b821af136.png

 911a4586efc747458b91ff2fd681ffbb.png

左移就是从左边Q0.0开始,进行移位; 

右移(SHR):

和左移相反,从右边Q0.7开始进行移位;

2.使用左移和脉冲实现音乐喷泉

这里启动按钮按下后,用中继接通定时器来产生脉冲,并给qb赋值一个1(相当于初始值),用脉冲来触发左移指令,当最后一位也移完之后,qb就=0,这是再给它一个1,就可以循环往复一直运行,按下停止后,将标志1和qb清零就可以啦! 

较与case of 语句,这个会更加简便一些。 

IF #OFF THEN #标志1 := 0; #qb := 0; END_IF; IF #ON THEN #标志1 := 1; #qb := 1; END_IF; #T(IN := #标志1 & NOT #输出, PT := T#500ms, Q => #输出); #P(CLK := #输出); IF #标志1 & #P.Q THEN #qb := SHL(IN := #qb, N := 1); IF #qb = 0 THEN #qb := 1; END_IF; END_IF; 3.循环移位指令

循环左移指令会在移位完之后,再次循环移位,在上中会比左移更加方便一些! 

二、优化的其它方法 1.使用脉冲和数组

这一个实现的原理就是给数组赋值2进制的数值,然后再将数组依次赋值给qb,来实现效果! 

IF #OFF THEN #qb := 0; #ZJ1 := 0; "数据块_1".变量 := 0; END_IF; IF #ON THEN #ZJ1 := 1; END_IF; #T[0](IN := #ZJ1 & NOT #输出1, PT := T#500ms, Q => #输出1); #P[0](CLK := #输出1); IF #P[0].Q THEN "数据块_1".变量 :="数据块_1".变量+1; IF "数据块_1".变量 = 8 THEN "数据块_1".变量 := 0; END_IF; END_IF; IF #ZJ1 THEN #qb := "数据块_1".数组["数据块_1".变量]; END_IF; 2.随机移位

 这里是用一个脉冲对变量w进行加加,另一个脉冲来抓取,然后来确定移动的位数。

//停止 IF #OFF THEN #中继1 := 0; #W := 0; #qb := 0; END_IF; //启动 IF #ON THEN #中继1 := 1; //#中继2 := 1; #qb := 1; END_IF; //获取脉冲上升沿 IF #中继1 THEN #P(CLK := "Clock_2.5Hz"); END_IF; //对变量w一直进行加1 IF #P.Q THEN #W := #W + 1; IF #W = 8 THEN #W := 1; END_IF; END_IF; //在0.5s内抓取变量w的数值,然后进行移位操作,实现每次移动的数不同。 #T(IN := #中继1 & NOT #时间到, PT := T#0.5s, Q => #时间到); #P1(CLK := #时间到); IF #P1.Q & #中继1 THEN //#中继1 := 0; #qb := SHL(IN := #qb, N := #W); END_IF; IF #qb = 0 & #中继1 THEN #qb := 1; END_IF; 总结

以上就是对音乐喷泉这个案例的几个优化。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有