DebugLab 发表于 2024-2-10 15:02
优先使用硬件方式,见4、5、6楼。
软件方式如下:
放在主循环或定时器中断里以10~1000Hz扫描即可,可以直接 ...
好的,谢谢,直接用中断的话,会不会因为没有消抖导致的误信号?
jwd 发表于 2024-2-10 16:41
好的,谢谢,直接用中断的话,会不会因为没有消抖导致的误信号?
不是,我是说用硬件中断的话会不会出现误信号 如果需要像PLC一样,在使用前先进行输入计算,再程序使用,可以通过异或等判断,这次开关的字节和上次保存的状态进行处理,得到整个字节的上升沿和下降沿,保存在两个字节里。在使用时,使用对应的上升下降沿的位就能实现PLC沿的功能。本次循环执行完后,上升下降沿寄存器都要清零,并保存本次开关状态到上次状态寄存器中。 zgrfox110 发表于 2024-2-10 19:13
如果需要像PLC一样,在使用前先进行输入计算,再程序使用,可以通过异或等判断,这次开关的字节和上次保存 ...
这是个思路,谢谢 本帖最后由 游龙在线 于 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 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语音写控制方法,供参考:
xiaoyao 发表于 2024-2-26 20:51
bit M0=0;
bit M1=0;
sbit X0=P1^0;
谢谢 游龙在线 发表于 2024-2-26 12:19
//如果不用中断,可以用下面这个方法:
//如果输入端加光耦或以按钮按下为1,这样用。如果不加光耦或以端口 ...
谢谢CEHH 单片机和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]