/**************************************************************************************************/
//功能:實現步進電機梯形調速
//
// *********
// * *
// * * *
// * *
// * *
// *********
//
/**************************************************************************************************/
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define MoterDate P1
/*二相勵磁*/
uchar phasecw[4] ={0x0c,0x06,0x03,0x09};//正轉 電機導通相序 D-C-B-A
uchar phaseccw[4]={0x09,0x03,0x06,0x0c};//反轉 電機導通相序 A-B-C-D
uint speed;//速度標志
uint delaytime,times;
bit flag;//中斷標志
void delay_ms(uint x)//ms延時函數
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<112;j++);
}
void MoterCW()//順時針
{
uint i;
for(i=0;i<4;i++)//脈沖周期
{
MoterDate=phasecw[i];
delay_ms(speed);//速度調節
}
}
void MoterCCW()//逆時針
{
uint i;
for(i=0;i<4;i++)//脈沖周期
{
MoterDate=phaseccw[i];
delay_ms(speed);//速度調節
}
}
/*****************************定時器延時部分***************************************/
void timer0_init()
{
TMOD=0x01;
TH0=(65536-delaytime)/256;
TL0=(65536-delaytime)%256;
ET0=1;
EA=1;
}
void timer0() interrupt 1
{
TH0=(65536-delaytime)/256;
TL0=(65536-delaytime)%256;
times--;
if(times==0) flag=1;
}
void delay10s_1()
{
flag=0;
delaytime=45872;//賦值可以確定延時時間
times=200;
TR0=1;
while(flag==0)//此處很重要,可以在精確延時的同時CPU進行相應的脈沖工作
{
MoterCW();//順時針
}
TR0=0;
}
void delay10s_2()
{
flag=0;
delaytime=45872;
times=200;
TR0=1;
while(flag==0)
{
MoterCCW();//逆時針
}
TR0=0;
}
/*********************************************************************/
void main()//主函數
{
uchar i,j;
timer0_init();
delay_ms(50);//等待系統穩定
while(1)
{
speed=25;
for(i=0;i<22;i++)
{
if(speed!=4)
{
speed--;
for(j=0;j<5;j++)
{
MoterCW();
}
}
else
{
delay10s_1();
}
}
for(i=0;i<22;i++)
{
for(j=0;j<5;j++)
{
MoterCW();
}
if(speed!=25)
speed++;
else
{
MoterDate=0x00;
delay_ms(50);
break;
}
}
for(i=0;i<22;i++)
{
if(speed!=4)
{
speed--;
for(j=0;j<5;j++)
{
MoterCCW();
}
}
else
{
delay10s_2();
}
}
for(i=0;i<22;i++)
{
for(j=0;j<5;j++)
{
MoterCCW();
}
if(speed!=25)
speed++;
else
{
MoterDate=0x00;
delay_ms(50);
break;
}
}
}
}
|