历史上的今天
今天是:2025年02月17日(星期一)
2020年02月17日 | 基于51单片机的步进电机控制以及仿真
2020-02-17 来源:51hei
给你一段简单的程序代码,控制步进电机的,不过你要好好看看程序的编写,以适应你的硬件(主要是连线),你可以在实现这个的基础上实现你所说的目标,个人觉得你参考这个程序然后自己实现你所说的功能比较好:
#include unsigned char code F_Rotation[4]={0x08,0x10,0x20,0x40};//正转表格 unsigned char code B_Rotation[4]={0x40,0x20,0x10,0x08};//反转表格 void Delay(unsigned int i)//延时 { while(--i); } main() { unsigned char i; while(1) { for(i=0;i<4;i++) //4相 { P1=F_Rotation[i]; //输出对应的相 可以自行换成反转表格 Delay(500); //改变这个参数可以调整电机转速 } } } 我编了一个程序 ,让单片机发100个脉冲,之后电机就停止转动。但是把单片机、驱动器、电机连起来,运行的时候,步进电机一直转,没有出现预期的停止。我的驱动器的脉冲负接 P1^2,驱动器的脉冲正接+5V。 #include #include #define VALUE 40 sbit sp = P1^2; unsigned int a; void delay(unsigned int i) { char j; for(i; i > 0; i--) for(j = 200; j > 0; j--); } void main() While(1) { a=0; while(1) { sp=0; delay(10); sp=1; delay(10); a++; if(a==100) { sp=0 break; } } } 电路图: 程序; #include #define uint unsigned int #define uchar unsigned char uchar code s[]={ 0x88,0x22,0x44,0x11 }; void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void main() { int i; while(1) { for(i=0;i<4;i++) { P2=s[i]; delay(200); } } } #include sbit k1=P1^1; //启动 sbit k2=P1^0; //正反转 sbit k3=P1^2; //加速 sbit k4=P1^3; //减速 unsigned int x=50000; unsigned char i=0; unsigned char code table[6]={0x01,0x03,0x02,0x06,0x04,0x05};//单双六拍 void motor(); void main() { TMOD=0x01; TH0=-x>>8; // TL0=-x%256; // TCON=0x10; IE=0x82; while(1); } void time_0 () interrupt 1 { EA=0;TR0=0; motor(); if(x<65000&&x>36000) //上下限 {if(!k3) x=x-2000; //加速 else if(!k4) x=x+2000;} //减速 TH0=-x>>8;TL0=-x%256; TR0=1;EA=1; } void motor() { if(!k1) { if(!k2) //正反转 {i+=1; if(i>5) i=0;} else {i-=1; if(i>5) i=5;} P2=table; } else P2=0; } 51单片机控制的4相步进电机的C语言程序 #include unsigned char code table[]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9,0x00,0xf1,0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0x00}; unsigned char temp,temp_old; unsigned char key; unsigned char i,j,k,m,s; void delay(int i) { for(m=i;m>0;m--) for(j=250;j>0;j--) for(k=10;k>0;k--); } void saomiao() { P3=0xff; P3_4=0; temp=P3; temp=temp&0x0f; if(temp!=0x0f) { for(i=50;i>0;i--) for(j=200;j>0;j--); temp=P3; temp=temp&0x0f; if(temp!=0x0f) { temp=P3; temp=temp&0x0f; switch(temp) { case 0x0e: key=1; break; case 0x0d: key=2; break; case 0x0b: key=3; break; case 0x07: key=4; break; } temp=P3; temp=temp&0x0f; while(temp!=0x0f) { temp=P3; temp=temp&0x0f; } } } P3=0xff; P3_5=0; temp=P3; temp=temp&0x0f; if(temp!=0x0f) { for(i=50;i>0;i--) for(j=200;j>0;j--); temp=P3; temp=temp&0x0f; if(temp!=0x0f) { temp=P3; temp=temp&0x0f; switch(temp) { case 0x0d: key=5; break; case 0x0b: key=6; break; case 0x07: key=7; break; } temp=P3; temp=temp&0x0f; while(temp!=0x0f) { temp=P3; temp=temp&0x0f; } } } } void main(void) { while(1) { saomiao(); if(key==1) { P1=0; P2=0; saomiao(); } if(key==2) { temp_old=key; for(s=0;s<8;s++) { P2=table[s]; P1_4=0; delay(13); saomiao(); if(key!=temp_old) { P1_4=1; break; } } } if(key==3) { temp_old=key; for(s=0;s<8;s++) { P2=table[s]; P1_5=0; delay(5); saomiao(); if(key!=temp_old) { P1_5=1; break; } } } if(key==4) { temp_old=key; for(s=0;s<8;s++) { P2=table[s]; P1_6=0; delay(20); saomiao(); if(key!=temp_old) { P1_6=1; break; } } } if(key==5) { temp_old=key; for(s=9;s<17;s++) { P2=table[s]; P1_7=0; delay(13); saomiao(); if(key!=temp_old) { P1_7=1; break; } } } if(key==6) { temp_old=key; for(s=9;s<17;s++) { P2=table[s]; P1_5=0; delay(5); saomiao(); if(key!=temp_old) { P1_5=1; break; } } } if(key==7) { temp_old=key; for(s=9;s<17;s++) { P2=table[s]; P1_6=0; delay(20); saomiao(); if(key!=temp_old) { P1_6=1; break; } } } } }

下一篇:51单片机智能时钟设计
史海拾趣
|
网上盛传:STR912 STM32F103系列国内买不到货了? 一直在用STR912,今天公司采购人员说STR912在国内买不到货了 可能一直到8月份左右才能有货 再一查STM32F103系列,说是缺货更严重复制代码 大家知道有这个情况么?不知是啥原因?… 查看全部问答> |
|
振南QQ:987582714 ================== 经历了3个月的录制和后期制作,《单片机基础外设九日通》终于作的差不多了。录制的过程确实比较辛苦,但是还好,现在可以拿出来给大家了。 《单片机基础外设九日通》视频教程一共有9集,前8集对单片机常用 ...… 查看全部问答> |
|
各位大虾: 我编译的时候老提示错误,但是我又找不到,麻烦各位帮我看看到底是怎么回事? ERROR: requires ANSI-style prototype… 查看全部问答> |
|
LCD 是 18 位的,但是显示驱动里面没有 18bit, 只能设为 16 bit, 这样一些颜色就没了,再扫描到 lcd 上 18bit, RGB565 变成 RGB666, R和B的分量就掉不少,放视频的时候有一些颜色块,颜色过度不平滑,各位有遇到这种问题吗?… 查看全部问答> |
|
最近在用wince开发一款网络摄像头。 要求在IE上安装插件之后就能监控这个摄像头。 摄像头与摄像头之间可以视频通话。 大家有没有什么好的建议,提供一下啊。谢谢 或者与我合作开发也行。… 查看全部问答> |
|
我在一个原来的项目中(别人写的),insert了一个form,但是当运行的时候,提示让二选一,这是为什么啊? 如何解决啊? 顺便能否给一段代码,说明文件操作的方法(越详细越好),和分隔字符串的方法(例如以\";\"分隔一段文本为若干部分)。 ...… 查看全部问答> |
|
管线压力监测控制系统,采用西门子PLC和西安达泰电子DTD110系列无线遥测RTU,实现有线与无线的混合布线方案。 DTD110系列RTU采用智能控制器管理,与DTD4系列无线数传模块结合实现无线遥测遥控。提供4路4~20mA信号输入和4路4~20mA ...… 查看全部问答> |
|
实时采集现场温度,并可记录保存至少113天的温度数据,掉电也不丢失。采集精度高稳定性好,反应快,温感探头防水、防锈,并可通过网络或GPRS通讯接 口将温度数据传给后台,支持温度上下限报警,温度加速度过快报警,报警形式即可通过语音报警也可 ...… 查看全部问答> |




