找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3974|回复: 21
收起左侧

有关单片机c语言一直弄不懂的三个问题,望赐教

  [复制链接]
ID:86913 发表于 2017-9-1 16:50 | 显示全部楼层 |阅读模式
请教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. }
复制代码
回复

使用道具 举报

ID:230544 发表于 2017-9-3 15:18 | 显示全部楼层
第一个,加不加的确它都会循环,这个实验我也做过,其实加while循环是为了减小单片机出错的概率,貌似书本上都是这么说
第二, 有两种方法可以搞定你说的,软件实现,在单片机完成既定任务,可以让他一直while循环,死在循环里就好了。硬件实现,用个继电器,继电器线圈俩开关,一个是按下弹起开关,另一个用单片机引脚接通当开关,两者并联,继电器常闭又控制单片机电源,单片机完成任务后,当做开关的引脚置零,继电器不吸合就停止工作了

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:81352 发表于 2017-9-3 12:07 | 显示全部楼层
void main()
回复

使用道具 举报

ID:81352 发表于 2017-9-3 12:11 | 显示全部楼层
将while(1)放在Delay_ms(10000),后面可以吗?是否开通看门狗功能呢?

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:230743 发表于 2017-9-3 21:18 | 显示全部楼层
只需设置一个标志位就可以了,执行一次就置1或置0,看自己习惯来
,并将一个线圈得电并维持。
回复

使用道具 举报

ID:97438 发表于 2017-9-5 17:02 | 显示全部楼层
我说说第一个吧,不加while(1),不做其他死循环的话,看起来也会循环,但是这属于未定义操作,属于不按要求来,出了问题不能怪人。
回复

使用道具 举报

ID:86913 发表于 2017-9-11 20:20 | 显示全部楼层
黑暗人才 发表于 2017-9-3 15:18
第一个,加不加的确它都会循环,这个实验我也做过,其实加while循环是为了减小单片机出错的概率,貌似书本 ...

感谢“黑暗人才”,为我提供了思路,照您的办法做,对的。只要在后面加上       
while(1)
     {
      P1=0xff;               
     }       
就可以了。谢谢!
回复

使用道具 举报

ID:86913 发表于 2017-9-11 20:22 | 显示全部楼层
zhangda1230 发表于 2017-9-3 21:18
只需设置一个标志位就可以了,执行一次就置1或置0,看自己习惯来
,并将一个线圈得电并维持。

谢谢您的指导!
回复

使用道具 举报

ID:233455 发表于 2017-9-16 11:17 | 显示全部楼层
首先定义一个静态变量默认赋值为0,执行一次就把这个变量置1,下次判断这个变量为1跳过就可以了
回复

使用道具 举报

ID:203840 发表于 2017-9-16 16:21 | 显示全部楼层
主程序不加while(1) 当程序执行完成以后,会自动跳转到最初的位置开始再执行  类似于复位
回复

使用道具 举报

ID:187532 发表于 2017-9-16 17:53 | 显示全部楼层
第一,加上while(1)可以防止程序跑飞,造成单片机错误。做流水灯实验时必须有while(1)不然如何循环。
第二,只循环一次的话在程序末尾加上while(1);
回复

使用道具 举报

ID:233530 发表于 2017-9-16 19:47 | 显示全部楼层
break可以跳出终止循环
回复

使用道具 举报

ID:233571 发表于 2017-9-16 22:27 | 显示全部楼层
我是来学习的。
回复

使用道具 举报

ID:86913 发表于 2018-2-25 11:53 | 显示全部楼层
多谢楼上各位热心的朋友,通过您们的帮助,我又增长了相关知识。
回复

使用道具 举报

ID:285408 发表于 2018-2-25 15:43 | 显示全部楼层
1、有的跟编译软件有关系,如果你没加上,他会帮你加上
回复

使用道具 举报

ID:285412 发表于 2018-2-25 16:53 | 显示全部楼层
我也是来学习的~
回复

使用道具 举报

ID:285545 发表于 2018-3-1 11:41 | 显示全部楼层
1,不用 while() 的话,总感觉很容易跑偏,。毕竟默认都加的。
2,只运行一次比较好办,一般都是用标志位,但是停机。停机是断电?休眠?还是死循环?
{断电,这可能要借助外部电控装置进行,软件好像不能直接关机。
休眠,很多单片机是可以的。
死循环,就更简单了。
}
3,要用到一定的自锁设计。比如,自锁开关,将单片机的电源串入常闭,线圈串入常开,单片机动作,激活自锁开关,这样单片机断电了,线圈通电了。最好单片机并接个大电容,延迟下断电。
回复

使用道具 举报

ID:279601 发表于 2018-3-2 13:09 | 显示全部楼层
1,看你用的哪款单片机把,STC单片机本身是自带循环的,你不加While(1),他也会循环,单循环是主函数整个循环;2如果只要循环一次,方法比较多,例如在函数最后一句加上一句while(1);语句,让他执行一次后陷入while(1)死循环,也可设置个脚,例如sbit tingzhi=P1^1;默认设置为低状态,最后一句加上while(tingzhi==0);这样也会停在这,而且你拉高该引脚时,会跳出循环重新开始;3想让点击不转,停止给脉冲就行了
回复

使用道具 举报

ID:260290 发表于 2018-3-2 15:29 | 显示全部楼层
多谢楼上各位热心的朋友,通过您们的帮助,我又增长了相关知识。
回复

使用道具 举报

ID:284007 发表于 2018-3-4 12:48 | 显示全部楼层
因为你想啊你本来可以容纳100行程序可实际的只要50行那么当运行完50行后地51行就不是自己想要运行的了,而是不确定的未知内容,一旦执行下去程序就会出错,从而导致单片机自动复位,所以通常在程序中加入一个死循环,让程序不要乱运行
回复

使用道具 举报

ID:287444 发表于 2018-3-4 15:05 | 显示全部楼层

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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