//实验目标:红外感应开关检测到物体,输出低电平,单片机检测到后,由步进电机转动到红外开关所处的位置
#include
sbit K1=P2^0;//红外感应开关4个
sbit K2=P2^1;
sbit K3=P2^2;
sbit K4=P2^3;
unsigned long i;
unsigned char cnt,new;
unsigned char old=0;
unsigned char code zhengzhuan[8]={0xe,0xc,0xd,0x9,0xb,0x3,0x7,0x6};
unsigned char code fanzhuan[8]={0x6,0x7,0x3,0xb,0x9,0xd,0xc,0xe};
void delay()
{i=20;
while(i--);}
void zhengzhuan1024() //步进电机正转1024拍,45度。
{
for(i=1024;i>0;i--)
{
P1=zhengzhuan[cnt];
delay();
cnt++;
cnt=cnt&0x07;
}
}
void fanzhuan1024()//步进电机反转1024拍,45度。
{
for(i=1024;i>0;i--)
{
P1=fanzhuan[cnt];
delay();
cnt++;
cnt=cnt&0x07;
}
}
void fanzhuan2048() //步进电机正转2048拍,180度。
{
for(i=2048;i>0;i--)
{
P1=fanzhuan[cnt];
delay();
cnt++;
cnt=cnt&0x07;
}
}
void main()
{
K1=1;
K2=1;
K3=1;
K4=1; //红外线感应开关检测前先输出高电平
while(1)
{
if(K1==0)//红外线1号开关最先检测到物体,输出低电平
{
new=old+1;
switch(new)
{
case 1:while(!K1);break;//因为old初始化为0,所以只执行这个分支
case 2:while(!K1);break;
case 3:fanzhuan1024();while(!K1);break;
case 4:fanzhuan2048();while(!K1);break;
case 5:zhengzhuan1024();while(!K1);break;}
old=1;//赋值1,记住步进电机转动停止的位置
}
if(K2==0)//红外开关2号检测到物体
{
new=old+1;//因为先前old为1,所以new=2
switch(new)
{
case 1:while(!K2);break;
case 2:zhengzhuan1024();while(!K2);break; //执行这条分支,步进电机正转1024拍(45度)至2号红外开关所处的位置
case 3:while(!K2);break;
case 4:fanzhuan1024();while(!K2);break;
case 5:fanzhuan2048();while(!K2);break;}
old=2; //赋值2,记住步进电机转动停止的位置
}
if(K3==0)
{
new=old+1;
switch(new)
{
case 1:while(!K3);break;
case 2:fanzhuan2048();while(!K3);break;
case 3:zhengzhuan1024();while(!K3);break;
case 4:while(!K3);break;
case 5:fanzhuan1024();while(!K3);break;}
old=3;
}
if(K4==0)
{
new=old+1;
switch(new)
{
case 1:while(!K4);break;
case 2:fanzhuan1024();while(!K4);break;
case 3:fanzhuan2048();while(!K4);break;
case 4:zhengzhuan1024();while(!K4);break;
case 5:while(!K4);break;}
old=4;
}
}
}
|