找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机仿真步进电机设定旋转度数 附源程序

[复制链接]
跳转到指定楼层
楼主
ID:197152 发表于 2020-11-16 20:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
步进电机控制旋转度数,能控制开关,以及液晶显示,通过按键设定正反转度数。能够设置正反转。
仿真运行如下图所示!

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


单片机源程序如下:
  1. #include <reg52.h>
  2. unsigned long beats=0;
  3. int set=0;
  4. sbit k2=P3^1;
  5. sbit k3=P3^2;
  6. sbit K1=P3^0;
  7. sbit k4=P3^3;
  8. #define                DATA        P0     //1602驱动端口
  9. int flag=0,flag2=0,flag3=0;
  10. int i;
  11. unsigned char S1,S2,S3;
  12. sbit                 RS=                P2^0;
  13. sbit                 RW=                P2^1;
  14. sbit                 E=                P2^2;
  15.         unsigned char tmp;
  16.         static unsigned char index=0;
  17.                           unsigned char phasefz[8] ={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};//正转 电机导通相序 D-C-B-A
  18.         unsigned char phasezz[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};//反转 电机导通相序 A-B-C-D
  19. //判断忙指令
  20. void Busy()
  21. {
  22.         DATA = 0xff;
  23.         RS = 0;
  24.         RW = 1;
  25.            while(DATA & 0x80)
  26.            {
  27.                 E = 0;
  28.                    E = 1;
  29.            }
  30.            E = 0;
  31. }

  32. //写指令程序
  33. void WriteCommand(unsigned char btCommand)
  34. {
  35.         Busy();
  36.         RS = 0;
  37.         RW = 0;
  38.         E = 1;
  39.         DATA = btCommand;
  40.         E = 0;
  41. }

  42. //写数据程序
  43. void WriteData(unsigned char btData)
  44. {
  45.         Busy();
  46.         RS = 1;
  47.         RW = 0;
  48.         E = 1;
  49.         DATA = btData;
  50.         E = 0;
  51. }

  52. //清屏显示
  53. void Clear()
  54. {
  55.         WriteCommand(1);
  56. }

  57. //初始化
  58. void Init()
  59. {
  60.         WriteCommand(0x0c);        //开显示,无光标显示
  61.         WriteCommand(0x06);        //文字不动,光标自动右移
  62.         WriteCommand(0x38);        //设置显示模式:8位2行5x7点阵
  63. }

  64. //显示单个字符
  65. void DisplayOne(bit bRow, unsigned char btColumn, unsigned char btData, bit bIsNumber)
  66. {
  67.         if (bRow)                 WriteCommand(0xc0 + btColumn);
  68.         else                      WriteCommand(0x80 + btColumn);

  69.         if (bIsNumber)         WriteData(btData + 0x30);
  70.         else                   WriteData(btData);
  71. }

  72. //显示字符串函数
  73. void DisplayString(bit bRow, unsigned char btColumn, unsigned char *pData)
  74. {
  75.         while (*pData != '\0')
  76.            {
  77.                    if (bRow) WriteCommand(0xc0 + btColumn);        //显示在第1行
  78.                    else            WriteCommand(0x80 + btColumn);        //显示在第0行
  79.                 WriteData(*(pData++));                                                //要显示的数据
  80.                 btColumn++;                                                                        //列数加一
  81.            }
  82. }


  83. void startmotor(unsigned long angle);
  84. void key()
  85. {
  86.         if(K1==0)
  87.         {
  88.          flag2++;
  89.                 while(K1==0);
  90.         }
  91.        
  92.        
  93. if(k2==0)
  94. {
  95. set++;
  96.          if(set>180) set=180;
  97.          while(k2==0);
  98. }


  99.   if(k3==0)
  100. {
  101. set--;
  102.          if(set<=0) set=0;
  103.          while(k3==0);
  104. }


  105. if(k4==0)
  106. {
  107.   flag++;
  108.          while(k4==0);
  109. }

  110. }
  111. void display()
  112. {
  113.         S1  = (unsigned char)set / 100;
  114.         S2  = (unsigned char)set % 100 / 10;
  115.         S3   = (unsigned char)set % 10;
  116.         DisplayOne(1,6,S1,1);
  117.         DisplayOne(1,7,S2,1);
  118.         DisplayOne(1,8,S3,1);
  119.                                                                 if(flag%2==0)  {DisplayString(1,5,"+");}
  120.                                               if(flag%2==1)  {DisplayString(1,5,"-");}

  121. }
  122. void main()
  123. {      
  124.         EA=1;
  125.         TMOD=0X01;
  126.         TH0=0XF8;//2ms
  127.         TL0=0XCD;
  128.         ET0=1;
  129.         TR0=1;
  130.              Init();
  131.         flag3=1;
  132.               DisplayString(0,2,"MOTOR: OOF");
  133.         while(1)
  134.         {   

  135.                 key();
  136.                    display();                 
  137.               if(flag2%2==1)
  138.                                 {
  139.                                 DisplayString(0,2,"MOTOR:  ON");
  140.                                 for(i=0;i<1;i++)
  141.      {                                       
  142.         startmotor(set);
  143.      }
  144.       
  145.                  flag2++;
  146.                                 }
  147.                
  148.                        
  149.                         }                       
  150.                        
  151. }
  152. void startmotor(unsigned long angle)
  153. {
  154.         EA=0;
  155.         beats=(angle*4076)/360;  //防止因为中断导致计算错误,因为以后的中断中需要使用到beats
  156.         EA=1;
  157. ……………………

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

所有资料51hei提供下载:
步进.zip (95.88 KB, 下载次数: 100)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:841557 发表于 2020-11-17 09:46 | 只看该作者
大神,我做的 步进电机仿真里转,实物连线就没有反应,可以 帮我看看程序吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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