找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 12080|回复: 14
打印 上一主题 下一主题
收起左侧

单片机按键&串口控制步进电机正反转调速含程序和仿真

  [复制链接]
跳转到指定楼层
楼主
ID:163705 发表于 2017-8-11 08:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
        包含程序和仿真

        功能:按键或串口发送字符指令,控制步进电机正转、反转、停止、加速、减速动作

    仿真过程可直接通过按下电脑键盘控制

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include<reg52.h>
  2. #define uint  unsigned int
  3. #define uchar unsigned char
  4. //------8拍-----
  5. uchar code zz[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};                        //正转
  6. uchar code fz[]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};                        //反转

  7. sbit K1=P3^0;        //停止
  8. sbit K2=P3^1;        //正转
  9. sbit K3=P3^2;        //反转
  10. sbit K4=P3^3;        //加速
  11. sbit K5=P3^4;        //减速

  12. uchar state=0;        //状态变量

  13. uint Time=60;         //延时时间,用于调速

  14. unsigned char receiveData='0';

  15. void UsartConfiguration();           //初始化串口

  16. void delay(uint ms)                           //延时,用于调速
  17. {
  18.         uint t;
  19.         while(ms--)
  20.                 for(t=0;t<120;t++);
  21. }

  22. void motor_zz()                  //正传函数
  23. {
  24.         uint j;
  25.         for(j=0;j<8;j++)
  26.         {
  27.                 if(P3==0xfb)
  28.                         break;
  29.                 P1=zz[j];
  30.                 delay(Time);
  31.         }
  32. }

  33. void motor_fz()                  //反转函数
  34. {
  35.         uint j;
  36.         for(j=0;j<8;j++)
  37.         {
  38.                 if(P3==0xfb)
  39.                         break;
  40.                 P1=fz[j];
  41.                 delay(Time);
  42.         }
  43. }

  44. void main()
  45. {
  46.         UsartConfiguration();
  47.         while(1)
  48.         {
  49.                 while(state==0)                        //状态0,停止
  50.                 {
  51.                         if((K2==0)||(receiveData=='z'))           //按下K2或串口接收到'z',电机正转
  52.                         {
  53.                                 state=1;
  54.                                 receiveData='0';
  55.                                 break;
  56.                         }
  57.                         if((K3==0)||(receiveData=='f'))           //按下K3或串口接收到'f',电机反转
  58.                         {
  59.                                 state=2;
  60.                                 receiveData='0';
  61.                                 break;
  62.                         }
  63.                         P0=0xfb;
  64.                         P1=0x03;
  65.                 }

  66.                

  67.                 while(state==1)                        //状态1,正转
  68.                 {
  69.                         if((K1==0)||(receiveData=='t'))           //按下K1或串口接收到'f',电机反转
  70.                         {
  71.                                 state=0;
  72.                                 receiveData='0';
  73.                                 break;
  74.                         }
  75.                         if((K2==0)||(receiveData=='z'))                //按下K2或串口接收到'z',电机正转
  76.                         {
  77.                                 state=1;
  78.                                 receiveData='0';
  79.                                 break;
  80.                         }
  81.                         if((K3==0)||(receiveData=='f'))                //按下K3或串口接收到'f',电机反转
  82.                         {
  83.                                 state=2;
  84.                                 receiveData='0';
  85.                                 break;
  86.                         }
  87.                         if((K4==0)||(receiveData=='+'))                //按下K4或串口接收到'+',电机加速
  88.                         {
  89.                                 Time=Time-5;
  90.                                 if(Time<20)
  91.                                 Time=20;
  92.                                 while(K4==0);
  93.                         }
  94.                         if((K5==0)||(receiveData=='-'))                //按下K5或串口接收到'-',电机减速
  95.                         {
  96.                                 Time=Time+5;
  97.                                 if(Time>100)
  98.                                 Time=100;
  99.                                 while(K5==0);
  100.                         }
  101.                         motor_zz();                 //状态1,正转
  102.                 }

  103.                 while(state==2)                   //状态2,反转
  104.                 {
  105.                         if((K1==0)||(receiveData=='t'))                 //按下K1或串口接收到'f',电机反转
  106.                         {
  107.                                 state=0;
  108.                                 receiveData='0';
  109.                                 break;
  110.                         }
  111.                         if((K2==0)||(receiveData=='z'))                 //按下K2或串口接收到'z',电机正转
  112.                         {
  113.                                 state=1;
  114.                                 receiveData='0';
  115.                                 break;
  116.                         }
  117.                         if((K3==0)||(receiveData=='f'))                  //按下K3或串口接收到'f',电机反转
  118.                         {
  119.                                 state=2;
  120.                                 receiveData='0';
  121.                                 break;
  122.                         }
  123.                         if((K4==0)||(receiveData=='+'))                   //按下K4或串口接收到'+',电机加速
  124.                         {
  125.                                 Time=Time-5;
  126.                                 if(Time<20)
  127.                                 Time=20;
  128.                                 while(K4==0);
  129.                         }
  130.                         if((K5==0)||(receiveData=='-'))                   //按下K5或串口接收到'-',电机减速
  131.                         {
  132.                                 Time=Time+5;
  133.                                 if(Time>100)
  134.                                 Time=100;
  135.                                 while(K5==0);
  136.                         }
  137.                         motor_fz();                //状态2,反转
  138.                 }

  139.         }
  140. }

  141. /************************************************************************
  142. * 函数名         :UsartConfiguration()
  143. * 函数功能                   :设置串口
  144. * 输入           : 无
  145. * 输出                  : 无
  146. *************************************************************************/

  147. void UsartConfiguration()
  148. {
  149.         SCON=0X50;                        //设置为工作方式1
  150.         //TMOD=0X20;                        //设置计数器工作方式2
  151.         TMOD=0X21;                        //设置计数器工作方式2         和定时器0
  152.         PCON=0X80;                        //波特率加倍
  153. ……………………

  154. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
按键&amp;串口控制步进电机正反转调速.zip (163.03 KB, 下载次数: 644)



评分

参与人数 2黑币 +55 收起 理由
方法啊 + 5
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏10 分享淘帖 顶8 踩
回复

使用道具 举报

沙发
ID:258841 发表于 2017-12-7 21:35 | 只看该作者
楼主好棒棒!好资料,51黑有你更精彩!!!
回复

使用道具 举报

板凳
ID:305304 发表于 2018-4-12 12:26 来自手机 | 只看该作者
怎么打开
回复

使用道具 举报

地板
ID:282650 发表于 2018-5-24 22:40 | 只看该作者
打不开的改拓展名为rar
回复

使用道具 举报

5#
ID:243748 发表于 2018-6-21 11:04 来自手机 | 只看该作者
下载了,打不开,请问楼主这个用什么软件打开的?
回复

使用道具 举报

6#
ID:362567 发表于 2018-7-1 16:09 | 只看该作者
很不错的程序。谢谢楼主。
回复

使用道具 举报

7#
ID:366035 发表于 2018-7-11 10:25 | 只看该作者
那个黑屏是啥
回复

使用道具 举报

8#
ID:369596 发表于 2018-11-15 10:21 | 只看该作者
请问这个接线复杂吗?
回复

使用道具 举报

9#
ID:183659 发表于 2018-11-15 22:08 来自手机 | 只看该作者
谢谢大佬的资料
回复

使用道具 举报

10#
ID:427714 发表于 2018-11-16 14:39 | 只看该作者

用什么打开
回复

使用道具 举报

11#
ID:434106 发表于 2018-11-27 12:53 | 只看该作者
感谢大佬分享
回复

使用道具 举报

12#
ID:434106 发表于 2018-11-29 13:29 | 只看该作者
很有用 感谢分享
回复

使用道具 举报

13#
ID:891484 发表于 2021-3-15 14:00 | 只看该作者
怎么按按键电机没有反应
回复

使用道具 举报

14#
ID:97350 发表于 2021-5-15 16:04 | 只看该作者
为什么里面的仿真图只能用Proteus8.8打开?
回复

使用道具 举报

15#
ID:782212 发表于 2021-5-16 16:36 | 只看该作者
有交流电机调速的仿真能发我一份吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表