/**************************************************************************************************/
//功能:实现步进电机梯形调速
//
// *********
// * *
// * * *
// * *
// * *
// *********
//
/**************************************************************************************************/
#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;
}
}
}
}
|