首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单片机PIC16F877A c++编程,同时控制一个占位传感器和一个光电二极管。

单片机PIC16F877A c++编程,同时控制一个占位传感器和一个光电二极管。
EN

Stack Overflow用户
提问于 2012-11-13 16:16:17
回答 4查看 4.2K关注 0票数 1

我目前正在做一个原型,它结合了2个传感器,由赛创的PIR运动传感器。

和一个光电二极管(很小,有三条腿,型号未知)

原型的工作方式是,当没有光,并且有运动时,led将亮起。否则,它将关闭。

我已经编写了代码来分别测试这两个传感器,它工作得很好。

当我组合这两个编码时,我遇到了led输出的问题。如下图所示:

代码语言:javascript
复制
//  include
//==========================================================================

 # include <pic.h>

 # include <htc.h>

//  configuration
//==========================================================================
__CONFIG (0x3F32);

//  define
//==========================================================================
 #define    sensor   RB3    
 #define    led      RA5
 #define led2    RB7
 #define light   RB5
 #define _XTAL_FREQ 4000000
 #define delay ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0)))

//  main function
//==========================================================================

void main(void)
{
//  unsigned long delay_time=5000;

TRISA = 0b00000000;
TRISB = 0b01111111;             //Configure Port B     as Input

ADCON1   =0B00000110;

led=0;
led2=0;
int i;

while(1)                    //Infinity Loop
{

    if(!light)
    {   
        if(sensor)
        {
            for(i=5;i>0;i--)
            {
                led2=0;
                led=1;
                __delay_ms(10000);
            }   
        }

        else if(!sensor)
        {   
            if (i>0)
            {   for(i=5;i>0;i--)
                {
                    led2=0;
                    led=1;
                    __delay_ms(10000);
                }
            }
            else if(i<=0)
            {
                led=0;  
                led2=1;
            }
        }
    }

    else if(light)
    {
        led=0;  
        led2=1;
    }

}
}

我很感谢你提前给予的帮助。请帮帮忙。谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-11-14 05:41:07

您声明了变量i,但是没有将其初始化为一个值(我认为C编译器也不会将其初始化为0,我不确定)。如果不是这样,那么想象一下下面的场景:,在执行的第一个开始:它是(!light)和(!sensor),它开始比较i>0或i<=0,但我最初是什么??

您只假设if (传感器)主体至少执行了一次,以便为i提供一个初始值。我不知道你的程序需求或流程的细节,但我认为这是一个不安全的隐藏的bug。

票数 1
EN

Stack Overflow用户

发布于 2016-07-10 23:08:46

虽然我不是PIC micro的专家,但我想知道你用来访问RAx和RBx的方法是否合适,即"led = 0",而不是"led &= ~(1 << led)“或类似的东西。

您似乎也没有初始化"int“变量,我认为这会导致if语句出现问题。

诚挚的问候。

票数 1
EN

Stack Overflow用户

发布于 2012-11-13 16:38:54

不如这样吧:

代码语言:javascript
复制
while (1)
{
    led_on = 0;

    if (!light && !sensor)
    {
        if (led_on == 0)
        {
            /* Turn on LED... */
            led_on = 1;
        }
    }
    else if (led_on == 1)
    {
        /* Turn off LED... */
        led_on = 0;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13357410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档