找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3033|回复: 0
收起左侧

步进电机&ULN2003和直流电机&L298驱动与正反转实验,单片机代码加仿真

[复制链接]
ID:524443 发表于 2019-6-11 16:32 | 显示全部楼层 |阅读模式
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
_CQBYIHP`@[)B[0Y$)@TV}L.png

步进电机和直流电机能够单独工作,仿真开始,两个电机均不转动,然后通过按键控制对应的点击正反转,代码清晰,作者留有添加电机控速的代码空间,并且可以很简单的加入代码控速模块。
其中还有一些小细节,直流电机反转的时候,无法对步进电机进行操作,即在直流电机反转过程中,控制步进电机正反转的按钮无效。其余情况下,可随意控制直流电机和步进电机的正反转
系统还有工作指示灯,对应步进电机和直流电机工作情况。
此外,还提供了一个声光报警系统,当单刀双掷开关拨至阻塞时,电路报警,电路警示灯亮,蜂鸣器响,两个电机立刻停止工作。

单片机源程序如下:
  1. #include<reg52.h>
  2. #include<stdio.h>
  3. #include<intrins.h>

  4. #define uchar unsigned char
  5. #define uint unsigned int

  6. sbit key1=P3^0;  //用户按键
  7. sbit key2=P3^1;
  8. sbit key3=P3^5;
  9. sbit key4=P3^6;

  10. sbit danger=P3^2;

  11. sbit beez=P2^2;

  12. sbit PWM1=P3^3;
  13. sbit PWM2=P3^4;

  14. sbit led1=P2^0;
  15. sbit led2=P2^1;

  16. uchar code F_Rotation[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};  //步进电机驱动

  17. uchar i;
  18. uint flag1,flag2,flag3,flag4;
  19. /******************************************************************/
  20. /*                   延时函数Xms                                  */
  21. /******************************************************************/
  22. void delay(uint z)
  23. {
  24.         uint x,y;
  25.         for(x=z;x>0;x--)
  26.                 for(y=110;y>0;y--);
  27. }
  28. /******************************************************************/
  29. /*              独立按键扫描函数                                  */
  30. /******************************************************************/
  31. void keyscan()  
  32. {        
  33.         P3=0xff;//拉高P3,以读取P3口值
  34.         if(key1==0)//键1被按下
  35.         {
  36.                 delay(5);//延时消抖
  37.                 if(key1==0)
  38.                 {
  39.                         flag1++;
  40.                         flag1%=2;
  41.                 }
  42.                 while(!key1);
  43.                 delay(5);//延时消抖
  44.                 while(!key1);//松手检测
  45.         }
  46.         if(key2==0)
  47.         {
  48.                 delay(5);
  49.                 if(key2==0)
  50.                 {
  51.                         flag2++;
  52.                         flag2%=2;
  53.                 }
  54.                 while(!key2);
  55.                 delay(5);
  56.                 while(!key2);
  57.         }
  58.         if(key3==0)
  59.         {
  60.                 delay(5);
  61.                 if(key3==0)
  62.                 {
  63.                         flag3++;
  64.                         flag3%=2;
  65.                 }
  66.                 while(!key3);
  67.                 delay(5);
  68.                 while(!key3);
  69.         }
  70.         if(key4==0)
  71.         {
  72.                 delay(5);
  73.                 if(key4==0)
  74.                 {
  75.                         flag4++;
  76.                         flag4%=2;
  77.                 }
  78.                 while(!key4);
  79.                 delay(5);
  80.                 while(!key4);
  81.         }
  82. }
  83. void main()
  84. {
  85.         TMOD=0x01;
  86.         EA=1;
  87.         EX0=1;
  88.         ET0=0;

  89.         TH0=(65536-(14648))/256;
  90.         TL0=(65536-(14648))%256;

  91.         TR0=0;
  92.        
  93.         while(1)
  94.         {
  95.                 //步进正转
  96.                 keyscan();
  97.                 while(flag1==1)
  98.                 {
  99.                         led1=0;
  100.                         keyscan();
  101.                         if(!flag1){ led1=1; led2=1; break;}
  102.                         if(flag2){ led1=1; led2=1; flag1=0; break;}
  103.                         if(flag3){ led1=1; led2=1; flag1=0; break;}
  104.                         if(flag4){ led1=1; led2=1; flag1=0; break;}
  105.                         for(;i<8;i++)
  106.                         {
  107.                                 keyscan();
  108.                                 P1 = F_Rotation[i];
  109.                                 if(!flag1){ led1=1; led2=1; break;}
  110.                                 if(flag2){ led1=1; led2=1; flag1=0; break;}
  111.                                 if(flag3){ led1=1; led2=1; flag1=0; break;}
  112.                                 if(flag4){ led1=1; led2=1; flag1=0; break;}
  113.                                 delay(100);
  114.                         }
  115.                         i=0;
  116.                         led1=1;
  117.                 }
  118.                 //步进反转
  119.                 keyscan();
  120.                 while(flag2==1)
  121.                 {
  122.                         led1=0;
  123.                         keyscan();
  124.                         if(flag1){ led1=1; led2=1; flag2=0; break;}
  125.                         if(!flag2){ led1=1; led2=1; break;}
  126.                         if(flag3){ led1=1; led2=1; flag2=0; break;}
  127.                         if(flag4){ led1=1; led2=1; flag2=0; break;}
  128.                         for(;i>0;i--)
  129.                         {
  130.                                 keyscan();
  131.                                 P1 = F_Rotation[i];
  132.                                 if(flag1){ led1=1; led2=1; flag2=0; break;}
  133.                                 if(!flag2){ led1=1; led2=1; break;}
  134.                                 if(flag3){ led1=1; led2=1; flag2=0; break;}
  135.                                 if(flag4){ led1=1; led2=1; flag2=0; break;}
  136.                                 delay(100);
  137.                         }
  138.                         i=8;
  139.                         led1=1;
  140.                 }
  141.                 //直流正转
  142.                 keyscan();
  143.                 while(flag3==1)
  144.                 {
  145.                         led2=0;
  146.                         keyscan();
  147.                         if(flag1){ led1=1; led2=1; flag3=0; break;}
  148.                         if(flag2){ led1=1; led2=1; flag3=0; break;}
  149.                         if(!flag3){ led1=1; led2=1; break;}
  150.                         if(flag4){ led1=1; led2=1; flag3=0; break;}
  151.                         PWM1=0;
  152.                         PWM2=0;
  153.                         delay(100);
  154.                         PWM1=1;
  155.                         delay(100);
  156.                         led2=1;
  157.                 }
  158.                 //直流反转
  159.                 keyscan();
  160.                 while(flag4==1)
  161.                 {
  162.                         led2=0;
  163.                         keyscan();
  164.                         if(flag1);
  165.                         if(flag2);
  166.                         if(flag3){ led1=1; led2=1; flag4=0; break;}
  167.                         if(!flag4){ led1=1; led2=1; break;}
  168.                         PWM1=0;
  169.                         PWM2=0;
  170.                         delay(100);
  171.                         PWM2=1;
  172.                         delay(100);
  173.                         led2=1;
  174.                 }
  175.         }

  176. }

  177. void int0(void) interrupt 0
  178. {
  179.         while(danger==0)
  180.         {
  181.                 beez=0;
  182.                 led1=1;
  183.                 led2=1;
  184.                 while(!danger);
  185.                 beez=1;
  186.         }
  187. }
复制代码

所有资料51hei提供下载:
步进电机加直流电机.rar (69.73 KB, 下载次数: 42)

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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