找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2287|回复: 19
收起左侧

单片机while循环程序问题

  [复制链接]
ID:414469 发表于 2020-3-6 10:11 | 显示全部楼层 |阅读模式
0.jpg
想要的运行模式: S1接通LED 亮并延时一定时间后不管S1是否接通都熄灭.然后等S1打开后再合上,重复上一次的程序.
目 前是只要S1还是接通,LED就会自动循环闲烁. 如何让程序只运行一次,停下? 我有在尾部加BREAK也不行.改while 的位置也不行.
求指点. 拜谢!
回复

使用道具 举报

ID:487821 发表于 2020-3-6 13:53 | 显示全部楼层
if(!s1)
      {
      delay(5);
      if(s1==1)
      {
              led=1;
              delay(50)
              led=0;
      }
     }
//不知道你的电路是怎么样的,点亮灯应该是=0的,
回复

使用道具 举报

ID:213173 发表于 2020-3-6 14:02 | 显示全部楼层
要增加松手识别才能做到只运行一次就停下。
回复

使用道具 举报

ID:316880 发表于 2020-3-6 14:39 | 显示全部楼层
用标志位就可以了
回复

使用道具 举报

ID:316880 发表于 2020-3-6 14:56 | 显示全部楼层
本帖最后由 余生不负 于 2020-3-6 18:25 编辑

用标志位就可以了,或者声名一个寄存器比如

char  a; //全局的

void  main()
{

   while(1)
   {
        if(s1==0)    a = 1;
        else      a = 0;

         if(a==1)
         {
           led点亮
         delay(50);
           led息灭
          a = 0;
         }

   }
}

按一下放开也是是就亮一会就灭,一直按着也是亮一会就灭
回复

使用道具 举报

ID:560467 发表于 2020-3-6 16:08 | 显示全部楼层
你可以采用中断,s1接通一次led闪烁一次
回复

使用道具 举报

ID:170892 发表于 2020-3-6 16:14 | 显示全部楼层
只运行一次停下的话,在主函数末尾加个while(1);,然后再
delay(50);led=0; (这里加个break;)。
回复

使用道具 举报

ID:282850 发表于 2020-3-6 17:09 | 显示全部楼层
让程序只运行一次,就停下。最简单的是//while(1)。或者把while删除就行了,只是程序没有实用意义的。
另一方法:
delay(50);
LED=0;
delay(5000);     //加上一个锁定时间
回复

使用道具 举报

ID:687694 发表于 2020-3-6 17:34 | 显示全部楼层
基于状态控制的编程,添加标志位这是走向高阶的路,
也有简单的办法
在led=0;}后面增加一句while(s==1);即可实现。但是这种办法会阻塞CPU一只在这看你松手没有。
回复

使用道具 举报

ID:437615 发表于 2020-3-6 20:19 来自手机 | 显示全部楼层
在最后的LED=0下面加一个松手检测
回复

使用道具 举报

ID:414469 发表于 2020-3-9 15:35 | 显示全部楼层
謝謝大家的指點.有好多沒學過的方法.我會一一實驗消化.  感激!!
回复

使用道具 举报

ID:414469 发表于 2020-3-9 15:37 | 显示全部楼层
余生不负 发表于 2020-3-6 14:56
用标志位就可以了,或者声名一个寄存器比如

char  a; //全局的

這個方法 第一次見,學習了。 謝謝
回复

使用道具 举报

ID:311419 发表于 2020-3-15 02:44 | 显示全部楼层
S1未置0状态,单片机上电或者复位应该都是高电平状态1,另外if()后需要加{}
回复

使用道具 举报

ID:214276 发表于 2020-3-27 21:53 | 显示全部楼层
我也有类似的问题,比如用了while(1)给了一个LED灯做循环,后就不能用while(1)给另一个LED灯做循环了。
回复

使用道具 举报

ID:87166 发表于 2020-3-27 21:59 | 显示全部楼层
chinarenxx 发表于 2020-3-27 21:53
我也有类似的问题,比如用了while(1)给了一个LED灯做循环,后就不能用while(1)给另一个LED灯做循环了。

while(1)程序就循环了,你还想干嘛
回复

使用道具 举报

ID:468209 发表于 2020-3-27 22:28 来自手机 | 显示全部楼层
S1==1 写不写都没意义 因为除P0外所以IO口默认都是等于1的  应该写if(S1==0)
回复

使用道具 举报

ID:468209 发表于 2020-3-27 22:51 | 显示全部楼层
如果你只想 按键开灯关灯的话  

if(S1==0)  //判断按键是否按下
{
   delay(50);//按键消抖延时
   if(S1==0)//如果真的按下
   {
       led=~led; 按一下开 再按一下关 反复操作
   }
   while(!S1);//判断按键是否松开
}

按键的俩个引脚 一头接单片机 还有一头接负GND 即可
回复

使用道具 举报

ID:715816 发表于 2020-3-28 10:03 | 显示全部楼层
加一个标志位即可
回复

使用道具 举报

ID:707815 发表于 2020-3-28 15:25 | 显示全部楼层
if(s1==1)
回复

使用道具 举报

ID:707815 发表于 2020-3-28 15:44 | 显示全部楼层
按你的逻辑,不是靠一个BREAK就能解决的,你上面的代码只实现了,你的第一个功能,S1接通后LED灯只亮一次,后面的东西,你都用了多少个判断语句,那么在编程逻辑上,肯定不是靠一句代码就能实现的,你可以加编制为也行,或者就在后面写一个循环也行,等S1打开后跳出,如:while(1){}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表