利用单片机实现对步进电机简单控制
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
利用单片机实现对步进电机的简单控制
摘要:本文主要介绍了利用ly-51sv2.3开发板实现对步进电机的简单控制,以实现步进电机的正反转、加减速以及开始停止等功能。通过对步进电机的控制,使人们对开发板的应用以及如何编写c语言程序有更深层次的理解。通过本文的介绍,也为下一步更好的利用开发板控制步进电机打下一个基础。
关键词:单片机;步进电机;语言
中图分类号:tp368.1
目前,单片机应用得到了非常广泛的应用,几乎涉及到了社会生活中的各个领域,对于与计算机相关专业的单片机的知识有一个简单的学习了解是必要的,而对于初学者或者教学人员利用开发板进行学习是有效的途径。开发板是学习和实践的最好产品,因为有配套测试好的软件和硬件,这样用户就不必操心组建开发系统的过程。只需要专心研究程序。开发板只不过是个工具,利用这个工具,可以使我们更快的了解并掌握需要的知识。
1设计思路
本次单片机使用stc89c51,通过开发板的5个按键k1-k5分别实现对步进电机的加减速、正反转与停止的控制,在实现正反转的过程中分别由led指示灯进行指示,并在数码管上显示当前速度的大小值,其最大值不超过18,在整个按键过程中是由键盘扫描函数来控制,速度的大小值是由显示函数在数码管上显示出来。
2端口、函数与变量定义
#definekeyportp3//由p3口连接控制按钮
#definedataportp0//定义数据端口程序中遇到dataport则用p0替换
sbitlatch1=p2;//定义锁存使能端口段锁存
sbitlatch2=p2;//位锁存
sbita1=p1 ;//定义步进电机连接端口
sbitb1=p1;sbitc1=p1;sbitd1=p1;sbitled=p1;
sbitled1=p1;
unsignedcharcodedofly_duanma[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};unsignedcharcodedofly_weima[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsignedchartempdata[8];//存储显示值的全局变量
定义ab相通电,其他相断电,定义bc相通电,其他相断电,定义cd相通电,其他相断电,定义d相通电,其他相断电,定义a
相通电,其他相断电,定义b相通电,其他相断电,定义c相通电,其他相断电,定义d相通电,其他相断电全部断电unsignedcharspeed=1;bitstopflag=1;
unsignedcharflag=1;//定义电机正反转变量标志
voiddisplay(unsignedcharfirstbit,unsignedcharnum);//显示函数,在数码管显示具体速度值
voidinit_timer0(void);unsignedcharkeyscan(void);
延时函数delayus2x(unsignedchart),
voiddelayms(unsignedchart)
3函数调用过程
voiddelayus2x(unsignedchart)voiddelayms(unsignedchart) main()
{unsignedinti=512;unsignedcharnum;coil_off;
while(1){num=keyscan();//循环调用按键扫描
if(num==1)//第一个按键,速度等级增加
{if(speed1)
speed--;}
elseif(num==3)//电机停止
{coil_off;
stopflag=1;led=1;
led1=1;ea=0;}
elseif(num==4)//电机启动
{init_timer0();stopflag=0;
flag=1;led=1;
led=0;led1=1;}
elseif(num==5)//反转
{init_timer0();stopflag=0;
flag=2;led1=1;
led1=0;led=1;}
tempdata[0]=dofly_duanma[speed/10];
tempdata[1]=dofly_duanma[speed%10];}}
voiddisplay(unsignedcharfirstbit,unsignedcharnum) {staticunsignedchari=0;
dataport=0;latch1=1;
latch1=0;dataport=dofly_weima[i+firstbit];
latch2=1;latch2=0;
dataport=tempdata[i];latch1=1;
latch1=0;i++;if(i==num) i=0;}
voidinit_timer0(void)
voidtimer0_isr(void)interrupt1
{display(0,8);if(!stopflag){if(flag==1)
{if(times==(20-speed))//最大值18,所以最小间隔值20-18=2 {times=0;
switch(i){
case0:coil_d1;i++;break;case1:coil_c1;i++;break;
case2:coil_b1;i++;break;case3:coil_a1;i++;break;
case4:i=0;break;default:break;}}times++;}
if(flag==2)
{if(times==(20-speed))//最大值18,所以最小间隔值20-18=2