鱼C论坛

 找回密码
 立即注册
查看: 3673|回复: 4

[已解决]这个问题如何设计算法?

[复制链接]
发表于 2017-10-9 09:49:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 mzhh1985 于 2017-10-9 11:23 编辑

我想做个感应开关,用单片机和一个红外光电连接,中间串联1个接近开关和一个普通开关。接近开关和普通开关正常闭合的时候,当红外感应到物体通过的时候,改变输出状态。
红外第一次感应到物体时候,输出为0
红外第二次该赢到物体时候,输出为1
以此类推
初始状态不确定,红外和输出都不确定,有四种可能:(0,0);(0,1);(1,0);(1,1),要在任意情况下,均可触发红外改变效果。
下面是我写出来的程序,但是总感觉不对劲,请大神帮忙看看
#include "stdio.h"

int a=0;//红外光电开关
int b=0;//a的是否发生改变
int c=0;//接近开关常闭
int d=0;//普通开关
int e=0;//输出
int old_a=0;

int main()
{
//下面输入输出是我自己调试的,
    printf("输入a的状态:");
    scanf("%d",&a);
     printf("输入b的状态:");
    scanf("%d",&b);
     printf("输入c的状态:");
    scanf("%d",&c);
     printf("输入d的状态:");
    scanf("%d",&d);

    int Ztai(int a,int b,int c);
    old_a =a;
    b=Ztai(a,b,old_a);
    if(b&&c&&d)
    {
     e=1;
    }
   else
    {
        e=0;
    }
    printf("a=%d,b=%d,c=%d,d=%d,e=%d",a,b,c,d,e);
return 0;

}
int Ztai(int a,int b,int c)        //自定义函数
{
    if (a!=old_a)
    {
        b = !b;
    }
    else {
        b=b;
    }
    return b;
}
最佳答案
2017-10-9 13:45:36
首先,红线触发这个你要去获取,你要一直判定是需要一个循环的。下面的代码你看一下,只能给你一个思路,主要是不清楚你这个是用在检测物体个数上的,还是安全区域检测。
#include "stdio.h"

bool bRedOpen = false;        // 红外光电开关
bool bRedTrigger = 0;        // 红外开关被触发
bool bNearOpen = false;        // 接近开关常闭
bool bOpen = false;                // 普通开关
int  nRed = 0;                        // 红外开关触发的次数

int main()
{
        // 下面输入输出是我自己调试的,
        printf("输入红外光电开关的状态:");
        scanf("%d", &bRedOpen);
        printf("输入红外开关触发的次数:");
        scanf("%d", &nRed);
        printf("输入接近开关的状态:");
        scanf("%d", &bNearOpen);
        printf("输入普通开关的状态:");
        scanf("%d", &bOpen);

        while (true)
        {
                // 判断红外是否被触发
                if (bRedTrigger == true)
                {
                        nRed = 1;
                }
                else
                {
                        nRed = 0;
                }
        }
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-10-9 13:29:43 | 显示全部楼层
我没看你的代码
给你个思路,先获取红外和输出状态,如果红外状态是1(有感应),如果再检测到变为0(没感应),那就将输出状态取反;如果红外状态是0,那么红外状态应该由0->1->0这样才算是检测到物体通过,这个时候改变输出状态
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-9 13:45:36 | 显示全部楼层    本楼为最佳答案   
首先,红线触发这个你要去获取,你要一直判定是需要一个循环的。下面的代码你看一下,只能给你一个思路,主要是不清楚你这个是用在检测物体个数上的,还是安全区域检测。
#include "stdio.h"

bool bRedOpen = false;        // 红外光电开关
bool bRedTrigger = 0;        // 红外开关被触发
bool bNearOpen = false;        // 接近开关常闭
bool bOpen = false;                // 普通开关
int  nRed = 0;                        // 红外开关触发的次数

int main()
{
        // 下面输入输出是我自己调试的,
        printf("输入红外光电开关的状态:");
        scanf("%d", &bRedOpen);
        printf("输入红外开关触发的次数:");
        scanf("%d", &nRed);
        printf("输入接近开关的状态:");
        scanf("%d", &bNearOpen);
        printf("输入普通开关的状态:");
        scanf("%d", &bOpen);

        while (true)
        {
                // 判断红外是否被触发
                if (bRedTrigger == true)
                {
                        nRed = 1;
                }
                else
                {
                        nRed = 0;
                }
        }
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-9 16:04:14 | 显示全部楼层
lumber2388779 发表于 2017-10-9 13:29
我没看你的代码
给你个思路,先获取红外和输出状态,如果红外状态是1(有感应),如果再检测到变为0(没感应), ...

谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-9 16:06:50 | 显示全部楼层
上善若水··· 发表于 2017-10-9 13:45
首先,红线触发这个你要去获取,你要一直判定是需要一个循环的。下面的代码你看一下,只能给你一个思路,主 ...

我是用在区域的,这个代码我研究看看,谢谢啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-25 09:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表