标题: 42步进电机控制单片机程序和原理图 [打印本页]
作者: 412489601 时间: 2016-10-21 17:04
标题: 42步进电机控制单片机程序和原理图
下面是仿真图:
- /****************************************Copyright (c)**************************************************
- **
- ** -----------------------------------------------------------------------------------------------------
- ** File Name :
- ** Version : V1.0.0
- ** Description :
- * 【外部晶振】: 11.0592mhz
- * 【主控芯片】: STC89C52
- * 【编译环境】: Keil μVisio4
- * 【程序功能】:
- * 【使用说明】:
- ** -----------------------------------------------------------------------------------------------------
- ** Author : Creavalia
- ** Date : 2016年10月19日
- ** -----------------------------------------------------------------------------------------------------
- ** Modify Person:
- ** Modify Date :
- ** Description :
- *********************************************************************************************************/
- // Includes --------------------------------------------------------------------------------------------
- #include<reg51.h>
- /********************************************************************************************************
- ** Marcos define
- *********************************************************************************************************/
- #define MotorTabNum 5
- unsigned char T0_NUM;
- //IO设置
- sbit K1 = P3^5; // 启动
- sbit K2 = P3^4; // 反向
- sbit K3 = P3^3; // 加速
- sbit K4 = P3^2; // 减速
- sbit FX = P2^4; // 方向
- sbit MotorEn = P2^5; // 使能
- sbit CLK = P2^6; // 脉冲
- //----数码管---------------
- sbit SMG1 = P2^0; //数码管第一位定义
- sbit SMG2 = P2^1; //数码管第二位定义
- sbit SMG3 = P2^2; //数码管第三位定义
- sbit SMG4 = P2^3; //数码管第四位定义
- int table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //共阴极数码管段值
- //int table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,}; //共阳极数码管段值
- unsigned char g_MotorSt = 0; // 启停
- unsigned char g_MotorDir = 0; // 正反
- //unsigned char MotorTab[6] = {200, 160, 120, 80, 40, 20};
- unsigned char MotorTab[6] = {12, 10, 8, 6, 4, 2};
- //unsigned char MotorTab[6] = {6, 5, 4, 3, 2, 1};
- signed char g_MotorNum = 0;
- //--------------
- void delayms(xms);
- void mDelay(unsigned int DelayTime); //延时函数
- void T0_Init();
- void KeyScan(void);
- void Display(void);
- // 主程序 main()
- void main(void)
- {
- unsigned char i;
- T0_Init(); // 定时器0 初始化
- MotorEn = 0; // L297 使能(只有智能,才能正常工作,否则停止)
- FX = 0;
- while(1)
- {
- KeyScan(); // 按键
- for(i=0; i<10; i++)
- Display();
- }
- }
- /********定时器初始化***********************************************************/
- void T0_Init()
- {
- TMOD = 0x01;
- TH0 = (65535-100)/256; // 1ms
- TL0 = (65535-100)%256;
- EA = 1;
- ET0 = 1;
- // TR0 = 1;
- }
- /********定时器中断*****************/
- void T0_time() interrupt 1
- {
- // TR0 = 0;
- TH0 = (65535-100)/256;
- TL0 = (65535-100)%256;
- T0_NUM++;
- if(T0_NUM >= MotorTab[g_MotorNum]) // 增加按键g_MotorNum++ 减小按键g_MotorNum--
- {
- T0_NUM = 0;
- CLK=CLK^0x01; // 输出脉冲
- }
- // TR0 = 1;
- }
- //-----按键控制---------------------
- void KeyScan(void)
- {
- if(K1 == 0)
- {
- delayms(5); // 软件延时消抖
- if(K1 == 0)
- {
- while(!K1){Display();};
- g_MotorSt = g_MotorSt ^ 0x01;
- MotorEn ^= 1;
- TR0 = 1;
- }
- }
- if(K2 == 0)
- {
- delayms(10); // 软件延时消抖
- if(K2 == 0)
- {
- // while(!K2){Display();};
- g_MotorDir = g_MotorDir ^ 0x01;
- FX ^= 1;
- while(!K2){Display();};
- }
- }
- if(K3 == 0) // 加速
- {
- delayms(5); // 软件延时消抖
- if(K3 == 0)
- {
- while(!K3){Display();};
- g_MotorNum++;
- if(g_MotorNum > MotorTabNum)
- g_MotorNum = MotorTabNum;
- }
- }
- if(K4 == 0) // 减速
- {
- delayms(5); // 软件延时消抖
- if(K4 == 0)
- {
- while(!K4){Display();};
- g_MotorNum--;
- if(g_MotorNum < 0)
- g_MotorNum = 0;
- }
- }
- }
- /******************************************************************************
- * 名称: Set_Display()
- * 功能: 数码管显示函数
- * 输入: 无
- * 输出: 无
- * 说明:
- ******************************************************************************/
- void Display(void)
- {
- unsigned char b1, b2;
- b1=g_MotorNum/10;
- b2=g_MotorNum%10;
- if(FX == 0)
- P0=0x71;//显示F
- else
- P0=0x79;
- SMG1=0;
- delayms(3);
- SMG1=1;
- P0=0x40;
- SMG2=0; //显示--
- delayms(3);
- SMG2=1;
- P0=table[b1];
- SMG3=0; //显示十位
- delayms(3);
- SMG3=1;
- P0=table[b2];
- SMG4=0;
- delayms(3); //显示个位
- SMG4=1;
- }
- /********************************延时函数***********************************************************/
- void delayms(xms)
- {
- unsigned int x,y;
- for(x=xms;x>0;x--)
- for(y=110;y>0;y--);
- }
- /*********************************************************************************************************
- ** End Of File
- ********************************************************************************************************/
复制代码
1、步进电机控制系统的主程序在对整个系统初始化后主要完成读键盘和处理键盘的功能,如图3-1所示:
图3-1 步进电机控制系统主程序流程图
系统上电复位后,先调用初始化子程序,对步进电机各端口,相关参数进行初始化,设置T0、T1工作方式控制字和时间常数。初始化完成后,步进电机处于停止状态,T0、T1定时器处于关闭状态。然后循环调用读键盘子程序和键盘处理子程序,等待中断,以便实现步进电机转动控制和转速的动态显示。
2、读键盘子程序流程图读键盘子程序流程图如图3-2所示:
图3-2读键盘子程序流程图
首先初始化实际键值参数为0FH,然后扫描P3口,与初始值比较,相等则说明没有键按下,不相等则软件消抖,以便确认是否真的有键按下。延时10ms后再次扫描P3口,第二次与初始值比较,若相等则表明前一次比较不相等是由抖动产生;如果相等则表明确实有键按下。此时保存键值到临时变量。接着第三次扫描键盘并与临时变量比较,若相等则循环,这是为了确保每一次按键只执行一次相应的处理程序。最后从临时变量取出键值送实际键值参数,为键盘处理子程序做准备。
3、 键盘处理子程序流程图按键处理子程序流程图如图3-3所示:
图3-3键盘处理子程序流程图
键盘处理子程序开始时要从存放实际键值的参数中取出刚读取到的键值送到累加器A,依次判断累加器A的低四位。若检测到低电平,则说明与该位对应的按键按下,从而转到相应的处理子程序段,完成相应的操作,实现相应的功能后返回。若没有检测到高电平,则返回。
步进电机的启停控制通过启停定时器0来实现,因为定时器0控制着脉冲信号的输出,关闭定时器0也就阻止了脉冲信号的输出。
4、 电机控制中断程序流程图定时器中断0服务程序流程图如图3-4所示:
图3-4定时器中断0服务程序流程图
定时器中断0服务程序的中断时间由当前的转速决定。进入中断程序后,首先要保护现场,再根据当前速度进行计算并查表得到T0定时时间常数,设置TH0和TL0的值。然后判断转动方向控制位的值,如果是0则控制脉冲信号循环左移并输出,如果是1则控制脉冲信号循环右移并输出。最后恢复现场,返回,等待下次中断。
通过用当前转速控制中断时间,控制了脉冲的输出频率,也就到达了控制步进电机转动速度的目的;通过检测方向控制位的电平,选择脉冲信号的循环左移或循环右移,控制了步进电机各引出端的接通顺序,也就到实现了步进电机转动方向的控制。
5、 数码显示中断程序流程图定时中断1服务程序流程图如图3-5所示:
图3-5定时中断1服务程序流程图
数码显示中断程序的定时时间为1ms。进入中断程序后,首先要保护现场,然后关闭个位数码管,根据当前转速求出十位与个位的值。查表得到十位的字段码送P1口,控制十位上的数码管显示。然后延时1ms,接着关闭十位数码管,查表得到个位的字段码送P1口,控制个位上的数码管显示。最后重新设置定时时间,恢复现场并返回。
作者: l851285812 时间: 2016-11-16 19:21
顶!d=====( ̄▽ ̄*)b
作者: shorr 时间: 2017-1-24 09:52
学习啊!!!!!!!
作者: qpzmg 时间: 2017-2-19 11:57
好资料,感谢分享
作者: hlywhp123 时间: 2017-2-19 23:34
谢谢提供
作者: 北方哥 时间: 2017-2-20 21:07
你这贴太好了。
作者: ljhya 时间: 2017-2-21 01:11
谢谢分享
作者: qxy 时间: 2017-2-24 13:26
感谢分享
作者: qxy 时间: 2017-2-24 13:26
感谢分享
作者: 胜战 时间: 2017-2-26 17:51
感谢楼主分享
作者: cymcym 时间: 2017-3-28 12:11
51单片机学习板能用这程序控制直流电机吗?
作者: 帅哥广 时间: 2017-5-5 08:30
好资料,感谢分享
作者: yuyuchenfeng 时间: 2017-6-1 16:48
下载下来看看,不知道怎么用,先摸索起来
作者: jwjjwj123 时间: 2017-6-2 12:20
谢谢分享!!!!
作者: gdatgb 时间: 2017-6-2 15:33
感谢楼主分享! 下载下来看看
作者: lehigh 时间: 2017-7-12 19:25
光给个代码,放着仿真图,尴尬
作者: tjaihy 时间: 2017-7-23 11:04
楼主,这个程序是L297驱动程序吧 ?请问L298的有吗 ?
作者: q1833605807 时间: 2017-8-7 19:10
楼主有mirostep driver驱动的嘛
作者: haxiny 时间: 2017-8-14 10:30
目前正好需要这个。 谢谢楼主分享!
作者: shiftshift 时间: 2017-8-20 22:13
谢谢分享!!!!!!!
作者: 走着走着就散了 时间: 2017-9-20 12:07
正好在做个东西,谢谢分享
作者: woaiheihei 时间: 2017-9-20 18:30
学习了 谢谢
作者: cenadzkj 时间: 2017-9-26 22:53
感谢分享
作者: xymiss 时间: 2017-10-7 10:30
厉害,这个全面,按图接线试一下
作者: 583653368 时间: 2017-10-20 11:11
找了很久 应该有用 学习中
作者: mzw1997724 时间: 2017-11-24 14:56
感谢楼主分享
作者: huangbin6262 时间: 2017-11-27 16:16
很好的学习材料
作者: cxdtrj 时间: 2018-2-22 18:12
只有源码,没有仿真
作者: casanava 时间: 2018-3-3 11:32
楼主,你用的两相还是三相的步进电机?三相步进电机好象价格挺高哦
作者: 祝云章 时间: 2018-3-7 22:04
很好,感谢分享
作者: believe1 时间: 2018-3-12 17:02
非常感谢分享,很有帮助!
作者: dxk 时间: 2018-3-20 16:18
厉害厉害,受教了
作者: 龙行天下9558 时间: 2018-4-5 19:51
谢谢老铁的分享
作者: Q314703 时间: 2018-4-21 16:33
谢谢提供,很有启发
作者: superle 时间: 2018-4-27 16:17
没有PROTEUS仿真图啊
作者: 906267461 时间: 2018-4-28 11:57
谢谢分享
作者: shiwenyu 时间: 2018-4-28 21:42
厉害了,这个实用,不错
作者: 51学徒 时间: 2018-5-11 00:13
楼主,能把数码管改成lcd1602显示吗,有重赏
作者: 51学徒 时间: 2018-5-11 00:15
把数码管换乘lcd1602显示的程序有吗?有重谢
作者: mfkfnhyxk123 时间: 2018-5-14 21:29
谢谢分享
作者: hao05020 时间: 2018-6-16 21:33
谢谢分享
作者: xiahailong90 时间: 2018-6-26 12:10
谢谢分享
作者: AOP 时间: 2018-6-29 23:00
有人做过吗?效果如何。。。。。。。。。。。。。。。
作者: 小蜜蜂o 时间: 2018-9-9 16:08
是集成ic的,没有脉冲信息
作者: dww465757120 时间: 2018-9-12 13:30
说好的全部资料呢,为啥只有程序
作者: 亲卫队请问我去 时间: 2018-9-19 22:20
厉害了
作者: QNTAN 时间: 2018-10-26 20:12
厉害,这个全面,按图接线试一下
作者: rsm 时间: 2019-1-1 21:47
谢谢分享!
作者: 1696767363 时间: 2019-1-2 10:10
感谢楼主分享
作者: 快乐眼泪 时间: 2019-1-2 20:21
感谢楼主分享
作者: hufter 时间: 2019-4-9 21:46
为什么程序流程图看不到?
作者: luckzsh 时间: 2019-4-10 00:30
谢谢分享
作者: fangqiu0510 时间: 2019-5-21 20:38
谢谢分享
作者: 小屁歪歪 时间: 2019-12-14 18:16
厉害了,大佬
作者: 浮云人生 时间: 2020-2-19 15:15
可以用吗?
作者: 99312312 时间: 2020-2-20 08:49
谢谢分享 感恩付出 新手路过
作者: lbjjshh 时间: 2021-5-27 16:13
老哥们,请问流程图在哪里啊
作者: GHPWYC 时间: 2023-3-27 12:34
程序流程图可以分享吗,谢谢
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |