8路报警输入(请高手指点)
还有就是想请大神把帮忙指导有数组怎么输入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;
}
}
}
我看错了,可以不好意思。