步进电机C语言程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/*********************************************************************/
/*设备:YL-236单片机设备
/*实验:07直流电机
/*时间:
/*要求:数码管显示直流电机转动的圈数
/* 单片机P0口(8位)接显示模块-数码管D0-D7
CS1---P25
CS2---P26
WR ---P27
步进电机驱动器设置(红色拨码开关)为00111011(上面0 下边1)
/*********************************************************************/
#include <REGX52.H> // AT89S52标准头文件
#include<intrins.h> // 包含_nop_(); // 大约1us
sbit CS1=P2^5;
sbit CS2=P2^6;
sbit WR_S=P2^7;
sbit CP =P2^0;
sbit DIR=P2^1;
sbit LL =P2^2;
sbit RL =P2^3;
unsigned char xian[3];
void Delayus(unsigned int time)//延时时间为1us * x 晶振是11.0592M
{
unsigned int _y;
for(_y = 0; _y < time; _y++)
_nop_();
}
unsigned char code shuma[]= //段码
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xBF,0x ff};
/*0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,-, ,*/
unsigned char code wei[]={ //位码
0XFE, //11111110
0XFD, //11111101
0XFB, //11111011
};
void zi_shuma(void) //数码管显示子程序
{
static unsigned char j;
j++;
if(j==3)j=0;
P0=wei[j]; //位选
CS2=0;
WR_S=0;
WR_S=1;
CS2=1;
P0=shuma[xian[j]]; //段选
CS1=0;
WR_S=0;
WR_S=1;
CS1=1;
Delayus(50);
P0=0xff; //消影
CS1=0;
WR_S=0;
WR_S=1;
CS1=1;
}
void main(void)
{
unsigned char s=0,shu0,shu1,shu2;
unsigned int kk=0,kk1;
xian[0]=xian[1]=xian[2]=0;
while(1)
{
if(s==0) //状态0
{
DIR=0; //向右运行
CP=0;Delayus(30); //脉冲
CP=1;Delayus(30);
if(LL==1) //检测到左限位,进入状态1
{
Delayus(500);
if(LL==1){s=1;kk=0;}
}
}
if(s==1) //状态1
{
DIR=1; //向左运行
CP=0;Delayus(30); //脉冲
CP=1;Delayus(30);
kk++; //3077 //2588 //计数
if(RL==1) //检测到右限位,若kk在2800-3200的范围内,则进入状态2,否则进入状态20(无)
{
Delayus(500);
if(RL==1)
{
if(kk>2800 && kk<3200) s=2;
else s=20;
}
}
}
if(s==2) //状态2
{
DIR=0; //向右运行
for(kk1=0;kk1<120;kk1++) //120个脉冲,指针到达零刻度线
{
CP=0;Delayus(30);
CP=1;Delayus(30);
}
s=31; //进入状态31
Delayus(50000);Delayus(50000);Delayus(50000);Delayus(50000);Delayus(50000);//延时//2588/150
}
if(s==31) //状态31
{
DIR=0; //向右运行
for(kk1=0;kk1<17;kk1++) //每17个脉冲,计数一次(约为1mm)
{
CP=0;Delayus(50);
CP=1;Delayus(50);
zi_shuma();
}
shu0++;
if(shu0==10) {shu1++;shu0=0;}
if(shu1==10) {shu2++;shu1=0;}
if(shu2==10) shu2=0;
if(shu2==1 && shu1==5)
{Delayus(50000);Delayus(50000);Delayus(50000);Delayus(50000);Delayus(50000);
s=0;shu2=0;shu1=0; }//当数码管显示为150时,回到状态0
xian[0]=shu0;
xian[1]=shu1;
xian[2]=shu2;
zi_shuma();
}
}
}