程序如下:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit maicong=P2^5;//电机脉冲输出,初始低电平
sbit fangxiang=P2^6;//电机方向输出,初始化后低电平
sbit EN=P2^7;//电机使能,初始高电平
sbit XWKG=P2^4;//初始位置确认端口,低电平有效,调用ZIJIAN子程序
sbit k0=P1^0;//启动,调用START子程序
sbit k1=P1^1;//停止,调用TINGZHI子程序
sbit k2=P1^2;//速度加,调用SUDUZ子程序
sbit k3=P1^3;//速度减,调用SUDUJ子程序
sbit k4=P1^4;//步长加,调用BUCHANGZ子程序
sbit k5=P1^5;//步长减,调用BUCHANGJ子程序
uint tt=200;//是否需要??
uint step=1100;//同上
uint num=18;
void keyscan();//键盘扫描程序,程序完成
void delayms(uint ms);//毫秒级可变延时程序
void delayus(uint us);//微秒级可变延时程序,用于低电平输出延时,改变低电平时长就调整了频率。
void delay(uint us);//微秒级延时程序,用于脉冲高电平输出延时
void baidong();//
void ZIJIAN();//程序完成
void START();//对应k0
void TINGZHI();//对应k1
void SUDUZ();//对应k2
void SUDUJ();//对应k3
void BUCHANGZ();//对应k4
void BUCHANGJ();//对应k5
void JIUQIANYISHEN();//对应k6
void main(void)
{
_ maicong = 0;_
fangxiang = 1;
IT1 = 1; //set INT1 int type (1:Falling only 0:Low level)
EX1 = 1; //enable INT1 interrupt
EA = 1; //open global interrupt switch
ZIJIAN();
while(1);//等待按键指令,此时PWM=0;DIR=0。
}
/*低一级的外部中断2,负责按键的操作,即启动、停止、加减速、步长加减、自动运行程序的启动*/
void exint1() interrupt 2 //(location at 0013H)
{
keyscan();
}
void keyscan()
{
while(1)
{
if(k0==0) START();
else if(k1==0) TINGZHI();//停止,回初始位
else if(k2==0) SUDUZ();//速度增
else if(k3==0) SUDUJ();//速度减
else if(k4==0) BUCHANGZ();//步长增
else if(k5==0) BUCHANGJ();//步长减
else if(k6==0) JIUQIANYISHEN();//九浅一深
else if(XWKG==0) ZIJIAN();//初始位开关开,电机换向,转动
}
}
void ZIJIAN()
{
EN=0;//电机使能,可以自由转动
fangxiang=1;
while(XWKG==0)
{
maicong=1;
delay(1);
maicong=0;
delayus(tt);
}
while(XWKG==1)
{
fangxiang=0;
maicong=1;
delay(1);
maicong=0;
delayus(tt);//此处需配合限位开关确定转动角度
}
EN=1;//电机使能,不能自由转动
delayms(50);
}
void START()
{
EN=0;
step=1100;//50*55最大移动步数,有可能触发限位开关
delayms(50);
while(1)
{
baidong();
}
}
void TINGZHI()
{
while(1);
}
void SUDUZ()
{
tt=tt-5;
if(tt<1)
tt=1;
while(k2==0);
}
void SUDUJ()
{
tt=tt+5;
if(tt>255)
tt=255;
while(k3==0);
}
void BUCHANGZ()
{
step=step+5;
if(step>2750)
step=2750;
while(k4==0);
}
void BUCHANGJ()
{
step=step-5;
if(step<50)
step=50;
while(k5==0);
}
/*外部中断0(最高级),负责打断外部中断 2,即限位开关的触发*/
void exint0() interrupt 0 //(location at 0003H)
{
while(1);
}
void baidong()
{
EN=0;//电机使能,可以自由转动
while(step--)//step取值范围小于细分*55
{
maicong=1;//初始pwm输出为低电平,开始动作就要变为高电平(共阴接法)
delay(1);//延时4微秒,脉冲宽度为5微秒
maicong=0;//低电平
delayus(tt);//延时9微秒,低电平宽度10微秒,调整此延时数值更改速度
}
fangxiang=~fangxiang;//换向
}
void delay(uint xus)
{
uint m;
for(m=0;m<xus;++m);
}
void delayus(uint tt)
{
uint n;
for(n=0;n<tt;++n);//可变延时程序???
}
void delayms(uint xms)
{
uint x,y;
for(x=0;x<xms;++x)
for(y=0;y<110;++y);
}