| 
 
| /*****我有一个问题向你请教,我控制电机的正/反转和停止的程序当用了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;
 }
 | 
 |