微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 8路报警输入(请高手指点)

8路报警输入(请高手指点)

时间:10-02 整理:3721RD 点击:
这是简单的8路报警程序,但是来一路报警时,另一路报警再来时就输出不了。是不是就是里面while(1)惹得祸?
还有就是想请大神把帮忙指导有数组怎么输入8路报警信号(P1)口输入。谢谢
void alarm()
{
if(P1_0==0)
{
    delayms(200);
      if(P1_0==0);
       {
          while(1)
                  {
                    P0_0=0;
            delayms(200);
            P0_0=1;
            delayms(200);
                  }
       }
}
if(P1_1==0)
{
   delayms(200);
     if(P1_1==0);
      {
         while(1)
                  {
                    P0_1=0;
            delayms(200);
            P0_1=1;
            delayms(200);
                  }
      }
}
if(P1_2==0)
{
  delayms(200);
    if(P1_2==0);
     {
                while(1)
                {
                  P0_2=0;
          delayms(200);
          P0_2=1;
          delayms(200);
                }
     }
}
if(P1_3==0)
{
  delayms(200);
    if(P1_3==0);
     {
           while(1)
           {
             P0_3=0;
         delayms(200);
         P0_3=1;
         delayms(200);
           }
     }
}
if(P1_4==0)
{
  delayms(200);
    if(P1_4==0);
     {
           while(1)
            {
          P0_4=0;
          delayms(200);
          P0_4=1;
          delayms(200);
                }
     }
}
if(P1_5==0)
{
  delayms(200);
    if(P1_5==0);
     {
         while(1)
           {
        P0_5=0;
        delayms(200);
        P0_5=1;
        delayms(200);
           }
     }
}
if(P1_6==0)
{
  delayms(200);
    if(P1_6==0);
     {
         while(1)
          {
        P0_6=0;
        delayms(200);
        P0_6=1;
        delayms(200);
          }
     }
}
if(P1_7==0)
{
  delayms(200);
    if(P1_7==0);
     {
         while(1)
           {
         P0_7=0;
         delayms(200);
         P0_7=1;
         delayms(200);
           }
     }
}
}
void main
{
while(1)
{
   alarm();
}
}

你自己都已经发现了问题,不去改改试下。

当来第一次报警时,程序就在while里面死循环,就算有其他的信号来,也无法执行,一直在执行第一次报警while,将子程序里面的while去掉

我都试过了,将子程序里面的while去掉怎么让来报警的灯闪烁啊?还有就是我觉得这样写太麻烦,能不能用数组的方法写。我试过但是都行不通,初学这个东西,自己独立编还是有挑战的。希望能帮忙一下。谢谢

在试。搞得我头都大了。去掉可以但是不知道怎么使它闪烁。

用一个定时器,定时器里面判断,定时器中断里面进行判断引脚,然后取反

不错了 学习了

void Init_Timer0(void)
{
TMOD |= 0x01;                               
//TH0=0x00;          
//TL0=0x00;
EA=1;         
ET0=1;           
TR0=1;         
}
main()
{
Init_Timer0();
while(1);
}

void Timer0_isr(void) interrupt 1 using 1
{
static unsigned char i;
TH0=(65536-10000)/256;                  //定时10ms
TL0=(65536-10000)%256;      
i++;
if(i==20)//时间200ms
{
   i=0;
if(P1_1==0)
{
   P0_1=~P0_1;
}
  }
}

首先谢谢你的回复。你的方法我试了一下。它只会常亮不能闪烁。

不会的,定时器里面的 P0_1=~P0_1;,就是单个引脚取反的,你把if(i==20)//时间200ms时间,调大一些,20改成200试试,如果还是不行,把你下载的程序粘贴出来看看

我试过可行,不知道是不是你需要的。
#include<reg51.h>
unsigned char X;
void delayms1(unsigned int x)
{
        unsigned char i;
        while(x--)for(i=0;i<=120;i++);
}
void main()
{
        while(1)
        {
                 
                X=P0;
                if(X<255)
                {
                        
                        P1=P0;
                        delayms1(1000);
                        P1=0XFF;
                        delayms1(1000);
                        P1=P0;
                }
                else
                {
                        P1=0XFF;
                }
        }
}

我看错了,可以不好意思。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top