为什么s2不起作用
时间:10-02
整理:3721RD
点击:
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit cq2 = P1^0; //控制前后运动的电磁阀
sbit cq1 = P1^1; //控制左右运动的下面电磁阀
sbit cq3 = P1^2; //控制上下运动的电磁阀
sbit cq4 = P1^3; //控制左右运动的上面电磁阀
sbit s1 = P1^4; //第一步按钮开关
sbit s2 = P1^5; //第二步按钮开关
sbit s3 = P1^6; //第三步按钮开关
sbit err = P1^7; //错误判断位
sbit err2 = P3^0;
sbit k1 = P3^3; //左右方向下面的磁感应开关
sbit k2 = P3^2; //左右方向上面的磁感应开关
sbit k3 = P3^1; //前后方向磁感应开关
#define OneStep 1 //第一步
#define TwoStep 2 //第二步
#define ThreeStep 3 //第三步
bit EnableTwoStepFlag = 0; //第二步工作允许标志
bit flag = 0; //定时时间标志
uint count = 0; //
uchar volatile Status = OneStep;
void Timer0Init()
{
TMOD = 0x21;
TH0 = 0xd8;
TL0 = 0xf0;
TR0 = 1;
ET0 = 1;
}
void Timer0()interrupt 1 using 1
{
TH0 = 0xd8;
TL0 = 0xf0;
TR0 = 1;
count++;
if(count==200)
{
count = 0;
flag = 1;
}
}
void WaitTime(uchar dat)
{
uchar i = 0;
for( i = 0;i<dat;i++)
{
while(flag == 0);
flag = 0;
}
}
void OneStepWork()
{
s1 = 1;
while(s1 == 1); //等待S1 =0,按钮1按下
s1 = 1;
cq1 = 0; //打开左右向下面电磁阀,推动气缸工作
k1 = 1;
while(k1 == 1); //等待左右向下面磁感应开关到位
k1 = 1;
cq2 = 0; //打开控制前后向电磁阀,推动前后气缸工作
k3 = 1;
while(k3 == 1)
{
_nop_(); //等待前后向磁感应开关到位。
}
k3 = 1;
cq3 = 0; //打开上下向电磁阀,推动气缸向下运动
WaitTime(3); //等待1分钟
err = 1;
err2 = 1;
if( err == 1 && err2 == 1) //判断错误表示. err=1正确,err=0错误
{
EnableTwoStepFlag = 1;
cq3 = 1;
WaitTime(2);
cq2 = 1;
}
else
{
cq3 = 1;
WaitTime(2);
cq2 = 1;
WaitTime(2);
cq1 = 1;
}
}
void TwoStepWork()
{
s2 = 1;
while(s2 == 1);
s2 = 1;
cq4 = 0;
k2 = 1;
while(k2 == 1);
k2 = 1;
}
void ThreeStepWork()
{
s3 = 1;
while(s3 == 1);
s3 = 1;
cq4 = 0;
WaitTime(1);
cq1 = 0;
}
void main()
{
Timer0Init();
EA = 1;
while(1)
{
switch(Status)
{
case OneStep:
OneStepWork();
if(EnableTwoStepFlag)
{
EnableTwoStepFlag = 0;
Status = TwoStep;
}
else
{
Status = OneStep;
}
break;
case TwoStep:
TwoStepWork();
Status = ThreeStep;
break;
case ThreeStep:
ThreeStepWork();
Status = OneStep;
break;
default:
break;
}
}
}
为什么按s2不起作用啊
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit cq2 = P1^0; //控制前后运动的电磁阀
sbit cq1 = P1^1; //控制左右运动的下面电磁阀
sbit cq3 = P1^2; //控制上下运动的电磁阀
sbit cq4 = P1^3; //控制左右运动的上面电磁阀
sbit s1 = P1^4; //第一步按钮开关
sbit s2 = P1^5; //第二步按钮开关
sbit s3 = P1^6; //第三步按钮开关
sbit err = P1^7; //错误判断位
sbit err2 = P3^0;
sbit k1 = P3^3; //左右方向下面的磁感应开关
sbit k2 = P3^2; //左右方向上面的磁感应开关
sbit k3 = P3^1; //前后方向磁感应开关
#define OneStep 1 //第一步
#define TwoStep 2 //第二步
#define ThreeStep 3 //第三步
bit EnableTwoStepFlag = 0; //第二步工作允许标志
bit flag = 0; //定时时间标志
uint count = 0; //
uchar volatile Status = OneStep;
void Timer0Init()
{
TMOD = 0x21;
TH0 = 0xd8;
TL0 = 0xf0;
TR0 = 1;
ET0 = 1;
}
void Timer0()interrupt 1 using 1
{
TH0 = 0xd8;
TL0 = 0xf0;
TR0 = 1;
count++;
if(count==200)
{
count = 0;
flag = 1;
}
}
void WaitTime(uchar dat)
{
uchar i = 0;
for( i = 0;i<dat;i++)
{
while(flag == 0);
flag = 0;
}
}
void OneStepWork()
{
s1 = 1;
while(s1 == 1); //等待S1 =0,按钮1按下
s1 = 1;
cq1 = 0; //打开左右向下面电磁阀,推动气缸工作
k1 = 1;
while(k1 == 1); //等待左右向下面磁感应开关到位
k1 = 1;
cq2 = 0; //打开控制前后向电磁阀,推动前后气缸工作
k3 = 1;
while(k3 == 1)
{
_nop_(); //等待前后向磁感应开关到位。
}
k3 = 1;
cq3 = 0; //打开上下向电磁阀,推动气缸向下运动
WaitTime(3); //等待1分钟
err = 1;
err2 = 1;
if( err == 1 && err2 == 1) //判断错误表示. err=1正确,err=0错误
{
EnableTwoStepFlag = 1;
cq3 = 1;
WaitTime(2);
cq2 = 1;
}
else
{
cq3 = 1;
WaitTime(2);
cq2 = 1;
WaitTime(2);
cq1 = 1;
}
}
void TwoStepWork()
{
s2 = 1;
while(s2 == 1);
s2 = 1;
cq4 = 0;
k2 = 1;
while(k2 == 1);
k2 = 1;
}
void ThreeStepWork()
{
s3 = 1;
while(s3 == 1);
s3 = 1;
cq4 = 0;
WaitTime(1);
cq1 = 0;
}
void main()
{
Timer0Init();
EA = 1;
while(1)
{
switch(Status)
{
case OneStep:
OneStepWork();
if(EnableTwoStepFlag)
{
EnableTwoStepFlag = 0;
Status = TwoStep;
}
else
{
Status = OneStep;
}
break;
case TwoStep:
TwoStepWork();
Status = ThreeStep;
break;
case ThreeStep:
ThreeStepWork();
Status = OneStep;
break;
default:
break;
}
}
}
为什么按s2不起作用啊
S2不起作用,是不起什么作用,应该怎么样的,把问题说清楚
s1按下第一步工作正常,s2键按下程序没反应,不能按照设想的那样进行第二步工作
程序运行后,只有S1键能工作,每次都执行到cq3=1,cq2 = 1,即err和err2同时为1这个状态,就不能再往下进行了。就是S2键按下永远不会执行TwoStepWork();
在case里面进不了第二个条件,err信号错误
程序修改不判断错误,还是进不了第二个条件。