单片机控制步进电机的转动转动,不用按钮的。

【求助】单片机控制步进电机,步进电机不转怎么办? - 单片机/MCU论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
【求助】单片机控制步进电机,步进电机不转怎么办?
14:33:35  
单片机型号是:STC90C516RD+,步进电机型号:NMB-PM42S-096-SYH6,四线双极性
下载到单片机里面,步进电机只有刚刚开始转一小下,然后就不转了,一直发热,修改了延时时间,由10000改到了50000,还是不转。
求大神帮忙~
#include &reg52.h&
#include &intrins.h&
#define&&NOP()& &_nop_()& &/* 定义空指令 */
#define uchar unsigned char
#define uint&&unsigned int
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
stati //计数
static int step_ //步进索引数,值为0-7
&&//步进电机转动方向
static bit stop_//步进电机停止标志
s//步进电机转速参数,数值越大转速越慢
//步进电机转速参数计数
void delay(unsigned int endcount);//延时函数,延时为endcount*0.5ms
void gorun();&&//步进电机控制步进函数
//定义管脚
sbit IRIN1 = P3^5;& && &&&//红外接收器数据线(红,绿,黄)
sbit IRIN2 = P3^6;
sbit IRIN3 = P3^7;
sbit PH1 = P0^0;& & & && &//定义管脚
sbit PH2 = P0^1;
sbit I01 = P0^2;
sbit I11 = P0^3;
sbit I02 = P0^4;
sbit I12 = P0^5;
void main(void)
& & & & count=0;
& & & & step_index=0;
& & & & spcount=0;
& & & & stop_flag=1;& &//不允许转
& & & & PH1=0;
& & & & PH2=0;
& & & & I01=0;
& & & & I11=0;
& & & & I02=0;
& & & & I12=0;
& & & & EA=1;& &//允许cpu中断
& & & & TMOD=0x11; //设定时器0和1为16位模式1
& & & & ET0=1; //定时器0中断允许
& & & & TCON=0x01;& &//触发方式为脉冲负边沿触发
& & & & IRIN1=1;
& & & & IRIN2=1;
& & & & IRIN3=1;
& & & & TH0=0xFE;
& & & & TL0=0x0C;& &//设定时每隔0.5ms中断一次
& & & & TR0=1;& &//开始计数
& & & & turn = 0;
& & & & speedlevel = 2;
& & & & delay(10000);& &//控制转动的角度
//& & & & stop_flag=1;&&//一段时间后停止转动
& & & & speedlevel = 1;
& & & & do{
& & & & & & & & speedlevel=2;& &//数值越大转的越慢
& & & & & & & & delay(10000);
& & & & & & & & speedlevel=1;& & //快速
& & & & & & & & delay(10000);
& & & & & & & & speedlevel=2;
& & & & & & & & delay(10000);
& & & & & & & & stop_flag=1;& &&&//停止
& & & & & & & & & & & &
& & & & }while(1);
//定时器0中断处理
void timeint(void) interrupt 1& && && &//相当于这个函数每隔0.5ms执行一次
& & & & TH0=0xFE;
& & & & TL0=0x0C;&&//设定时每隔0.5ms中断一次
& & & & count++;
& & & & if(!IRIN1&&!IRIN2)
& & & & & & & & turn=0;& &//正传
& & & & & & & & stop_flag=0;
& & & & }& & & & & & & &
& & & & if(!IRIN3&&!IRIN2)
& & & & & & & & turn=1;
& & & & & & & & stop_flag=0;
& & & & spcount--;&&//步进电机转速参数计数
& & & & if(spcount&=0)& &//speedlevel=2表示两次中断转动一下
& & & & & & & & spcount=
& & & & & & & & gorun();
void delay(unsigned int endcount)
& & & & count=0;
& & & & do{}while( count&endcount);
void gorun()
& & & & if(stop_flag==1)
& & & & & & & & PH1=0;
& & & && &&&PH2=0;
& & & & & & & & I01=0;
& & & & & & & & I11=0;
& & & & & & & & I02=0;
& & & & & & & & I12=0;
& & & & & & & &
& & & & switch(step_index)
& & & & case 0:& &// A/
& & & & & & & & PH1 = 0;& & & &&&//PH1为0 A组线圈为反向电流
& & & & & & & & I01 = 0;
& & & & & & & & I11 = 0;& & & &&&//以最大电流输出(没细分) 以下相同 均是此意思
& & & & & & & &
& & & & & & & &
& & & & & & & & PH2 = 1;& &&&//PH2为1 B组线圈为正向电流
& & & & & & & & I02 = 1;
& & & & & & & & I12 = 1;& &&&//关闭电流输出,以下相同均是此意思
& & & & & & & &
& & & & case 1:& & // A/B
& & & & & & & & PH1 = 0;& &&&//PH1为0 A组线圈为反向电流
& & & & & & & & I01 = 0;
& & & & & & & & I11 = 0;
& & & & & & & &
& & & & & & & & PH2 = 1;& &&&//PH2为1 B组线圈为正向电流
& & & & & & & & I02 = 0;
& & & & & & & & I12 = 0;
& & & & & & & &
& & & & case 2:&&// B
& & & & & & & & PH1 = 1;
& & & & & & & & I01 = 1;
& & & & & & & & I11 = 1;
& & & & & & & &
& & & & & & & & PH2 = 1;
& & & & & & & & I02 = 0;
& & & & & & & & I12 = 0;
& & & & & & & &
& & & & case 3:&&// AB
& & & & & & & & PH1 = 1;
& & & & & & & & I01 = 0;
& & & & & & & & I11 = 0;
& & & & & & & &
& & & & & & & & PH2 = 1;&&
& & & & & & & & I02 = 0;
& & & & & & & & I12 = 0;
& & & & & & & &
& & & & case 4:&&// A
& & & & & & & & PH1 = 1;
& & & & & & & & I01 = 0;
& & & & & & & & I11 = 0;
& & & & & & & & PH2 = 0;
& & & & & & & & I02 = 1;
& & & & & & & & I12 = 1;
& & & & & & & &
& & & & case 5:&&// AB/
& & & & & & & & PH1 = 1;
& & & & & & & & I01 = 0;
& & & & & & & & I11 = 0;
& & & & & & & & PH2 = 0;&&
& & & & & & & & I02 = 0;
& & & & & & & & I12 = 0;
& & & & case 6:&&// B/
& & & & & & & & PH1 = 0;
& & & & & & & & I01 = 1;
& & & & & & & & I11 = 1;
& & & & & & & & PH2 = 0;
& & & & & & & & I02 = 0;
& & & & & & & & I12 = 0;
& & & & & & & &
& & & & case 7: // A/B/
& & & & & & & & PH1 = 0;
& & & & & & & & I01 = 0;
& & & & & & & & I11 = 0;
& & & & & & & &
& & & & & & & & PH2 = 0;
& & & & & & & & I02 = 0;
& & & & & & & & I12 = 0;
& & & & & & & &
& & & & & & & & if(turn==0)
& & & & & & & & {
& & & & & & & & & & & & step_index++;
& & & & & & & & & & & & if(step_index&7)
& & & & & & & & & & & & & & & & step_index=0;
& & & & & & & & }
& & & & & & & & else
& & & & & & & & {
& & & & & & & & & & & & step_index--;
& & & & & & & & & & & & if(step_index&0)
& & & & & & & & & & & & & & & & step_index=7;
& & & & & & & & }
14:34:42  
求帮忙,求帮忙~
15:21:46  
好牛 。。。。。。。。。。。。。。。。。。
19:40:22  
用示波器看看波形对不对
13:57:38  
期待高人出现,也会一起学习到之方面知识。
CellWise周军
15个问题&&&&&&&&2514个浏览
13个问题&&&&&&&&14843个浏览
6个问题&&&&&&&&6138个浏览
每天选一个需要解决的问题,大家一起来帮忙。
授人玫瑰,手有余香
您可能在工作中遇到如下问题,点击下载即可预览专家给出的答案。
问:我从事数码电子产品工作,为什么一开始要用模拟元件?
问:微调器会不会让我的设计变得太复杂,影响用户使用?
问:选择微调器前应该考虑哪些特性?
Powered by>> 基于C51单片机的按键控制步进电机转动
基于C51单片机的按键控制步进电机转动
所属分类:
下载地址:
基于C51单片机的按键控文件大小:29.29 kB
分享有礼! 》
请点击右侧的分享按钮,把本代码分享到各社交媒体。
通过您的分享链接访问Codeforge,每来2个新的IP,您将获得0.1 积分的奖励。
通过您的分享链接,每成功注册一个用户,该用户在Codeforge上所获得的每1个积分,您都将获得0.2 积分的分成奖励。
本程序用C语言编写,是基于STC89C51单片机的,通过单片机的独立按键控制两相四线步进电机正转、反转以及停止转动。
Sponsored links
源码文件列表
温馨提示: 点击源码文件名可预览文件内容哦 ^_^
步进电机4.42 kB17-03-16 13:05
2.64 kB17-03-16 13:05
步进电机.hex1.11 kB17-03-16 13:05
步进电机.lnp48.00 B17-03-16 13:05
步进电机.LST6.67 kB17-03-16 13:05
步进电机.M517.11 kB17-03-16 13:05
步进电机.OBJ4.66 kB17-03-16 13:05
步进电机.Opt863.00 B17-03-16 13:05
步进电机.opt.bak1.10 kB16-02-16 19:09
步进电机.plg1.25 kB17-03-16 13:05
步进电机.Uv22.09 kB07-01-16 11:54
步进电机.uvgui.hu72.48 kB17-03-16 12:52
步进电机.uvgui_hu.bak68.84 kB17-03-16 12:49
步进电机.uvopt7.12 kB17-03-16 12:52
步进电机.uvproj12.97 kB17-03-16 12:49
步进电机_Opt.Bak1.10 kB16-02-16 15:30
步进电机_Uv2.Bak2.05 kB31-08-11 15:41
步进电机_uvopt.bak6.73 kB17-03-16 12:49
&基于C51单片机的按键控制步进电机转动&0.00 B17-03-16 13:05
(提交有效评论获得积分)
评论内容不能少于15个字,不要超出160个字。
评价成功,多谢!
下载基于C51单片机的按键控
CodeForge积分(原CF币)全新升级,功能更强大,使用更便捷,不仅可以用来下载海量源代码马上还可兑换精美小礼品了
您的积分不足,优惠套餐快速获取 30 积分
10积分 / ¥100
30积分 / ¥200原价 ¥300 元
100积分 / ¥500原价 ¥1000 元
订单支付完成后,积分将自动加入到您的账号。以下是优惠期的人民币价格,优惠期过后将恢复美元价格。
支付宝支付宝付款
微信钱包微信付款
更多付款方式:、
您本次下载所消耗的积分将转交上传作者。
同一源码,30天内重复下载,只扣除一次积分。
鲁ICP备号-3 runtime:Elapsed:131.522ms - init:0.2;find:3.7;t:1.7;tags:1.8;related:55.1;comment:0.1; 5.8
登录 CodeForge
还没有CodeForge账号?
Switch to the English version?
^_^"呃 ...
Sorry!这位大神很神秘,未开通博客呢,请浏览一下其他的吧还没有帐号? 赶紧
用户版块帖子
按键控制步进电机转动的示例
UID:1952218
在线时间150小时
M币194专家0
&&发表于: 01-11
转发 谢谢 #include &reg52.h&sbit KEY_IN_1&&= P2^4;sbit KEY_IN_2&&= P2^5;sbit KEY_IN_3&&= P2^6;sbit KEY_IN_4&&= P2^7;sbit KEY_OUT_1 = P2^3;sbit KEY_OUT_2 = P2^2;sbit KEY_OUT_3 = P2^1;sbit KEY_OUT_4 = P2^0;unsigned char code KeyCodeMap[4][4] = { //矩阵按键编号到标准键盘键码的映射表&&&&{ 0x31, 0x32, 0x33, 0x26 }, //数字键1、数字键2、数字键3、向上键&&&&{ 0x34, 0x35, 0x36, 0x25 }, //数字键4、数字键5、数字键6、向左键&&&&{ 0x37, 0x38, 0x39, 0x28 }, //数字键7、数字键8、数字键9、向下键&&&&{ 0x30, 0x1B, 0x0D, 0x27 }&&//数字键0、ESC键、&&回车键、 向右键};unsigned char KeySta[4][4] = {&&//全部矩阵按键的当前状态&&&&{1, 1, 1, 1},&&{1, 1, 1, 1},&&{1, 1, 1, 1},&&{1, 1, 1, 1}};signed long beats = 0;&&//电机转动节拍总数void KeyDriver();void main(){&&&&EA = 1;&&&&&& //使能总中断&&&&TMOD = 0x01;&&//设置T0为模式1&&&&TH0&&= 0xFC;&&//为T0赋初值0xFC67,定时1ms&&&&TL0&&= 0x67;&&&&ET0&&= 1;&&&& //使能T0中断&&&&TR0&&= 1;&&&& //启动T0&&&&&&&&while (1)&&&&{&&&&&&&&KeyDriver();&& //调用按键驱动函数&&&&}}/* 步进电机启动函数,angle-需转过的角度 */void StartMotor(signed long angle){&&&&//在计算前关闭中断,完成后再打开,以避免中断打断计算过程而造成错误&&&&EA = 0;&&&&beats = (angle * 4076) / 360; //实测为4076拍转动一圈&&&&EA = 1;}/* 步进电机停止函数 */void StopMotor(){&&&&EA = 0;&&&&beats = 0;&&&&EA = 1;}/* 按键动作函数,根据键码执行相应的操作,keycode-按键键码 */void KeyAction(unsigned char keycode){&&&&static bit dirMotor = 0;&&//电机转动方向&&&&&&&&if ((keycode&=0x30) && (keycode&=0x39))&&//控制电机转动1-9圈&&&&{&&&&&&&&if (dirMotor == 0)&&&&&&&&&&&&StartMotor(360*(keycode-0x30));&&&&&&&&else&&&&&&&&&&&&StartMotor(-360*(keycode-0x30));&&&&}&&&&else if (keycode == 0x26)&&//向上键,控制转动方向为正转&&&&{&&&&&&&&dirMotor = 0;&&&&}&&&&else if (keycode == 0x28)&&//向下键,控制转动方向为反转&&&&{&&&&&&&&dirMotor = 1;&&&&}&&&&else if (keycode == 0x25)&&//向左键,固定正转90度&&&&{&&&&&&&&StartMotor(90);&&&&}&&&&else if (keycode == 0x27)&&//向右键,固定反转90度&&&&{&&&&&&&&StartMotor(-90);&&&&}&&&&else if (keycode == 0x1B)&&//Esc键,停止转动&&&&{&&&&&&&&StopMotor();&&&&}}/* 按键驱动函数,检测按键动作,调度相应动作函数,需在主循环中调用 */void KeyDriver(){&&&&unsigned char i,&&&&static unsigned char backup[4][4] = {&&//按键值备份,保存前一次的值&&&&&&&&{1, 1, 1, 1},&&{1, 1, 1, 1},&&{1, 1, 1, 1},&&{1, 1, 1, 1}&&&&};&&&&&&&&for (i=0; i&4; i++)&&//循环检测4*4的矩阵按键&&&&{&&&&&&&&for (j=0; j&4; j++)&&&&&&&&{&&&&&&&&&&&&if (backup[j] != KeySta[j])&&&&//检测按键动作&&&&&&&&&&&&{&&&&&&&&&&&&&&&&if (backup[j] != 0)&&&&&&&&&& //按键按下时执行动作&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&KeyAction(KeyCodeMap[j]); //调用按键动作函数&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&backup[j] = KeySta[j];&&&& //刷新前一次的备份值&&&&&&&&&&&&}&&&&&&&&}&&&&}}/* 按键扫描函数,需在定时中断中调用,推荐调用间隔1ms */void KeyScan(){&&&&&&&&static unsigned char keyout = 0;&& //矩阵按键扫描输出索引&&&&static unsigned char keybuf[4][4] = {&&//矩阵按键扫描缓冲区&&&&&&&&{0xFF, 0xFF, 0xFF, 0xFF},&&{0xFF, 0xFF, 0xFF, 0xFF},&&&&&&&&{0xFF, 0xFF, 0xFF, 0xFF},&&{0xFF, 0xFF, 0xFF, 0xFF}&&&&};&&&&//将一行的4个按键值移入缓冲区&&&&keybuf[keyout][0] = (keybuf[keyout][0] && 1) | KEY_IN_1;&&&&keybuf[keyout][1] = (keybuf[keyout][1] && 1) | KEY_IN_2;&&&&keybuf[keyout][2] = (keybuf[keyout][2] && 1) | KEY_IN_3;&&&&keybuf[keyout][3] = (keybuf[keyout][3] && 1) | KEY_IN_4;&&&&//消抖后更新按键状态&&&&for (i=0; i&4; i++)&&//每行4个按键,所以循环4次&&&&{&&&&&&&&if ((keybuf[keyout] & 0x0F) == 0x00)&&&&&&&&{&& //连续4次扫描值为0,即4*4ms内都是按下状态时,可认为按键已稳定的按下&&&&&&&&&&&&KeySta[keyout] = 0;&&&&&&&&}&&&&&&&&else if ((keybuf[keyout] & 0x0F) == 0x0F)&&&&&&&&{&& //连续4次扫描值为1,即4*4ms内都是弹起状态时,可认为按键已稳定的弹起&&&&&&&&&&&&KeySta[keyout] = 1;&&&&&&&&}&&&&}&&&&//执行下一次的扫描输出&&&&keyout++;&&&&&&&&&&&&&&&&//输出索引递增&&&&keyout = keyout & 0x03;&&//索引值加到4即归零&&&&switch (keyout)&&&&&&&&&&//根据索引,释放当前输出引脚,拉低下次的输出引脚&&&&{&&&&&&&&case 0: KEY_OUT_4 = 1; KEY_OUT_1 = 0;&&&&&&&&case 1: KEY_OUT_1 = 1; KEY_OUT_2 = 0;&&&&&&&&case 2: KEY_OUT_2 = 1; KEY_OUT_3 = 0;&&&&&&&&case 3: KEY_OUT_3 = 1; KEY_OUT_4 = 0;&&&&&&&&default:&&&&}}/* 电机转动控制函数 */void TurnMotor(){&&&&&&//临时变量&&&&static unsigned char index = 0;&&//节拍输出索引&&&&unsigned char code BeatCode[8] = {&&//步进电机节拍对应的IO控制代码&&&&&&&&0xE, 0xC, 0xD, 0x9, 0xB, 0x3, 0x7, 0x6&&&&};&&&&&&&&if (beats != 0)&&//节拍数不为0则产生一个驱动节拍&&&&{&&&&&&&&if (beats & 0)&&//节拍数大于0时正转&&&&&&&&{&&&&&&&&&&&&index++;&&&&&&&&&&&&&& //正转时节拍输出索引递增&&&&&&&&&&&&index = index & 0x07;&&//用&操作实现到8归零&&&&&&&&&&&&beats--;&&&&&&&&&&&&&& //正转时节拍计数递减&&&&&&&&}&&&&&&&&else&&&&&&&&&&&&//节拍数小于0时反转&&&&&&&&{&&&&&&&&&&&&index--;&&&&&&&&&&&&&& //反转时节拍输出索引递减&&&&&&&&&&&&index = index & 0x07;&&//用&操作同样可以实现到-1时归7&&&&&&&&&&&&beats++;&&&&&&&&&&&&&& //反转时节拍计数递增&&&&&&&&}&&&&&&&&tmp = P1;&&&&&&&&&&&&&&&&&&&&//用tmp把P1口当前值暂存&&&&&&&&tmp = tmp & 0xF0;&&&&&&&&&&&&//用&操作清零低4位&&&&&&&&tmp = tmp | BeatCode[index]; //用|操作把节拍代码写到低4位&&&&&&&&P1&&=&&&&&&&&&&&&&&&&&& //把低4位的节拍代码和高4位的原值送回P1&&&&}&&&&else&&//节拍数为0则关闭电机所有的相&&&&{&&&&&&&&P1 = P1 | 0x0F;&&&&}}/* T0中断服务函数,用于按键扫描与电机转动控制 */void InterruptTimer0() interrupt 1{&&&&static bit div = 0;&&&&&&&&TH0 = 0xFC;&&//重新加载初值&&&&TL0 = 0x67;&&&&KeyScan();&& //执行按键扫描&&&&//用一个静态bit变量实现二分频,即2ms定时,用于控制电机&&&&div = ~&&&&if (div == 1)&&&&{&&&&&&&&TurnMotor();&&&&}}
謝謝分享!
很实用的程序,楼主辛苦,谢谢分享!
UID:1115275
在线时间725小时
M币5301专家2
&发表于: 01-11
很实用的程序,楼主辛苦,谢谢分享!
UID:1384041
在线时间3793小时
M币2814专家7
&发表于: 01-12
謝謝分享!
UID:1969245
在线时间450小时
M币2835专家6
&发表于: 01-12
谢谢楼主分享
访问内容超出本站范围,不能确定是否安全
温馨提示:所有技术区严禁灌水,“沙发”“顶”字样;禁止广告贴;以免被删除
您目前还是游客,请
&回复后跳转到最后一页
Code by , Time now is:04-19 13:45, Total 0.105922(s) query 5,
Gzip enabled& 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
51单片机实现步进电机通过独立按键控制顺、逆时针旋转, 并且在数码管上显示出旋转的角度 doc
下载积分:300
内容提示:51单片机实现步进电机通过独立按键控制顺、逆时针旋转, 并且在数码管上显示出旋转的角度 doc
文档格式:PDF|
浏览次数:123|
上传日期: 23:24:17|
文档星级:
该用户还上传了这些文档
51单片机实现步进电机通过独立按键控制顺、逆时针旋转
官方公共微信}

我要回帖

更多关于 步进电机转动角度 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信