找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机步进电机仿真时只会抖动几下不转动

[复制链接]
跳转到指定楼层
楼主
我在做步进电机的proteus仿真实验室,程序没错,但是步进电机只会在proteus运行时抖动几下,之后就不动了,不知道这是什么原因,
有知道的跟我说下,万分感谢!

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


单片机源程序如下:
  1. /*完整的C语言程序:*/
  2. #include <reg52.h>  //可用非常成功。
  3. #define uchar unsigned char  
  4. #define uint unsigned int

  5. unsigned char code table1[]={0x03,0x06,0x0c,0x09,0x09,0x0c,0x06,0x03};
  6. /*
  7.         0000,0011
  8.         0000,0110
  9.         0000,1100
  10.         0000,1001
  11. */
  12. //unsigned char code table2[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};  //共阴数码管 0~9
  13. unsigned char code table2[17] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  14. //0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
  15. uchar table_begin;  
  16. uint  maichong;             //脉冲
  17. uchar  zhuansu;             //转速
  18. uchar     flag;                 //方向
  19. sbit key_fuwei=P3^0;   //复位键
  20. sbit key_z=P3^1;            //正转键
  21. sbit key_f=P3^2;            //反转键
  22. sbit key_jia=P3^3;            //加速键
  23. sbit key_jian=P3^6;    //减速键

  24. sbit A1=P2^0;
  25. sbit A2=P2^1;
  26. sbit A3=P2^2;
  27. sbit A4=P2^3;
  28. void display();
  29. void delayms(xms);

  30. void delay(uchar x)  
  31. {
  32.         uchar i,j;                            //延时
  33.         for(i=0;i<x;i++)   
  34.                 for(j=100;j>0;j--);
  35. }
  36. void  fuwei(void)  //复位
  37. {
  38.         flag=2;//复位
  39.         zhuansu=0;
  40. }
  41. /*void Display(void)        //显示
  42. {
  43.         unsigned char b1, b2;
  44.         b1=zhuansu/10;               
  45.         b2=zhuansu%10;
  46.         if(flag == 0)      //0
  47.                 P0=0x71;//显示F
  48.     else
  49.                 P0=0x79;
  50.         A1=0;                                                         
  51.         delayms(3);
  52.         A1=1;

  53.         P0=0x40;
  54.         A2=0;         //显示--
  55.         delayms(3);
  56.         A2=1;

  57.         P0=table2[b1];
  58.         A3=0;         //显示十位
  59.         delayms(3);
  60.         A3=1;

  61.         P0=table2[b2];
  62.         A4=0;
  63.         delayms(3);   //显示个位
  64.         A4=1;
  65. } */



  66. void display()   
  67. {  
  68.         uchar b1,b2,b3,b4;     
  69.         if(flag==0)  
  70.                 P0=0x5e;//正转显示d
  71.     else
  72.         {
  73.                 if(flag==1)
  74.                         P0=0x7c;//反转显示b
  75.                 else
  76.                         P0=0x71;//复位显示F
  77.         }
  78.          
  79.         b1=10;   
  80.         b2=0x3f; // 显示0   
  81.         b3=zhuansu/10;   
  82.         b4=zhuansu%10;  
  83.         //P0=table2;  
  84.        
  85.         A1=0;  //P2.0
  86.         delay(1);  
  87.         A1=1;  
  88.        
  89.         P0=b2;      
  90.         A2=0;   //P2.1   
  91.         delay(1);  
  92.         A2=1;
  93.        
  94.         P0=table2[b3];  
  95.         A3=0;          //P2.3  显示转速的十位
  96.         delay(1);  
  97.         A3=1;  
  98.        
  99.         P0=table2[b4];
  100.         A4=0;   //P2.4  显示转速的个位
  101.         delay(1);  
  102.         A4=1;
  103. }
  104.   
  105. void key()                         //按键扫描
  106. {  
  107.         if(key_fuwei==0)   
  108.         {  
  109.                 delay(5);     
  110.                 if(key_fuwei==0)     
  111.                 fuwei();
  112.         }
  113.        
  114.         if(key_z==0)   
  115.         {
  116.                 delay(5);     
  117.                 if(key_z==0)   
  118.                 {
  119.                         flag=0;      
  120.                         zhuansu=10;      
  121.                         while(key_z==0);
  122.                 }
  123.         }
  124.        
  125.         if(key_f==0)   
  126.         {  

  127.                 delay(5);     
  128.                 if(key_f==0)   
  129.                 {  
  130.                         flag=1;      
  131.                         zhuansu=10;      
  132.                         while(key_f==0);
  133.                 }
  134.         }  
  135.        
  136.         if(key_jia==0)   
  137.         {   
  138.                 delay(5);     
  139.                 if(key_jia==0)   
  140.                 {   
  141.                         zhuansu++;      
  142.                         if(zhuansu==21)     
  143.                         zhuansu=20;      
  144.                         while(key_jia==0);
  145.                 }
  146.         }  
  147.         if(key_jian==0)   
  148.         {   
  149.                 delay(5);     
  150.                 if(key_jian==0)   
  151.                 {  
  152.                         zhuansu--;      
  153.                         if(zhuansu<=0)     
  154.                                 zhuansu=0;      
  155.                         while(key_jian==0);
  156.                 }
  157.         }
  158. }

  159. void dispose()  //脉冲函数
  160. {
  161.         switch(zhuansu)  
  162.         {

  163.                 case 0:     flag=2;          break;   
  164.                 case 1:     maichong=300;    break;   
  165.                 case 2:     maichong=295;    break;   
  166.                 case 3:     maichong=290;    break;   
  167.                 case 4:     maichong=280;    break;   
  168.                 case 5:     maichong=260;    break;   
  169.                 case 6:     maichong=240;    break;   
  170.                 case 7:     maichong=200;    break;   
  171.                 case 8:     maichong=180;    break;   
  172.                 case 9:     maichong=160;    break;   
  173.                 case 10:    maichong=120;    break;   
  174.                 case 11:    maichong=80;     break;   
  175.                 case 12:    maichong=70;     break;   
  176.                 case 13:    maichong=60;     break;   
  177.                 case 14:    maichong=40;     break;   
  178.                 case 15:    maichong=35;     break;   
  179.                 case 16:    maichong=30;     break;   
  180.                 case 17:    maichong=25;     break;   
  181.                 case 18:    maichong=20;     break;   
  182.                 case 19:    maichong=15;     break;   
  183.                 case 20:    maichong=10;     break;

  184.         }  
  185.         if(flag==0)   //正转
  186.                 table_begin=0;  
  187.         else   
  188.                 if(flag==1)   //反转  
  189.                         table_begin=4;
  190. }
  191. void zhuandong(void)
  192. {
  193.         uint i,j;   
  194.         if(zhuansu>0&&zhuansu<=20)   
  195.         {
  196.                 for(j=0+table_begin;j<4+table_begin;j++)   
  197.                 {
  198.                         P1=table1[j];   
  199.                         for(i=0;i<maichong;i++)    //既有显示功能,又有延时功能,转速越低延时越长
  200.                                 display();
  201.                 }
  202.         }
  203. }

  204. void main()
  205. {
  206.         fuwei();   
  207.         display();   
  208.         for(;;)  
  209.         {
  210.                 key();      
  211.                 dispose();   
  212.                 if(flag==2)     
  213.                         display();  
  214.                 else         
  215.                         zhuandong();  
  216.         }
  217. }     
复制代码

所有资料51hei提供下载:
步进电机调速 数码.zip (216.51 KB, 下载次数: 36)


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

使用道具 举报

沙发
ID:337692 发表于 2018-10-26 18:57 | 只看该作者
步进电机插反了
回复

使用道具 举报

板凳
ID:111634 发表于 2018-10-26 21:40 | 只看该作者
本帖最后由 zl2168 于 2018-10-27 22:32 编辑

实例98  驱动四相步进电机
Proteus仿真一下,确认有效。
实例98 四相步进电机.rar (35.83 KB, 下载次数: 25)


实例99  驱动二相步进电机
实例99 二相步进电机.rar (36.2 KB, 下载次数: 14)

以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社ISBN 978-7-302-41682-1内有常用的单片机应用100案例,用于仿真实验操作,电路与程序真实可靠可信可行。书中电路和程序设计有详细说明,程序语句条条有注解。
回复

使用道具 举报

地板
ID:94031 发表于 2018-10-27 08:25 | 只看该作者
电机重接一下就可以了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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