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