小菜苗 发表于 2022-11-11 12:06
|
小菜苗 发表于 2022-11-11 12:06 你把 if(Sensor2==0)Flash2 = 1; if(Sensor3==0)Flash3 = 1; if(Sensor4==0)Flash4 = 1; 一层一层套进去不就好了吗,只有1触发,灯1亮,1触发的前提下,2再触发灯2亮, |
lkc8210 发表于 2022-11-9 22:40 哈喽,你可不可以帮我看一下,我的那个最后程序,现在传感器2.3.4触发,灯234也会亮,我的设计初衷是只有1亮了,2才能亮,12亮了3才能亮,123亮了4才能亮,指导一下呗 |
|
#include<reg51.h> typedef unsigned char u8; typedef unsigned int u16; typedef unsigned long u32; sbit S1=P3^6; sbit S2=P3^7; sbit Sensor1 = P2^0; sbit Sensor2 = P2^1; sbit Sensor3 = P2^2; sbit Sensor4 = P2^3; sbit LED1=P1^0; sbit LED2=P1^1; sbit LED3=P1^2; sbit LED4=P1^3; void Delay1ms() { unsigned char i,j; i=2; j=239; do { while(--j); } while(--i); } void main(void) { u16 DelayCnt = 0; bit Flash1 = 0,Flash2 = 0, Flash3 = 0,Flash4 = 0, Start = 0; while(1) { if(S1==0) { Start = 1; Flash1 = 0; Flash2 = 0; Flash3 = 0; Flash4 = 0; } if(S2==0) { Start = 0; DelayCnt = 0; Flash1 = 0; Flash2 = 0; Flash3 = 0; Flash4 = 0; LED1=1; LED2=1; LED3=1; LED4=1; } if(Sensor1==0)Flash1 = 1; if(Sensor2==0)Flash2 = 1; if(Sensor3==0)Flash3 = 1; if(Sensor4==0)Flash4 = 1; if(Start) { if(DelayCnt++>=1000) { DelayCnt = 0; if(Flash1==0) LED1=!LED1; else LED1=0; if(Flash1==1) { DelayCnt = 0; if(Flash2==0) LED2=!LED2; else LED2=0; if(Flash2==1) { DelayCnt = 0; if(Flash3==0) LED3=!LED3; else LED3=0; if(Flash3==1) { DelayCnt = 0; if(Flash4==0) LED4=!LED4; else LED4=0; } } } } } Delay1ms(); } }感谢大佬们的不吝指导,虽有艰难但也完成,感谢 ![]() |
小菜苗 发表于 2022-11-10 20:31 大佬是我自己搞错了定义的端口啦, |
lkc8210 发表于 2022-11-10 17:52 之前的代码我感觉都不能实现功能 |
| 可以研究一下,谢谢楼主 |
Longan.Wang 发表于 2022-11-10 13:48 下面有要求更加全一些的,这是我自己想的,不是很全面,谢谢大哥提意见 |
Longan.Wang 发表于 2022-11-10 13:48 就是不晓得怎么去搞 |
| 这个方案可以使用定时器,在定时中断程序里翻转四根IO引脚产生四路闪烁信号,使用外部中断接收四个传感器输入信号,在外部中断程序里对相应IO引脚是否翻转置失能标志,定时中断程序里检测到该标志则停止翻转相应IO引脚,并置高电平。当四个标志都置位时,停止定时器。当再检测到输入信号时,开启定时器。 |
| 这个方案可以使用一个定时器根据指置时间间隔来翻转四根引脚,产生四路闪烁信号,使用四个外部中断接入四个传感器触发信号,在外部中断程序里置对应引脚停止翻转标志,定时中断里根据停止翻转标志来停止翻转引脚,并置相应引脚高电平。当四个停止翻转标志都置位时,定时器停止运行,再次检测到启动信号,再开启定时器的运行。 |
大漠落日 发表于 2022-11-10 12:20 对于你们大佬来说简单,我们小白就难了呀,大佬能指导一下程序怎么改么 |
|
说实话,你的需求都没有表述清楚! 还有,你程序初始化部分都没有。 |
| 这个一样的,按照顺序控制进行,开关1触发后,写灯1标志位,允许灯1进入工作态,用闪烁信号与传感器触发信号来控制灯1,灯1常亮标志允许灯2进入工作态,依次类推,不是很难 |
lkc8210 发表于 2022-11-9 22:40 如果我是开关1按下,灯1闪烁,传感器1触发灯1常亮,灯1常亮以后灯2闪烁,传感器2触发灯2常亮,灯2常亮以后灯3闪烁,传感器3触发灯3常亮,灯3常亮以后灯4闪烁,传感器4触发灯4常亮。所有灯都常亮后停止运行等待下一次启动,开关2还是急停作用。这个应该用什么方法去实现呢 |
| 这个方案应该采用一个定时器产生闪烁信号,按键由于只检测触发,所以不用采用按键延时方法处理。检测到按键后,产生一个标志,再判断标志去检测传感器,传感器信号置位一个标志,该标志与闪烁信号进行位运算产生最终位标志,驱动LED,当四路传感器标志全为1时,清除LED指示灯及传感器标志位,返回停止状态 |
| 大佬们可不可以用if ... else if ...else if...来实现呀 |
小菜苗 发表于 2022-11-10 10:17 基于我的代码加几个中大括号就行了 自己想一下 |