打印
[51单片机]

while问题

[复制链接]
950|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wis98|  楼主 | 2015-3-4 19:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*****我有一个问题向你请教,我控制电机的正/反转和停止的程序当用了WHILE后,程序无法控制,不知何因,
当不用WHILE时则控制正常***/

/***************************正常程序****************************************/
void motor_deal_horizontal_a()   //        电机运行
{
                          
                if((m1_1>m3_3)&&(m1_1-m3_3)>ji_y)
                 {       
                         
                                                  y_a ;//电机反转
                                               
                                 
                                        
                       
                 }
                  else
                   if((m1_1<m3_3)&&(m3_3-m1_1)>ji_y)       
                        {         
                       
                                        y_b;//电机正转
                               
                       
                                               
                                }       
                       
                else
                        if(((m3_3-m1_1)||(m1_1-m3_3))<=ji_y)       
                           {       
                               
                               
                                                y_STOP;        //电机停止
                                               
                 }
                 
/***************************加上while后不正常程序****************************************/

void motor_deal_horizontal_a()   //        垂直电机运行
{
                          
                if((m1_1>m3_3)&&(m1_1-m3_3)>ji_y)
                 {       
                          Lock_y_a=1;
                                  while(Lock_y_a)
                                          {
                                                  y_a ;//电机反转
                                          if((m1_1>m3_3)&&(m1_1-m3_3)<ji_y)       
                                                  {
                                                  Lock_y_a=0; break;
                                                  }       
                                          }
                                        
                       
                 }
                  else
                   if((m1_1<m3_3)&&(m3_3-m1_1)>ji_y)       
                        {         
                                Lock_y_b=1;
                                while(Lock_y_b)
                                {
                                        y_b;//电机正转
                                        if((m1_1<m3_3)&&(m3_3-m1_1)<ji_y)
                                        {
                                                Lock_y_b=0; break;
                                        }       
                                }
                                               
                                }       
                       
                else
                        if(((m3_3-m1_1)||(m1_1-m3_3))<=ji_y)       
                           {       
                               
                                        off_y=1;
                                       
                                        while(off_y)
                                        {
                                                y_STOP;        //电机停止
                                               
                                                if(((m3_3-m1_1)||(m1_1-m3_3))>ji_y)
                                                {
                                                        off_y=0;
                                                        flag_horizontal_stop_a= 1;
                                                        flag_vertical_stop_a = 0;
                                                        break;
                                                }
                                        }
                                       
                               
                           
                    }
   
         }
/*************************************************************************/

#include <reg51.H>
sbit k1=P3^4;
sbit csbout=P1^0;                         //超声波发送
sbit csbint=P3^2;                         //超声波接收
sbit bg=P3^3;
#define LED P0
sbit LED1=P2^4; //LED控制
sbit LED2=P2^5; //LED控制
sbit LED3=P2^6; //LED控制
sbit bj=P2^0;//报警
#define csbc 0.0347

unsigned char cl,mqzd,csbs,csbds,buffer[3],xm1,xm2,xm0,jpjs;//显示标识
unsigned char convert[10]={0x18,0x7b,0x2c,0x29,0x4b,0x89,0x88,0x3b,0x08,0x09};//0~9段码
unsigned int s,t,i,xx,j,sj1,sj2,sj3,mqs,sx1;
                                 
void csbcj();
void delay(j);                                        //延时函数
void scanLED();                                        //显示函数
void timeToBuffer();                        //显示转换函数
void keyscan();
void k1cl();
void k2cl();
void k3cl();
void k4cl();
void offmsd();

void main()                                        //主函数
{
        EA=1;                                           //开中断
          TMOD=0x11;                                 //设定时器0为计数,设定时器1定时
        ET0=1;                                         //定时器0中断允许
        ET1=1;                                         //定时器1中断允许
        TH0=0x00;
        TL0=0x00;
        TH1=0x9E;
        TL1=0x57;
        csbds=0;
        csbout=1;
        cl=0;
        csbs=8;
        jpjs=0;
        sj1=50;/////////测试报警距离
        sj2=200;
        sj3=580;
        k4cl();
        TR1=1;                                 
        while(1)
          {
                keyscan();
                if(jpjs<1)
                {
                        csbcj();                //调用超声波测距程序
                        if(s>sj3)                //大于时显示“CCC”
                        {
                                buffer[2]=0xC6;         
                                buffer[1]=0xC6;         
                                buffer[0]=0xC6;         
                        }
                        else if(s<sj1)        //小于时显示“- - -”
                        {
                                buffer[2]=0xBF;         
                                buffer[1]=0xBF;         
                                buffer[0]=0xBF;
                        }
                        else timeToBuffer();         
                }
                else timeToBuffer();                //将值转换成LED段码
                offmsd();
                  scanLED();                        //显示函数
                if(s<sj1)
                bg=0;
                bg=1;
        }
}

void scanLED()                             //显示功能模块
{
        LED=buffer[0];
        LED3=0;
        delay(200);
        LED3=1;

        LED=buffer[1];
        LED2=0;
        delay(200);
        LED2=1;
         
        LED=buffer[2];
        LED1=0;
        delay(200);
        LED1=1;
}

void timeToBuffer()                    //转换段码功能模块
{
        xm0=s/100;         
        xm1=(s-100*xm0)/10;
        xm2=s-100*xm0-10*xm1;
        buffer[2]=convert[xm2];         
        buffer[1]=convert[xm1];
        buffer[0]=convert[xm0];
}

void delay(i)                                         
{
    while(--i);
}

void timer1int (void)  interrupt 3  using 2
{
        TH1=0x9E;
        TL1=0x57;
        csbds++;
        if(csbds>=40)
        {
                csbds=0;
                cl=1;
        }                 
}

void csbcj()
{
        if(cl==1)
        {
                   TR1=0;
                TH0=0x00;
                TL0=0x00;
                i=csbs;
                while(i--)
                {
                        csbout=!csbout;
                }
                TR0=1;                        
                   i=mqs;                                        //盲区
                while(i--)
                {
                }
                i=0;
                while(csbint)
                {
                        i++;
                        if(i>=4000)                        //上限值
                        csbint=0;
                }
                TR0=0;
                TH1=0x9E;
                TL1=0x57;
                t=TH0;
                t=t*256+TL0;
                t=t-29;                 
                s=t*csbc/2;
                TR1=1;
                cl=0;
                csbint=1;
//////////////////////////////////////////////////////////////////
                                if(s<=80)bj=0;
                                if(s>80)bj=1;
/////////////////////////////////////////////////////////////////
                if(s<sj1)
                {
                        if(csbs>6)
                        {
                                csbs=csbs-2;
                                sj1=40;
                        }
                        sj1=sj1+2;
                        k4cl();
                }
                else if(s>=sj3)
                {
                        if(csbs<32)
                        {
                                csbs=csbs+2;
                                sj1=sj1+10;
                                k4cl();
                        }
                }
        }
}

void keyscan()                                //健盘处理函数
{
        xx=0;
        if(k1!=1)                                        // 判断开关是否按下
        {
                delay(100);                                //延时去抖动
                if(k1!=1)                                        // 判断开关是否按下         
                {                 
                        while(!k1)
                        {
                                delay(25);         
                                xx++;
                        }
                        if(xx>1000)                 
                        {
                                jpjs++;
                                if(jpjs>3)
                                {
                                        k4cl();
                                        jpjs=0;
                                }
                        }
                        xx=0;
                        switch(jpjs)
                        {
                                case 1: k1cl();break;                 
                                case 2: k2cl();break;
                                case 3: k3cl();break;
                        }
                }
        }
}

void k1cl()
{
        sj1=sj1+1;
        if(sj1>100)
        sj1=50;
        s=sj1;
}
void k2cl()
{
        sj2=sj2+5;
        if(sj2>500)
        sj2=40;
        s=sj2;
}

void k3cl()
{
        sj3=sj3+10;
        if(sj3>600)
        sj3=600;
        s=sj3;
}

void k4cl()
{
        sx1=sj1-1;
        sx1=sx1/csbc;
        mqs=sx1/4.5;
}

void offmsd()                                                            //小时数十位为0判断模块
{
    if (buffer[0] == 0xC0)                                    //如果值为零时小数十位不显示
    buffer[0] = 0xFF;
}

相关帖子

沙发
chenyu988| | 2015-3-4 20:35 | 只看该作者
  if((m1_1>m3_3)&&(m1_1-m3_3)>ji_y)下怎么会运行到 if((m1_1>m3_3)&&(m1_1-m3_3)<ji_y) 中去?

使用特权

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

本版积分规则

2

主题

8

帖子

0

粉丝