我目前正在做一个原型,它结合了2个传感器,由cytron组成的PIR运动传感器。
和光电二极管(微小,有3条腿,模型未知)
原型的工作方式是,当没有光线并且有运动时,LED将打开。 否则,它会关闭。
我已经编写了代码来分别测试两个传感器,它工作得很好。
当我合并2个代码时,我遇到了led输出的问题。 它如下所示:
// 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;
}
}
}
我提前感谢您的帮助。 请帮忙。 谢谢。
答案 0 :(得分:1)
你声明变量i但是然后不将它初始化为一个值(我不认为C编译器将它初始化为0,我不确定)。如果情况并非如此,那么想象下面的场景:,在第一个执行开始时: 它是(!light)和(!sensor),它开始比较i> 0或i&lt; = 0但我最初是什么?
你只假设if(传感器)主体已经执行了至少一次以给我一个初始值。我不知道你的程序要求或流程的细节,但我认为这是一个不安全和隐藏的错误。
答案 1 :(得分:1)
虽然我不是PIC micro的专家,但我想知道你用来访问RAx和RBx的方法是否合适,即“led = 0”,而不是“led&amp; =〜(1&lt; &lt; led)“或类似的东西。
您似乎也没有初始化“int i”变量,我认为该变量会导致if语句出现问题。
最好的问候。
答案 2 :(得分:0)
如下:
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;
}
}
答案 3 :(得分:0)
当我使用汇编语言处理pic24系列时,如果我需要连续分配2个端口,结果证明第二个分配不起作用(除非你使用三态缓冲区......我不知道确切的原因,但情况就是这样......)。无论如何......我想说的是,在每个led值赋值后,尝试给出几毫秒的延迟,如:
for(i=5;i>0;i--)
{
led2=0;
_delay_ms(50);
led=1;
__delay_ms(10000);
}