标题: 有关单片机c语言一直弄不懂的三个问题,望赐教 [打印本页]

作者: tmxk0574    时间: 2017-9-1 16:50
标题: 有关单片机c语言一直弄不懂的三个问题,望赐教
请教3个问题:(请看以下程序)

1、在主函数中,加while(1){ }和不加while(1){ }的问题,经实践试过,结果是一
样的,都是无限循环。那么可以不加while(1){ }吗?
2、如果不要循环,只要运行一次后停机,主函数该怎么写?
3、如果只要运行一次后停机,并且某个线圈继续通电,但电机不转(即把电机轴用电锁住不动)
,主函数又该怎么写?

*****
  1. #include <reg51.h>  //步进电机正反转运行程序
  2. #define uchar unsigned char
  3. #define uint  unsigned int
  4. uchar code up_data[8]={0xE,0xC,0xD,0x9,0xB,0x3,0x7,0x6}; //1相励磁正转表
  5. uchar code down_data[8]={0X6,0X7,0X3,0XB,0X9,0XD,0XC,0XE};//1相励磁反转表
  6.             
  7. /********以下是延时函数********/
  8. void Delay_ms(uint xms)                                
  9. {
  10.         uint i,j;
  11.         for(i=xms;i>0;i--)                          //i=xms即延时约xms毫秒
  12.                 for(j=110;j>0;j--);表   
  13. }
  14. /********以下是步进电机1相励磁法正转函数********/
  15. void  motor_up(uint n)
  16. {
  17.    uchar i;
  18.    uint  j;
  19.    for (j=0; j<509*n; j++)            //正转1圈
  20.     {
  21.      for (i=0; i<8; i++)     
  22.        {
  23.                P1 = up_data[i];         
  24.         Delay_ms(4);        
  25.        }
  26.     }
  27. }
  28. /********步进电机1相励磁法反转函数********/
  29. void  motor_down(uint n)
  30. {
  31.     uchar i;
  32.     uint  j;
  33.     for (j=0; j<509*n; j++)    //反转1圈               
  34.      {
  35.       for (i=0; i<8; i++)            
  36.        {
  37.                P1 = down_data[i];   
  38.         Delay_ms(4);            
  39.        }
  40.      }
  41. }
  42. /********以下是主函数********/
  43. void main()
  44. {     
  45.    while(1)           //此语句有或无效果都一样!
  46.      {
  47.        motor_up(1);                  //电机正转1圈
  48.        P1=0xff;                        //电机停转
  49.        Delay_ms(4000);          //换向延时为4s
  50.        motor_down(1);           //电机反转1圈
  51.        P1=0x00;                        //电机停转
  52.        Delay_ms(4000);          //换向延时为4s
  53.        P1=0xff;                        //电机停转        
  54.        Delay_ms(10000);         //换向延时为10s
  55.      }
  56. }
复制代码

作者: feng_67107023    时间: 2017-9-3 12:07
void main()
作者: feng_67107023    时间: 2017-9-3 12:11
将while(1)放在Delay_ms(10000),后面可以吗?是否开通看门狗功能呢?
作者: 黑暗人才    时间: 2017-9-3 15:18
第一个,加不加的确它都会循环,这个实验我也做过,其实加while循环是为了减小单片机出错的概率,貌似书本上都是这么说
第二, 有两种方法可以搞定你说的,软件实现,在单片机完成既定任务,可以让他一直while循环,死在循环里就好了。硬件实现,用个继电器,继电器线圈俩开关,一个是按下弹起开关,另一个用单片机引脚接通当开关,两者并联,继电器常闭又控制单片机电源,单片机完成任务后,当做开关的引脚置零,继电器不吸合就停止工作了
作者: zhangda1230    时间: 2017-9-3 21:18
只需设置一个标志位就可以了,执行一次就置1或置0,看自己习惯来
,并将一个线圈得电并维持。
作者: luoluoluo136    时间: 2017-9-5 17:02
我说说第一个吧,不加while(1),不做其他死循环的话,看起来也会循环,但是这属于未定义操作,属于不按要求来,出了问题不能怪人。
作者: tmxk0574    时间: 2017-9-11 20:20
黑暗人才 发表于 2017-9-3 15:18
第一个,加不加的确它都会循环,这个实验我也做过,其实加while循环是为了减小单片机出错的概率,貌似书本 ...

感谢“黑暗人才”,为我提供了思路,照您的办法做,对的。只要在后面加上       
while(1)
     {
      P1=0xff;               
     }       
就可以了。谢谢!
作者: tmxk0574    时间: 2017-9-11 20:22
zhangda1230 发表于 2017-9-3 21:18
只需设置一个标志位就可以了,执行一次就置1或置0,看自己习惯来
,并将一个线圈得电并维持。

谢谢您的指导!
作者: weidy99    时间: 2017-9-16 11:17
首先定义一个静态变量默认赋值为0,执行一次就把这个变量置1,下次判断这个变量为1跳过就可以了
作者: mioc    时间: 2017-9-16 16:21
主程序不加while(1) 当程序执行完成以后,会自动跳转到最初的位置开始再执行  类似于复位
作者: q1833605807    时间: 2017-9-16 17:53
第一,加上while(1)可以防止程序跑飞,造成单片机错误。做流水灯实验时必须有while(1)不然如何循环。
第二,只循环一次的话在程序末尾加上while(1);

作者: 1qaz2wsx!@    时间: 2017-9-16 19:47
break可以跳出终止循环
作者: 古文涛    时间: 2017-9-16 22:27
我是来学习的。
作者: tmxk0574    时间: 2018-2-25 11:53
多谢楼上各位热心的朋友,通过您们的帮助,我又增长了相关知识。
作者: 1440950423    时间: 2018-2-25 15:43
1、有的跟编译软件有关系,如果你没加上,他会帮你加上
作者: yww429    时间: 2018-2-25 16:53
我也是来学习的~
作者: sand_hunt    时间: 2018-3-1 11:41
1,不用 while() 的话,总感觉很容易跑偏,。毕竟默认都加的。
2,只运行一次比较好办,一般都是用标志位,但是停机。停机是断电?休眠?还是死循环?
{断电,这可能要借助外部电控装置进行,软件好像不能直接关机。
休眠,很多单片机是可以的。
死循环,就更简单了。
}
3,要用到一定的自锁设计。比如,自锁开关,将单片机的电源串入常闭,线圈串入常开,单片机动作,激活自锁开关,这样单片机断电了,线圈通电了。最好单片机并接个大电容,延迟下断电。
作者: Steven159    时间: 2018-3-2 13:09
1,看你用的哪款单片机把,STC单片机本身是自带循环的,你不加While(1),他也会循环,单循环是主函数整个循环;2如果只要循环一次,方法比较多,例如在函数最后一句加上一句while(1);语句,让他执行一次后陷入while(1)死循环,也可设置个脚,例如sbit tingzhi=P1^1;默认设置为低状态,最后一句加上while(tingzhi==0);这样也会停在这,而且你拉高该引脚时,会跳出循环重新开始;3想让点击不转,停止给脉冲就行了
作者: miracle-    时间: 2018-3-2 15:29
多谢楼上各位热心的朋友,通过您们的帮助,我又增长了相关知识。
作者: july0    时间: 2018-3-4 12:48
因为你想啊你本来可以容纳100行程序可实际的只要50行那么当运行完50行后地51行就不是自己想要运行的了,而是不确定的未知内容,一旦执行下去程序就会出错,从而导致单片机自动复位,所以通常在程序中加入一个死循环,让程序不要乱运行
作者: 1421380515    时间: 2018-3-4 15:05

只需设置一个标志位就可以了,执行一次就置1或置0,看自己习惯来
,并将一个线圈得电并维持。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1