打印

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

[复制链接]
387|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
llia|  楼主 | 2020-9-10 21:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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
     }
}

使用特权

评论回复
沙发
hanwe| | 2020-9-10 21:28 | 只看该作者

将while(1)放在Delay_ms(10000),后面可以吗?是否开通看门狗功能呢

使用特权

评论回复
板凳
wangzsa| | 2020-9-10 21:32 | 只看该作者
只需设置一个标志位就可以了..

使用特权

评论回复
地板
huwr| | 2020-9-10 21:36 | 只看该作者

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

使用特权

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

使用特权

评论回复
6
yufe| | 2020-9-10 21:54 | 只看该作者

while(1)
     {
      P1=0xff;               
     }        
就可以了。谢谢!

使用特权

评论回复
7
wangpe| | 2020-9-10 21:58 | 只看该作者
首先定义一个静态变量默认赋值为0,执行一次就把这个变量置1,下次判断这个变量为1跳过就可以了

使用特权

评论回复
8
langgq| | 2020-9-10 22:01 | 只看该作者
主程序不加while(1) 当程序执行完成以后,会自动跳转到最初的位置开始再执行  类似于复位

使用特权

评论回复
9
wangzsa| | 2020-9-10 22:04 | 只看该作者

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

使用特权

评论回复
10
zhanglli| | 2020-9-10 22:12 | 只看该作者
使用break可以跳出终止循环。。

使用特权

评论回复
11
llia|  楼主 | 2020-9-10 22:15 | 只看该作者
唉,还是没有什么结果,算了,多谢大家啦

使用特权

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

本版积分规则

961

主题

8893

帖子

4

粉丝