步进电机C语言程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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();

}

}

}

相关文档
最新文档