打印

求助,自己刚写的双轴太阳能追光程序运行

[复制链接]
1212|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
梦缘Hboy|  楼主 | 2014-7-28 20:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//双轴追光
//单片机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++)                       
{;}}                                               
}


相关帖子

沙发
梦缘Hboy|  楼主 | 2014-7-28 20:52 | 只看该作者
急求帮助!!!!!想要保证太阳能追光过程中可以使电机同时转动,通过标志位通过中断判断条件,进行相应的函数,使电机转动,现在的问题是,程序零错误零警告,但是没法运行,电机也不转,不知是哪里出了问题,请大神来解救!!!!

使用特权

评论回复
板凳
梦缘Hboy|  楼主 | 2014-7-28 20:53 | 只看该作者
在线等

使用特权

评论回复
地板
梦缘Hboy|  楼主 | 2014-7-28 22:40 | 只看该作者
我已经找到错误了:D

使用特权

评论回复
5
lymex| | 2014-7-28 22:49 | 只看该作者
如果要求不高,把转轴与地球自转轴调平行,单轴跟踪即可。
如果精度要求高,其实也可以采用类似赤道仪的方法:不跟踪、自己转。

使用特权

评论回复
6
梦缘Hboy|  楼主 | 2014-7-28 23:02 | 只看该作者
lymex 发表于 2014-7-28 22:49
如果要求不高,把转轴与地球自转轴调平行,单轴跟踪即可。
如果精度要求高,其实也可以采用类似赤道仪的方 ...

谢谢了,我已经找到错误了,想用双轴,这样更精确

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

5

帖子

0

粉丝