[STM32F1] 求助if语句的一点困惑

[复制链接]
4382|52
changle11sdo5 发表于 2016-8-12 19:55 来自手机 | 显示全部楼层
好像明白了你意思,你是想进入延时后,中断里修改C值,然后跳出延时?
皈依 发表于 2016-8-12 19:56 | 显示全部楼层
当执行延时的时候条件变为假的话要等延时结束后再跳出的
直接跳出的话可以改变延时条件或者GO to 或者break 具体要看你的延时是怎么实现的
changle11sdo5 发表于 2016-8-12 20:00 来自手机 | 显示全部楼层
if(C!=1)break; 也可以跳出循环
changle11sdo5 发表于 2016-8-12 20:05 来自手机 | 显示全部楼层
另外,在中断里也可以直接把延时代码那些值装满,然后延时就马上结束了
编程小菜 发表于 2016-8-12 21:48 | 显示全部楼层
设置个标志位,标志位为1时,给延时函数置零,自然就退出延时函数啦。
bbapple 发表于 2016-8-13 09:20 | 显示全部楼层
这个应该就是最简单的延时函数吧,不明白楼主想表达的是什么意思呢
 楼主| 梦娇 发表于 2016-8-13 09:21 | 显示全部楼层
ianhom 发表于 2016-8-12 19:27
int D = 100000;
while((C==1)&&(D > 0))
{

谢谢额
 楼主| 梦娇 发表于 2016-8-13 09:22 | 显示全部楼层
changle11sdo5 发表于 2016-8-12 19:50
只有C值是1时,才会延时100秒,是不是其它代码有问题,另外注意电机有惯性,还会干扰单片机… ...

谢谢啊 那给电机两端并联个2极管能消除干扰不 呢  
soulmist 发表于 2016-8-13 09:23 | 显示全部楼层
其实这个问题没那么麻烦,单片机CPU一个时间只能执行一件事,但是因为ta执行速度很快 所以感觉这些都是在同步执行 。但是程序都是顺序执行的,因此在执行延时函数这段时间,CPU实际上之做一些空操作,因为延时的比较久所以还未执行到检测语句,即使状态发生变化,也是没有响应的,如果要在延时过程中想要随时退出这样就要改变程序的结构了,实际应用中是不建议使用这种延时的。
 楼主| 梦娇 发表于 2016-8-13 09:29 | 显示全部楼层
changle11sdo5 发表于 2016-8-12 19:55
好像明白了你意思,你是想进入延时后,中断里修改C值,然后跳出延时?

对 对 是的啊  现在就是C值改变条件为假了。不能直接跳出延时,必须要等延时结束才能跳出
handleMessage 发表于 2016-8-13 09:29 | 显示全部楼层
C==1 的条件是什么呀??
 楼主| 梦娇 发表于 2016-8-13 09:32 | 显示全部楼层
changle11sdo5 发表于 2016-8-12 19:55
好像明白了你意思,你是想进入延时后,中断里修改C值,然后跳出延时?

对 对 是啊 现在就是C的值改变条件为假,要等延时结束才能跳出,
 楼主| 梦娇 发表于 2016-8-13 09:32 | 显示全部楼层
皈依 发表于 2016-8-12 19:56
当执行延时的时候条件变为假的话要等延时结束后再跳出的
直接跳出的话可以改变延时条件或者GO to 或者break ...

不太懂,不过还是谢谢你啊
 楼主| 梦娇 发表于 2016-8-13 09:33 | 显示全部楼层
changle11sdo5 发表于 2016-8-12 20:00
if(C!=1)break; 也可以跳出循环

谢谢啊 我试下
 楼主| 梦娇 发表于 2016-8-13 09:34 | 显示全部楼层
changle11sdo5 发表于 2016-8-12 20:05
另外,在中断里也可以直接把延时代码那些值装满,然后延时就马上结束了

谢谢啊
 楼主| 梦娇 发表于 2016-8-13 09:37 | 显示全部楼层
编程小菜 发表于 2016-8-12 21:48
设置个标志位,标志位为1时,给延时函数置零,自然就退出延时函数啦。

谢了
 楼主| 梦娇 发表于 2016-8-13 09:40 | 显示全部楼层
bbapple 发表于 2016-8-13 09:20
这个应该就是最简单的延时函数吧,不明白楼主想表达的是什么意思呢

if条件由真变为假,那个延时想让立马停掉跳出,可能是我太笨了表达不清楚,谢谢你
yzai 发表于 2016-8-13 14:16 | 显示全部楼层
delay()是个函数,指令进入if语句后如果进入了delay则肯定是执行完延时才能进行下一步,如果条件为假,则也得是延时执行完才能执行条件为假的语句,一句话根本不能及时跳出;要达到你要的结果,方法很多,最简单的方法就是拆分delay,将延迟的时间分为N个小延时,可以将if(xxxxxx)delay(10000)改为for(i=0;i<xx;i++){if(xxxxxx){delay(1);}else i=xx;},for循环全部执行完延迟效果等同于delay(10000),一旦if油价,则令i=xx,使for循环条件不成立即可跳出for循环,跳出延迟;另外的方法可以使用中断。
冰零分子 发表于 2016-8-13 15:38 | 显示全部楼层
changle11sdo5 发表于 2016-8-12 20:00
if(C!=1)break; 也可以跳出循环

她是要跳出延时。。。。。
cos12a 发表于 2016-8-13 16:00 来自手机 | 显示全部楼层
do{延时}while(C==1);这样试试。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部