/**************************************************************/
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit key0=P1^0;
sbit key1=P1^1;
sbit key2=P1^2;
sbit key3=P1^3;
sbit CP=P3^6; //脉冲输出
sbit DIR=P3^7; //方向信号
sbit lim_back=P3^2; //极限和手动变向
uchar a[10]={0xc0,0xcf,0xa4,0x06,0x0b,0x92,0x90,0x47,0x80,0x82};
uchar b[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
uchar num0,num1,num2,num3,num4,num5,num20,num30;
uchar num,speed_num,j;
uint plu_num,plu_ori;
/***********************************************************/
void delayms(uchar xms)
{
uchar i,j;
for(i=xms;i>0;i--)
{
for(j=110;j>0;j--);
}
}
/***********************************************************/
void scan_key0()
{
if(key0==0)
{
delayms(10);
if(key0==0)
{
num0++;
if(num0==10)
{
num0=0;
}
while(!key0);
}
}
}
/***********************************************************/
void scan_key1()
{
if(key1==0)
{
delayms(10);
if(key1==0)
{
num1++;
if(num1==10)
{
num1=0;
}
while(!key1);
}
}
}
/***********************************************************/
void scan_key2()
{
if(key2==0)
{
delayms(10);
if(key2==0)
{
num2++;
if(num2==10)
{
num2=0;
}
while(!key2);
}
}
}
/***********************************************************/
void scan_key3()
{
if(key3==0)
{
delayms(10);
if(key3==0)
{
num3++;
if(num3==10)
{
num3=0;
}
while(!key3);
}
}
}
/***********************************************************/
void rate_set()
{
P0=0xff;
scan_key0();
scan_key1();
speed_num=num1*10+num0; //计算速度设定值
}
/***********************************************************/
void range_set()
{
P0=0xff;
scan_key2();
scan_key3();
if((num2!=num20)||(num3!=num30))
{
num20=num2;
num30=num3;
plu_num=(num3*10+num2)*360;//由宽度设定计算脉冲总量
plu_ori=plu_num;
}
}
/***********************************************************/
void keyscan()
{
rate_set();
range_set();
}
/***********************************************************/
void display()
{
P0=a[num0];
P2=b[0];
delayms(5);
P0=a[num1];
P2=b[1];
delayms(5);
P0=a[num2];
P2=b[2];
delayms(5);
P0=a[num3];
P2=b[3];
delayms(5);
P0=a[num4];
P2=b[4];
delayms(5);
P0=a[num5];
P2=b[5];
delayms(5);
}
/***********************************************************/
void step_moto() //步进电机驱动
{
if((EX0==0)&&(plu_num<(plu_ori-100)))
{
EX0=1;
}
num5=(plu_num/360)/10;
num4=(plu_num/360)%10;
if((num2==0)&&(num3==0))
{
num4=0;
num5=0;
}
}
/***********************************************************/
void T0_time() interrupt 1
{
TH0 = 0xFF;//150us初值
TL0 = 0x6A;
if(speed_num!=0)
{
num++;
if(num==(100-speed_num)) //数字越大,角速度越快
{
num=0;
CP=~CP;
j++;
if(j==2)
{
j=0;
plu_num--;
}
}
if(plu_num==0)
{
DIR=~DIR; //改换方向
plu_num=plu_ori;
}
}
}
/***********************************************************/
void int_int0() interrupt 0 //外部中断0
{
if(lim_back==0)
{
delayms(10);//消抖
if(lim_back==0);
{
DIR=~DIR; //改换方向
EX0=0; //关外部中断
plu_num=plu_ori;
}
}
}
/***********************************************************/
void init()
{
TMOD = 0x01; //定时器0为工作方式1
TH0 = 0xFF; //150us初值
TL0 = 0x6A;
EA = 1; //开全局中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
EX0=1; //开外部中断0
IT0=1; //外部中断0下降沿触发
}
/***********************************************************/
void main()
{
init();
while(1)
{
keyscan();
display();
step_moto();
}
}
虹山艺术高地步进电机控制—独立按键输入设定速度和宽度(工作正常)
最新推荐文章于 2022-04-12 22:06:48 发布