plc循环彩灯如何运用气动

plc循环彩灯如何运用气动,第1张

PLC循环彩灯是指通过PLC程序控制多个彩灯轮流变幻颜色并呈现出多种动态效果的一种装置,而气动则是其动力来源。在PLC与气控系统共同作用下,可以通过气动元件控制彩灯的亮灭和颜色变化,比如可压开关控制颜色转换、气动电磁阀控制彩灯亮灭等,通过不同的程序逻辑控制只用一个气源就能实现多个彩灯的控制,同时可实现多种不同的变幻效果,符合工厂、舞台灯光、影视等多重需求。

uchar i;

for(i=0;i<3;i++)

{

io=1; //高电平

delay(); //延时

io=0; //低电平

delay(); //延时

}

不知道你用的什么单片机,不过原理是一样的。你把程序上的IO口设置和彩灯接的IO口一致就行啦!延时不要太短(最好500毫秒以上),要不你看不到灯闪程序运行完啦。

一、C语言程序中存在的问题

1“for(i=0;i<7;i=i+2)”是“左移4次”而不是“左移3次”,i=0,i=2,i=4,i=6,当i=8时结束for循环。

2“LED=(LED<<2)|0x03;”的含义是:将LED左移2位后,将最低两位置1。

3“LED=(LED>>2)|0xc0;”的含义是:将LED右移2位后,将最高两位置1。

4两者结合,将“LED=(LED<<2)|0x03;”重复运行4次后,LED=0xff,其中不再存在值等于0的位。

之后无论“LED=(LED>>2)|0xc0;”还是“LED=(LED<<2)|0x03;”都不会再有值等于0的位产生。

看你的程序,发光二极管应该是低电平点亮,所以以后无论如何移位都不再有发光二极管点亮了。

5解决方法:将“for(i=0;i<7;i=i+2)”改成“for(i=0;i<3;i++)”即可。

二、反汇编实际含义的问题

对“LED=(LED<<2)|0x03;”的反汇编:

;    38:           LED=(LED<<2)|0x03; // 左移2位,并设定最低两位元为11      

C:0x000D    E5B0     MOV      A,P1(0x90)

C:0x000F    25E0     ADD      A,ACC(0xE0)

C:0x0011    25E0     ADD      A,ACC(0xE0)

C:0x0013    4403     ORL      A,#0x03

C:0x0015    F5B0     MOV      P1(0x90),A

;

1C程序中有从LED取值的指令“=LED”,因为LED在宏定义中为P1口,所以其对应汇编指令为“MOV A,P1”。

2在单片机实验中,P1口控制LED,常用灌电流直接驱动的方法。

在这样的电路下,即使引脚被内置置0,其对应外部引脚实际上还是被上拉成了高电平。

3因此,读取P1口值时将得到0xff,故而“LED=(LED<<2)|0x03;”后LED将直接的到0xff,所以以后发光二极管都不会亮了。

4解决办法:先对某个自定义寄存器进行移位处理,最后再将结构赋值给P1口。

修改后的程序:

/主要是想让灯两个两个的亮,可是程序不知道为什么只执行一遍/

/ ch03-3-3c - 霹雳灯实验程序  /

/

一、C语言程序中存在的问题

1“for(i=0;i<7;i=i+2)”是“左移4次”而不是“左移3次”,i=0,i=2,i=4,i=6,当i=8时结束for循环。

2“LED=(LED<<2)|0x03;”的含义是:将LED左移2位后,将最低两位置1。

3“LED=(LED>>2)|0xc0;”的含义是:将LED右移2位后,将最高两位置1。

4两者结合,将“LED=(LED<<2)|0x03;”重复运行4次后,LED=0xff,其中不再存在值等于0的位。

之后无论“LED=(LED>>2)|0xc0;”还是“LED=(LED<<2)|0x03;”都不会再有值等于0的位产生。

看你的程序,发光二极管应该是低电平点亮,所以以后无论如何移位都不再有发光二极管点亮了。

5解决方法:将“for(i=0;i<7;i=i+2)”改成“for(i=0;i<3;i++)”即可。

二、反汇编实际含义的问题

对“LED=(LED<<2)|0x03;”的反汇编:

;

    38:                         LED=(LED<<2)|0x03; // 左移2位,并设定最低两位元为11      

C:0x000D    E5B0     MOV      A,P1(0x90)

C:0x000F    25E0     ADD      A,ACC(0xE0)

C:0x0011    25E0     ADD      A,ACC(0xE0)

C:0x0013    4403     ORL      A,#0x03

C:0x0015    F5B0     MOV      P1(0x90),A

;

1C程序中有从LED取值的指令“=LED”,因为LED在宏定义中为P1口,所以其对应汇编指令为“MOV A,P1”。

2在单片机实验中,P1口控制LED,常用灌电流直接驱动的方法。

在这样的电路下,即使引脚被内置置0,其对应外部引脚实际上还是被上拉成了高电平。

3因此,读取P1口值时将得到0xff,故而“LED=(LED<<2)|0x03;”后LED将直接的到0xff,所以以后发光二极管都不会亮了。

4解决办法:先对某个自定义寄存器进行移位处理,最后再将结构赋值给P1口。

/

//==声明区============================================

#include <reg51h>   // 定义8051暂存器之标头档,P2-17~19 

#define LED P1   // 定义LED接至Port 1

//==子程序=============================================

/ 延迟函数,延迟约x 5ms /

//void delay(int x)  // 延迟函数开始  

void delay(unsigned char x)  // 延迟函数开始 

 int i,j;   // 声明整数变数i,j 

 for (i=0;i<x;i++) // 计数x次,延迟x 5ms   

 for (j=0;j<600;j++);// 计数600次,延迟5ms 

}      // 延迟函数结束

//==主程序============================================

main()     // 主程序开始

 unsigned char i;   // 声明无号数字元变数i(占1Bytes)   

 unsigned char temp=0x03; 

 //(舍去)LED=0xfc;   // 初值=1111 1100,只有最右1灯亮  

 while(1)     /// 无穷循环,程序一直跑  

 { 

  for(i=0;i<3;i++)// 左移3次   

  { 

   delay(100); // 延迟100 5m=05s    

   //(舍去)LED=(LED<<2)|0x03; // 左移2位,并设定最低两位元为11  

   temp=temp<<2;

   LED=~temp;

  }    // 左移结束,只有最左1灯亮   

  for(i=0;i<3;i++)// 右移3次  

  { 

   delay(100); // 延迟100 5m=05s   

   //(舍去)LED=(LED>>2)|0xc0; // 右移2位,并设定最高位元为11 

   temp=temp>>2;

   LED=~temp;

  }    // 结束右移,只有最右1灯亮 

 }     // while循环结束

}      // 主程序结束

如果数码管是共阴极的,则是把其中一个置高就会让该led亮起来。然后延时(没有延时的话是看不到效果的),再让下一个灯亮起来,再延时,……以此类推,就可以了!

电路给我,我可以帮你写程序!

ORG 0000H

AJMP MAIN

ORG 0030H

MAIN: MOV R0,#8

MOV A,#0FEH

P_0: MOV P0,A

ACALL DLY200

RL A;

RL A;左移两个 所以调用两次RL

DJNZ R0,P_0

MOV P0,#0FFH

MOV R0,#8

MOV A,#0FEH

P_1: MOV P1,A

ACALL DLY200

RL A

RL A

DJNZ R0,P_1

MOV P1,#0FFH

MOV R0,#8

MOV A,#0FEH

P_2: MOV P2,A

ACALL DLY200

RL A

RL A

DJNZ R0,P_2

MOV P2,#0FFH

MOV R0,#8

MOV A,#0FEH

AJMP MAIN

DLY200: ;延时200us,误差 0us

MOV R7,#04H

DL1:

MOV R6,#74H

DL0:

MOV R5,#0D6H

DJNZ R5,$

DJNZ R6,DL0

DJNZ R7,DL1

NOP

RET

END

可以用外部中断来控制;如果单片机中断是低有效,将按钮设置成按下时为低电平,触发中断,在中断中设置一个标志位,然后退出中断;主程序来判断这个标志位,如果为1,则退出led跑灯程序; 如果为0,则继续跑灯。如果单片机中断是高有效,将按钮设置成按下时为高电平,同理。 设置一个全局变量a,并且赋值a=0,一旦有按钮按下,则进入中断,并且a赋值为1,即a=1;在主程序中判断a的值,如果为0,则执行跑灯;若为1,则停止。

Y0-Y10是11个点吧。怎么才10个灯。k个点则一周期有2k个状态(包括全灭),现在取0--2k-1

--| |--(c1 K 2k) ;| | 是1s脉冲

--c1>2k-1--c1=0

--1<=c1<=2k-1--(Y0)

--2<=c1<=2k-2--(Y1)

--3<=c1<=2k-3--(Y2)

……

--k<=c1<=2k-k--(Yk-1)

以上就是关于plc循环彩灯如何运用气动全部的内容,包括:plc循环彩灯如何运用气动、怎么让单片机控制的彩灯闪三次停止、单片机彩灯控制等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10084241.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存