//双轴追光
//单片机stc89c52. 晶振11.0592
//四个光敏AD模块,强光返回0,弱光返回1,分别放在太用能电池板的左(Z)右(Y)上(S)下(X)位置
#include <reg52.h>
sbit A1=P1^0; //定义步进电机A————端口
sbit B1=P1^1;
sbit C1=P1^2;
sbit D1=P1^3;
sbit A2=P1^4; //定义步进电机B————端口
sbit B2=P1^5;
sbit C2=P1^6;
sbit D2=P1^7;
sbit L0=P0^0; //Z
sbit L1=P0^1; //Y
sbit L2=P0^2; //S
sbit L3=P0^3; //X
bit flag=1;
#define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通电,其他相断电
#define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通电,其他相断电
#define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通电,其他相断电
#define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通电,其他相断电
#define Coil_A2 {A2=1;B2=0;C2=0;D2=0;}//A相通电,其他相断电
#define Coil_B2 {A2=0;B2=1;C2=0;D2=0;}//B相通电,其他相断电
#define Coil_C2 {A2=0;B2=0;C2=1;D2=0;}//C相通电,其他相断电
#define Coil_D2 {A2=0;B2=0;C2=0;D2=1;}//D相通电,其他相断电
#define Coil_OFF1 {A1=0;B1=0;C1=0;D1=0;}//全部断电
#define Coil_OFF2 {A2=0;B2=0;C2=0;D2=0;}//全部断电
void delay(unsigned int k);
void Init_Timer0(void);
void zheng_A(); //电机A正转
void fan_A(); //电机A反转
void stop_A(); //电机A停止
void zheng_B(); //电机B正转
void fan_B(); //电机B反转
void stop_B(); //电机B停止
void AB_ZS();//A电机左向,B电机上向 ;左为正,上为正
void AB_ZX();//A电机左向,B电机下向 ;左为正,下为反
void AB_YS();//A电机右向,B电机上向 ;右为反,上为正
void AB_YX();//A电机右向,B电机下向 ;右为反,下为反
unsigned char Speed=8;
unsigned int i,t=5;//旋转一周时间
/*------------------------------------------------
主函数
------------------------------------------------*/
main()
{
Init_Timer0();
while(1)
{
if(L0==0&&L1==1&&L2==0&&L3==1) AB_ZS();
if(L0==0&&L1==1&&L2==1&&L3==0) AB_ZX();
if(L0==1&&L1==0&&L2==0&&L3==1) AB_YS();
if(L0==1&&L1==0&&L2==1&&L3==0) AB_YX();
if(L0==0&&L1==0&&L2==0&&L3==1) while(L2==1&&L3==1) zheng_B();
if(L0==0&&L1==1&&L2==0&&L3==0) while(L0==1&&L1==1) zheng_A();
if(L0==0&&L1==0&&L2==1&&L3==0) while(L2==1&&L3==1) fan_B();
if(L0==1&&L1==0&&L2==0&&L3==0) while(L0==1&&L1==1) fan_A();
if(L0==0&&L1==0&&L2==0&&L3==0) { stop_A(); stop_B(); }
}
}
/*------------------------------------------------
定时器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{
TMOD|=0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH0 =0x00; //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出
TL0 =0x00;
EA =1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}
/*------------------------------------------------
定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1 using 1
{
TH0=0x00; //重新赋值
TL0=0x00;
{
if(L0==0&&L1==1&&L2==0&&L3==1) flag=0;
if(L0==0&&L1==1&&L2==1&&L3==0) flag=0;
if(L0==1&&L1==0&&L2==0&&L3==1) flag=0;
if(L0==1&&L1==0&&L2==1&&L3==0) flag=0;
if(L0==0&&L1==0&&L2==0&&L3==1) flag=1;
if(L0==0&&L1==1&&L2==0&&L3==0) flag=1;
if(L0==0&&L1==0&&L2==1&&L3==0) flag=1;
if(L0==1&&L1==0&&L2==0&&L3==0) flag=1;
}
}
/*------------------------------------------------
电机A_B的执行程序
------------------------------------------------*/
///////////////////////////////////////////////////////////////////////////////////////
void fan_A()
{
for(;i<=t;i++) //正向
{
Coil_A1
delay(Speed); //改变这个参数可以调整电机转速 , //数字越小,转速越大,力矩越小
Coil_B1
delay(Speed);
Coil_C1
delay(Speed);
Coil_D1
delay(Speed);
}
}
void zheng_A()
{
for(;i<=t;i++) //反向
{
Coil_D1
delay(Speed); //改变这个参数可以调整电机转速 ,//数字越小,转速越大,力矩越小
Coil_C1
delay(Speed);
Coil_B1
delay(Speed);
Coil_A1
delay(Speed);
}
}
void stop_A()
{
Coil_OFF2
}
//////////////////////////////////////////////////////////////////////////////////////
void fan_B()
{
for(;i<=t;i++) //正向
{
Coil_A2
delay(Speed); //改变这个参数可以调整电机转速 , //数字越小,转速越大,力矩越小
Coil_B2
delay(Speed);
Coil_C2
delay(Speed);
Coil_D2
delay(Speed);
}
}
void zheng_B()
{
for(;i<=t;i++) //反向
{
Coil_D2
delay(Speed); //改变这个参数可以调整电机转速 ,//数字越小,转速越大,力矩越小
Coil_C2
delay(Speed);
Coil_B2
delay(Speed);
Coil_A2
delay(Speed);
}
}
void stop_B()
{
Coil_OFF1
}
////////////////////////////////////////////////////////////////////////////////////////////
void AB_ZS()//A电机左向,B电机上向 ;左为正,上为正
{
for(;i<=t;i++)
{
Coil_A1
Coil_A2
delay(Speed); if(flag==0)break;
Coil_B1
Coil_B2
delay(Speed); if(flag==0)break;
Coil_C1
Coil_C2
delay(Speed); if(flag==0)break;
Coil_D1
Coil_D2
delay(Speed); if(flag==0)break;
}
}
void AB_ZX()//A电机左向,B电机下向 ;左为正,下为反
{
for(;i<=t;i++) //正向
{
Coil_A1
Coil_D2
delay(Speed); if(flag==0)break;
Coil_B1
Coil_C2
delay(Speed); if(flag==0)break;
Coil_C1
Coil_B2
delay(Speed); if(flag==0)break;
Coil_D1
Coil_A2
delay(Speed); if(flag==0)break;
}
}
void AB_YS()//A电机右向,B电机上向 ;右为反,上为正
{
for(;i<=t;i++) //反向
{
Coil_D1
Coil_A2
delay(Speed); if(flag==0)break;
Coil_C1
Coil_B2
delay(Speed); if(flag==0)break;
Coil_B1
Coil_C2
delay(Speed); if(flag==0)break;
Coil_A1
Coil_D2
delay(Speed); if(flag==0)break;
}
}
void AB_YX()//A电机右向,B电机下向 ;右为反,下为反
{ for(;i<=t;i++)
{
Coil_D1
Coil_D2
delay(Speed); if(flag==0)break;
Coil_C1
Coil_C2
delay(Speed); if(flag==0)break;
Coil_B1
Coil_B2
delay(Speed); if(flag==0)break;
Coil_A1
Coil_A2
delay(Speed); if(flag==0)break;
}
}
/////////////////////////////////////////////////////////////////////////////////////////
/*------------------------------------------------
延时程序
------------------------------------------------*/
void delay(unsigned int k)
{
unsigned int i,j;
for(i=0;i<k;i++)
{
for(j=0;j<121;j++)
{;}}
}
|