51单片机流水灯问题 本人写的程序 很多错误 求高人指点

while(1)
{
if(s1)
{
if(s2)
{
delay(40);
if(s2) //传感器s1 s2均未挡住 流水灯 同时数码管显示
{
while(s1&&s2)
for(a=0;a<14;a++)
{
P1=table1[a];
delay(1);
P0=table2[a];
dula=1;
dula=0;
P0=0xfe; //选中第一个数码管
wela=1;
wela=0;
delay(400);
}
}

}
else
P1=0xff; //挡住传感器s2 灯全灭
}

else //挡住s1 灯全亮
{
if(s2)
P1=0x00;
else // 同时挡住s1 s2 灯间隔闪烁
{
P1=0xaa;
delay(300);
P1=0x55;
delay(300);
}
}
}

下到单片机上的时候 就有流水灯 4种挡光方法都能实现 但是为什么每次都要一直挡着光直到它上一次的流水灯执行完以后才执行相应的程序 手放开后也要执行完那一段才执行不挡光的程序 求大神指教
另外求大神帮忙看看这段程序 当手划过传感器1到传感器2方向时,8盏灯从左到右点亮,时间间隔0.5秒
当手划过传感器2到传感器1方向时,8盏灯从右到左熄灭,时间间隔0.5秒
时间间隔通过键盘可设为1秒、1.5秒或2秒
满意有加分哦

第1个回答  2013-05-21
一旦进入流水灯实验后,不再判断传感器状态,也就无法退出流水程序了。

试试改改delay():
void delay(unsigned int i)
{
unsigned int j;
for(;i!=0;i--)
for(j=0;j<20;j++)
if((S2==0)||(S3==0))break;
}
第2个回答  2013-05-20

仿真实例 参考一下吧,比较一下看看

追问

谢谢 看了这个会了 能不能看下后面这个呢 要在之前的程序的基础上写 给你加分

当手划过传感器1到传感器2方向时,8盏灯从左到右点亮,时间间隔0.5秒
当手划过传感器2到传感器1方向时,8盏灯从右到左熄灭,时间间隔0.5秒
时间间隔通过键盘可设为1秒、1.5秒或2秒
要是手划的时间太慢它就不识别

追答

是这个问题吗
为什么每次都要一直挡着光直到它上一次的流水灯执行完以后才执行相应的程序 手放开后也要执行完那一段才执行不挡光的程序
这个 你可以在 相应的 循环里面 加一个 检测挡光 判断语句,
满足条件 或者 不满足条件 跳出 小循环,就可以。

追问

不是的 是这个
当手划过传感器1到传感器2方向时,8盏灯从左到右点亮,时间间隔0.5秒
当手划过传感器2到传感器1方向时,8盏灯从右到左熄灭,时间间隔0.5秒
时间间隔通过键盘可设为1秒、1.5秒或2秒
要是手划的时间太慢它就不识别
在之前的程序的基础上写

不是的 是这个
当手划过传感器1到传感器2方向时,8盏灯从左到右点亮,时间间隔0.5秒
当手划过传感器2到传感器1方向时,8盏灯从右到左熄灭,时间间隔0.5秒
时间间隔通过键盘可设为1秒、1.5秒或2秒
要是手划的时间太慢它就不识别
在之前的程序的基础上写
刚刚那个我看了你发了程序已经修改了 对的 按键按了之后它马上跳另外的循环去了 谢谢

追答

这个要下载到实际电路 试试

本回答被提问者采纳