[疑难问答] 有关单片机c语言一直弄不懂的三个问题

[复制链接]
 楼主| shashaa 发表于 2018-3-4 21:47 | 显示全部楼层 |阅读模式
1、在主函数中,加while(1){ }和不加while(1){ }的问题,经实践试过,结果是一
样的,都是无限循环。那么可以不加while(1){ }吗?
2、如果不要循环,只要运行一次后停机,主函数该怎么写?
3、如果只要运行一次后停机,并且某个线圈继续通电,但电机不转(即把电机轴用电锁住不动)
,主函数又该怎么写?

*****
#include <reg51.h>  //步进电机正反转运行程序
#define uchar unsigned char
#define uint  unsigned int
uchar code up_data[8]={0xE,0xC,0xD,0x9,0xB,0x3,0x7,0x6}; //1相励磁正转表
uchar code down_data[8]={0X6,0X7,0X3,0XB,0X9,0XD,0XC,0XE};//1相励磁反转表
            
/********以下是延时函数********/
void Delay_ms(uint xms)                                
{
        uint i,j;
        for(i=xms;i>0;i--)                          //i=xms即延时约xms毫秒
                for(j=110;j>0;j--);表   
}
/********以下是步进电机1相励磁**转函数********/
void  motor_up(uint n)
{
   uchar i;
   uint  j;
   for (j=0; j<509*n; j++)            //正转1圈
    {
     for (i=0; i<8; i++)     
       {
               P1 = up_data;         
        Delay_ms(4);        
       }
    }
}
/********步进电机1相励磁法反转函数********/
void  motor_down(uint n)
{
    uchar i;
    uint  j;
    for (j=0; j<509*n; j++)    //反转1圈               
     {
      for (i=0; i<8; i++)            
       {
               P1 = down_data;   
        Delay_ms(4);            
       }
     }
}
/********以下是主函数********/
void main()
{     
   while(1)           //此语句有或无效果都一样!
     {
       motor_up(1);                  //电机正转1圈
       P1=0xff;                        //电机停转
       Delay_ms(4000);          //换向延时为4s
       motor_down(1);           //电机反转1圈
       P1=0x00;                        //电机停转
       Delay_ms(4000);          //换向延时为4s
       P1=0xff;                        //电机停转        
       Delay_ms(10000);         //换向延时为10s
     }
}

qiangweii 发表于 2018-3-4 21:55 | 显示全部楼层

将while(1)放在Delay_ms(10000),后面可以吗?是否开通看门狗功能呢
litengg 发表于 2018-3-4 22:11 | 显示全部楼层
只需设置一个标志位就可以了..
androidbus 发表于 2018-3-4 22:16 | 显示全部楼层
执行一次就置1或置0,看自己习惯来
,并将一个线圈得电并维持。
feiqi1 发表于 2018-3-4 22:17 | 显示全部楼层
我说说第一个吧,不加while(1),不做其他死循环的话,看起来也会循环,但是这属于未定义操作,属于不按要求来,出了问题不能怪人。
xia00 发表于 2018-3-4 22:20 | 显示全部楼层
while(1)
     {
      P1=0xff;               
     }        
就可以了。谢谢!
hfdy01 发表于 2018-3-4 22:25 | 显示全部楼层
首先定义一个静态变量默认赋值为0,执行一次就把这个变量置1,下次判断这个变量为1跳过就可以了
CallReceiver 发表于 2018-3-4 22:29 | 显示全部楼层
主程序不加while(1) 当程序执行完成以后,会自动跳转到最初的位置开始再执行  类似于复位
boy1990 发表于 2018-3-4 22:43 | 显示全部楼层
第一,加上while(1)可以防止程序跑飞,造成单片机错误。做流水灯实验时必须有while(1)不然如何循环。
第二,只循环一次的话在程序末尾加上while(1)
sourceInsight 发表于 2018-3-4 22:47 | 显示全部楼层
使用break可以跳出终止循环。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

142

主题

1494

帖子

6

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