找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3413|回复: 1
收起左侧

应用51单片机实现对步进电机的控制源码

[复制链接]
ID:306449 发表于 2018-4-12 11:01 | 显示全部楼层 |阅读模式
此程序详细的讲述了如何应用51单片机实现对步进电机的控制

单片机源程序如下:
  1. #include<reg51.h>
  2. #define NUM 9
  3. #define SMG P0
  4. #define KEY P1
  5. typedef unsigned char u8;
  6. typedef unsigned int u16;
  7. sbit A0=P2^2;              //使用LED数码管显示
  8. sbit A1=P2^3;
  9. sbit A2=P2^4;
  10. sbit AX=P3^2;           //绿线A相输入定义,中断0口的第一个功能
  11. sbit BX=P3^3;
  12. int x,y;
  13. u8  KeyValue;

  14. u16 T0_NUM;
  15. u16 Zs,JS,b;
  16. u16 Bz;
  17. u8 list[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  18. u8 dis[4];


  19. sbit FX=P2^7;     // 方向
  20. sbit SN=P2^0;     // 使能
  21. sbit MC=P2^1;     // 脉冲

  22. u8 StarOrStop;     // 启停
  23. u8 Direct= 0;    // 正反


  24. u8 SpeedList[10] = {13,12,10,8,6,4,2,1};
  25. u8 Speed = 0;

  26. void delay(u16 time)
  27. {
  28.     while(time--);
  29. }

  30. void SMGdisPro()
  31. {
  32.     dis[0]=list[Zs/1000];
  33.     dis[1]=list[Zs%1000/100];
  34.     dis[2]=list[Zs%1000%100/10];
  35.     dis[3]=list[Zs/10];
  36. }

  37. void SMGdisplay()
  38. {
  39.     u8 i;
  40.     for(i=0;i<4;i++)
  41.     {
  42.         switch(i)
  43.         {
  44.             case(0):
  45.                 A2=0;A1=0;A0=0;
  46.                 break;
  47.             case(1):
  48.                 A2=0;A1=0;A0=1;
  49.                 break;
  50.             case(2):
  51.               A2=0;A1=1;A0=0;
  52.                 break;
  53.                         case(3):
  54.                           A2=0;A1=1;A0=1;
  55.                 break;

  56.         }
  57.         SMG=dis[3-i];
  58.         delay(50);
  59.         SMG=0x00;
  60.     }
  61. }

  62. void PID()
  63. {
  64.     if(Zs<300)
  65.         Speed++;
  66.     else if(Zs>300)
  67.         Speed--;   
  68. }


  69. void KeyFind()              //矩阵键盘扫描
  70. {
  71.     KEY=0x0f;
  72.     if(KEY!=0x0f)
  73.     {
  74.                 delay(2);         //消抖
  75.                 if(KEY!=0x0f)      
  76.                 {       
  77.                         //测试列
  78.                         KEY=0X0f;
  79.                         switch(KEY)
  80.                         {
  81.                                 case(0X07):        KeyValue=0;break;
  82.                                 case(0X0b):        KeyValue=1;break;
  83.                                 case(0X0d): KeyValue=2;break;
  84.                                 case(0X0e):        KeyValue=3;break;
  85.                         }
  86.                         //测试行
  87.                         KEY=0Xf0;
  88.                         switch(KEY)
  89.                         {
  90.                                 case(0X70):        KeyValue=KeyValue;break;      
  91.                                 case(0Xb0):        KeyValue=KeyValue+4;break;      
  92.                                 case(0Xd0): KeyValue=KeyValue+8;break;
  93.                                 case(0Xe0):        KeyValue=KeyValue+12;break;
  94.                         }
  95.             switch(KeyValue)
  96.             {
  97.                     case(0):
  98.                         {
  99.                           StarOrStop=StarOrStop^1;    //启动与停止
  100.                                 SN= !SN;
  101.                  
  102.                                break;
  103.                         }
  104.                         
  105.                 case(1):
  106.                                 {
  107.                                             Direct=Direct^1;            //不同为1,相同为0
  108.                         FX= !FX;
  109.                             break;
  110.                                     }
  111.               
  112.                 case(2):
  113.                                 {       
  114.                                         Speed++;
  115.                         if(Speed>NUM)
  116.                                 Speed=NUM;
  117.                             break;
  118.                                 }                       
  119.                 case(3):
  120.                                 {Speed--;
  121.                         if(Speed< 0)
  122.                                 Speed= 0;
  123.                                        
  124.                             break;
  125.                                 }
  126.                 case(4):
  127.                         {
  128.                             Bz=1;
  129.                             break;     
  130.                         }
  131.                 case(5):
  132.                         {
  133.                             Bz=0;
  134.                             break;
  135.                         }
  136.                 case(6):
  137.                                 {
  138.                                         b=1;
  139.                                 }
  140.                
  141.                 default:
  142.                     break;
  143.             }
  144.             KEY=0Xf0;
  145.             while(KEY!=0xf0);

  146.             }
  147.     }
  148. }
  149. void T0_Init()
  150. {
  151.         TMOD = 0x01;
  152.         TH0 = (65535-100)/256;  //定时1ms
  153.         TL0 = (65535-100)%256;
  154.         EA = 1;       //中断总开关
  155.         ET0 = 1;     //允许定时器中断0
  156.         TR0 = 1;    //打开定时器中断0

  157. }

  158. void zhuansu1()        //外部中断1初始化
  159. {
  160.     IT1=1;
  161.     EX1=1;
  162.     EA=1;
  163. }


  164. void main()
  165. {
  166.         T0_Init();             // 定时器0 初始化
  167.         zhuansu1();
  168.         SN= 0;     //驱动接口使能
  169.         FX = 0;     //初始化为正转
  170.         while(1)
  171.         {    KeyFind();              //检测按键
  172. SMGdisPro();
  173. SMGdisplay();

  174.                
  175.                                                                
  176.                 }

  177. }

  178. void T0_Time() interrupt 1
  179. {                static u16 i;
  180.         TR0 = 0;
  181.         TH0 = (65535-100)/256;   
  182.         TL0 = (65535-100)%256;
  183.                 T0_NUM++;
  184.         if(T0_NUM>=SpeedList[Speed])        // 增加按键Speed++   减小按键Speed--
  185.         {
  186.                 T0_NUM=0;
  187.                 MC=!MC;               //   输出脉冲
  188.         }
  189.                 i++;
  190.             if(i==1000)
  191.             {
  192.                     u8 m=0;
  193.                     i=0;
  194.                       if(Bz==1)
  195.                             {
  196.                                     Speed=5;
  197.                             }
  198.                        
  199.                                                            
  200.         Zs=JS*3;
  201.         JS=0;
  202.         i=0;
  203.         
  204.         if(Bz)
  205.             PID();
  206.        }
  207.                    if(b==1)
  208.                          {
  209.                                 b=0;
  210. ……………………

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

所有资料51hei提供下载:
步进电机.zip (46.82 KB, 下载次数: 37)
回复

使用道具 举报

ID:493996 发表于 2019-3-23 22:06 | 显示全部楼层
有没有仿真图
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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