找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3216|回復(fù): 0
收起左側(cè)

步進電機閉環(huán)控制程序

[復(fù)制鏈接]
ID:209673 發(fā)表于 2017-6-9 21:15 | 顯示全部樓層 |閱讀模式
#include<intrins.h>
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
uint i,j,m,n,flag,t;
signed int a,b,c,d;
double tt;  
uchar code  LEDData[]="0123456789";
uchar TX[6]={0,};
uchar run[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};
控制口定義
sbit EnA  =P2^6;     
sbit SA1  =P2^2;     
sbit SA2  =P2^3;   
sbit EnB  =P2^7;   
  
sbit SB1  =P2^4;      
   sbit SB2  =P2^5;        
sbit en   =P3^3;      
   sbit rw   =P3^1;         
sbit rs   =P3^0;        
sbit start=P1^4;
sbit vh   =P1^5;
sbit vl   =P1^6;
sbit stop =P1^7;
延時1ms程序
void delay0(int t)
{int w;  
for(;t>0;t--)
for(w=110;w>0;w--);
}
鍵盤掃描程序
void key()
{if(start==0)
  {delay0(10);   
while(start==0);     
{j++;   n=1;   }
  }
  if(stop==0)
{delay0(10);   
while(stop==0);  
    {n--;  
j=0;
      }
  }  
if(vh==0)
  {delay0(10);  
  while(vh==0);     
{m++;    a++;}
  }  
if(vl==0)  
{delay0(10);   
while(vl==0);  
    {m--;  
b--;}
  }
}
寫指令程序
void write_com(uchar com)
{  rs=0;  
P0=com;
delay0(5);
en=1;  
delay0(5);  
en=0;
}
寫數(shù)據(jù)程序
void write_data(uchar date)
{
  rs=1;  
P0=date;  
delay0(5);  
en=1;  
delay0(5);  
en=0;
}
PID程序
void PID()
{uint e1,e2,e3;
e1=TX[5]-TX[4];
e2=TX[3]-TX[2];  
e3=TX[1]-TX[0];
  if(e1>e2>10)
  { t=10*e1-6*e2+4*e3;   }  
if(2<e1<e2)
{ t=3*e1-5*e2+2*e3;   
}
中斷0服務(wù)程序
void interrupt0()
interrupt 1 using 2
{c++;
}
定時器0服務(wù)程序
void timer0() interrupt 1                 
   {  uint e;   
uint f;
   TH0=(65536-(1250-t))/256;                     
  TL0=(65536-(1250-t))%256;  
  if(f<7)  
  {P2=run[f];   
  f++;   
}   
else     {P2=run[f];   
  f=0;  
}  
  d++;  
  if(d==m)   
{if(e<6)   
  {e++;
  TX[e]=c;
}
else   
{e=0;
PID();  
}      
c=0;
   d=0;
   }
}
內(nèi)部資源初始化
void Init(void) {
   TMOD=0x11;                  
   TH0=(65536-(1250-t))/256;                    
  TL0=(65536-(1250-t))%256;
   TH1=(65536-50000)/256;               
  TL1=(65536-50000)%256;  
  IT0=1;
    EX0=1;   
IP=0x03;
   EA=1;                     
   ET0=1;                                          
TR0=1;   
en=0;   
rw=0;
   write_com(0x38);  
  write_com(0x0c);   
write_com(0x04);   
write_com(0x01);  
  write_com(0x80);  
  write_data('S');
   write_data('S');  
  write_data('P');   
   write_data('E');
write_data('E');  
   write_data('D');  
  write_data(':');
   write_com(0x80+0x0B);  
  write_data('R');   
write_data('/');  
  write_data('S');   
  write_com(0x80+0x40);  
  write_data('R');  
  write_data('S');   
write_data('P');     
write_data('E');   
write_data('E');   
write_data('D');   
write_data(':');
   write_com(0x80+0x4B);  
   write_data('R');   
  write_data('/');  
  write_data('S');
}
速度顯示
void speeddisplay()  
{ write_com(0x80+0x07);
   write_data('0');  
   write_data(LEDData[m/100]);
   write_data(LEDData[m%100/10]);   
write_data(LEDData[m%10]);  
  if((m<600)&(m>950))
    {write_com(0x80+0x48);
     write_data(LEDData[(m+1)/100]);   
   write_data(LEDData[(m+1)%100/10]);   
  write_data(LEDData[(m+1)%10]);}   else  
    {write_com(0x80+0x47);
write_data('0');  
     write_data(LEDData[m/100]);   
  write_data(LEDData[m%100/10]);   
  write_data(LEDData[m%10]);};      
  }  
void main(void)
{  a=b=c=d=i=0;   
j=0;   
m=800;
   n=1;  
  flag=0;
                         while(1)
   {key();  
   if(j==1)
  {init();  
  }
while(j&&n)
{key();  
PID();
     tt=(1.3*(a+b));   
   t=tt;  
speeddisplay();  
}
   if(n==0)
    {write_com(0x38);   
  write_com(0x0c);     
write_com(0x04);   
   write_com(0x01);   
  }  
  }
  }

回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表