打印

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

[复制链接]
430|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
llia|  楼主 | 2022-11-25 20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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
     }
}

使用特权

评论回复
沙发
zhanghqi| | 2022-11-25 20:36 | 只看该作者
将while(1)放在Delay_ms(10000),后面可以吗?是否开通看门狗功能呢

使用特权

评论回复
板凳
heweibig| | 2022-11-25 20:37 | 只看该作者
只需设置一个标志位就可以了..

使用特权

评论回复
地板
lizye| | 2022-11-25 20:40 | 只看该作者

执行一次就置1或置0,看自己习惯来
,并将一个线圈得电并维持。
更多操作

使用特权

评论回复
5
zhaoxqi| | 2022-11-25 20:42 | 只看该作者
我说说第一个吧,不加while(1),不做其他死循环的话,看起来也会循环,但是这属于未定义操作,属于不按要求来,出了问题不能怪人。

使用特权

评论回复
6
jlyuan| | 2022-11-25 20:44 | 只看该作者
while(1)
     {
      P1=0xff;               
     }        
就可以了。谢谢!

使用特权

评论回复
7
stly| | 2022-11-25 20:49 | 只看该作者
首先定义一个静态变量默认赋值为0,执行一次就把这个变量置1,下次判断这个变量为1跳过就可以了

使用特权

评论回复
8
llljh| | 2022-11-25 20:56 | 只看该作者
主程序不加while(1) 当程序执行完成以后,会自动跳转到最初的位置开始再执行  类似于复位

使用特权

评论回复
9
dengdc| | 2022-11-25 20:58 | 只看该作者

第一,加上while(1)可以防止程序跑飞,造成单片机错误。做流水灯实验时必须有while(1)不然如何循环。
第二,只循环一次的话在程序末尾加上while(1)

使用特权

评论回复
10
tian111| | 2022-11-25 21:00 | 只看该作者
使用break可以跳出终止循环。。

使用特权

评论回复
11
zhanghqi| | 2022-11-25 21:01 | 只看该作者
这是基础的,别着急慢慢体会差别

使用特权

评论回复
12
bqyj| | 2022-11-25 21:03 | 只看该作者
多写写程序就好了,

使用特权

评论回复
13
stly| | 2022-11-25 21:05 | 只看该作者
不能光看

使用特权

评论回复
14
llia|  楼主 | 2022-11-25 21:07 | 只看该作者
唉,还是没有什么结果,算了,多谢大家啦

使用特权

评论回复
15
LOVEEVER| | 2022-11-26 19:18 | 只看该作者
你这个逻辑就不正确,你程序上只写了正反转,根本不会听下来,启动停止需要条件触发,你都没有条件怎么停止,可以设置标志位进行停止触发

使用特权

评论回复
16
jf101| | 2023-7-25 13:17 | 只看该作者
针对第一个问题其实是不加while循坏其实是可以的

使用特权

评论回复
17
AdaMaYun| | 2023-7-26 13:04 | 只看该作者
单片机运行机制貌似不可以只运行一次吧

使用特权

评论回复
18
星辰大海不退缩| | 2023-7-26 14:37 | 只看该作者
还是要加上的,不可能就做简单程序,防止跑飞

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

961

主题

8893

帖子

4

粉丝