jwd 发表于 2024-2-10 16:41:14

本帖最后由 jwd 于 2024-2-10 16:44 编辑

DebugLab 发表于 2024-2-10 15:02
优先使用硬件方式,见4、5、6楼。
软件方式如下:
放在主循环或定时器中断里以10~1000Hz扫描即可,可以直接 ...
好的,谢谢,直接用中断的话,会不会因为没有消抖导致的误信号?

jwd 发表于 2024-2-10 17:19:03

jwd 发表于 2024-2-10 16:41
好的,谢谢,直接用中断的话,会不会因为没有消抖导致的误信号?

不是,我是说用硬件中断的话会不会出现误信号

zgrfox110 发表于 2024-2-10 19:13:00

如果需要像PLC一样,在使用前先进行输入计算,再程序使用,可以通过异或等判断,这次开关的字节和上次保存的状态进行处理,得到整个字节的上升沿和下降沿,保存在两个字节里。在使用时,使用对应的上升下降沿的位就能实现PLC沿的功能。本次循环执行完后,上升下降沿寄存器都要清零,并保存本次开关状态到上次状态寄存器中。

jwd 发表于 2024-2-10 19:20:28

zgrfox110 发表于 2024-2-10 19:13
如果需要像PLC一样,在使用前先进行输入计算,再程序使用,可以通过异或等判断,这次开关的字节和上次保存 ...

这是个思路,谢谢

游龙在线 发表于 2024-2-26 12:19:24

本帖最后由 游龙在线 于 2024-2-26 12:26 编辑

//如果不用中断,可以用下面这个方法:
//如果输入端加光耦或以按钮按下为1,这样用。如果不加光耦或以端口状态为准,上升和下降沿对换一下。
bit x,y,z,u;
sbit k0 = P0^0;                              //上升沿;
sbit k1 = P0^1;                              //下降沿;

void main()
{
      while()
      {
                if(k0 == 0)                        
                        x = 1;
                else
                {
                        if(y)
                        {
                              x = 0;
                              y = 0;
                        }
                }
                if(x)
                {
                        if(y == 0)
                        {
                              //上升沿要执行的程序;
                              y = 1;
                        }
                }




               
               
                if(k1 == 0)
                        z = 1;
                else
                {
                        if(z)
                        {
                              u = 1;
                              z = 0;
                        }
                }
                if(u)
                {
                        //下降沿要运行的程序;
                        u = 0;
                }               
      }
}

xiaoyao 发表于 2024-2-26 20:51:02

本帖最后由 xiaoyao 于 2024-2-26 21:02 编辑

bit M0=0;
bit M1=0;
sbit X0=P1^0;
sbit X1=P1^1;

sbit Y0=P2^0;
sbit Y1=P2^1;

上升延,IO初始化先低,再检查高低电平;
if( X0==1){if( M0==0){M0=1;Y0=0;}} //X0由低变高电平,Y0输出灯亮
//else {if( M0==1){M0=0;Y0=1;}}//去保持
下降延,IO初始化先高,再检查低电平;
if( X1==0){if( M1==0){M1=1;Y1=0;}} //X1由高变低电平,Y1输出灯亮
//else {if( M1==1){M1=0;Y1=1;}}//去保持

。。。。。

转发网上下载的C语音写控制方法,供参考:










jwd 发表于 2024-2-26 21:17:14

xiaoyao 发表于 2024-2-26 20:51
bit M0=0;
bit M1=0;
sbit X0=P1^0;


谢谢

jwd 发表于 2024-2-26 21:17:33

游龙在线 发表于 2024-2-26 12:19
//如果不用中断,可以用下面这个方法:
//如果输入端加光耦或以按钮按下为1,这样用。如果不加光耦或以端口 ...

谢谢CEHH

飞捷 发表于 2024-3-6 09:17:35

单片机和PLC的边沿信号差不多,就是与上一个扫描周期作比较来判断上升沿还是下降沿
X0_P=0;
X0_F=0;
if(X0_temp!=X0)
{
   if(X0==0)//当前是低电平,说明上个扫描周期是高电平,说明这次是下降沿。
    X0_F=1;
   else
    X0_P=1;
X0_temp=X0;
}
把这个放在主函数的WHILE(1)里面就好了
页: 1 [2]
查看完整版本: 请教一下各位大佬,PLC的沿信号检测是怎么实现的?