找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于LCD1602的步进电机程序和原理图

[复制链接]
跳转到指定楼层
楼主
ID:86341 发表于 2015-7-21 11:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C51单片机写的步进电机程序,有需要拿去吧


  1. /***************************************************
  2. 程序使用1毫秒定时器中断实现转速精确控制
  3. 步进电机用8拍驱动(A-AB-B-BC-C-CD-D-DA)
  4. ****************************************************/
  5. #include <reg52.h>
  6. #include "LCD1602.H"


  7. #define   uchar unsigned char
  8. #define   uint  unsigned int
  9. #define   ulong unsigned long

  10. /*****端口定义************/
  11. #define P_key  P3
  12. sbit motor_a=P1^0;
  13. sbit motor_b=P1^1;
  14. sbit motor_c=P1^2;
  15. sbit motor_d=P1^3;

  16. bit   run=0;
  17. uint  speed;
  18. uint  temp_t1,temp_t2;
  19. uchar KeyValue ;
  20. uchar motor_step;

  21. void  Disply(void); //显示
  22. uchar GetKey(void);//返回键盘值0--16
  23. void  ScanKey(void);//键盘扫描处理
  24. void  SetMotorSpeed(uint nSpeed);//设置电机转速 nSpeed:转速 step/s
  25. void  delayNms(uint z);//延时

  26. /*****主函数************/
  27. void main()
  28. {
  29.    lcd1602_init();
  30.    motor_a=0;
  31.    motor_b=1;
  32.    motor_c=1;
  33.    motor_d=1;
  34.    motor_step=0;
  35.    TMOD = 0x01;
  36.    TH0 = 0x0FC;
  37.    TL0 = 0x18;
  38.    EA = 1;
  39.    ET0 = 1;
  40.    TR0 = 1;
  41.    while(1)
  42.    {
  43.     Disply();
  44.         ScanKey();
  45.    }
  46. }


  47. /*****延时************/  
  48. void delayNms(uint z)
  49. {
  50.         uint x;
  51.         for( ;z>0;z--)
  52.                 for(x=124;x>0;x--)
  53.                         ;
  54. }

  55. /*****设置电机转速************/
  56. void  SetMotorSpeed(uint nSpeed)// nSpeed:转速 step/s
  57. {
  58.   speed=nSpeed;
  59.   if(speed!=0)
  60.   {
  61.     run=1;
  62.         //计算每步需要多少毫秒
  63.         temp_t2=1000/nSpeed;
  64.   }
  65.   else
  66.   {
  67.     run=0;
  68.   }
  69. }


  70. /*****1毫秒定时器************/
  71. void Timer0Interrupt(void) interrupt 1
  72. {
  73.    if(run)
  74.    {
  75.      temp_t1++;
  76.          if(temp_t1>temp_t2)
  77.          {
  78.             temp_t1=0;
  79.             motor_step++;
  80.             if(motor_step>7)  motor_step=0;
  81.         switch (motor_step)
  82.             {
  83.                case 0:
  84.                {
  85.                   motor_a=0; motor_b=1;
  86.                       motor_c=1; motor_d=1;
  87.                       break;
  88.                 }
  89.                 case 1:
  90.                 {
  91.                   motor_a=0; motor_b=0;
  92.                       motor_c=1; motor_d=1;
  93.                       break;
  94.                 }
  95.                 case 2:
  96.                 {
  97.                   motor_a=1; motor_b=0;
  98.                       motor_c=1; motor_d=1;
  99.                       break;
  100.                 }
  101.                 case 3:
  102.                 {
  103.                   motor_a=1; motor_b=0;
  104.                       motor_c=0; motor_d=1;
  105.                       break;
  106.                 }
  107.                 case 4:
  108.                 {
  109.                   motor_a=1; motor_b=1;
  110.                       motor_c=0; motor_d=1;
  111.                       break;
  112.                 }
  113.                 case 5:
  114.                 {
  115.                   motor_a=1; motor_b=1;
  116.                       motor_c=0; motor_d=0;
  117.                       break;
  118.                 }
  119.                 case 6:
  120.                 {
  121.                   motor_a=1; motor_b=1;
  122.                       motor_c=1; motor_d=0;
  123.                       break;
  124.                 }
  125.                 case 7:
  126.                 {
  127.                   motor_a=0; motor_b=1;
  128.                       motor_c=1; motor_d=0;
  129.                       break;
  130.                 }
  131.                default: break;          
  132.              }
  133.                  
  134.           }
  135.         }
  136.     TH0 = 0x0FC;
  137.     TL0 = 0x18;
  138. }


  139. /***********显示************/
  140. void Disply( )
  141. {
  142.     uchar DisBuff[16];
  143.         DisBuff[0]='S';
  144.         DisBuff[1]='p';
  145.         DisBuff[2]='e';
  146.         DisBuff[3]='e';
  147.         DisBuff[4]='d';
  148.         DisBuff[5]=speed>9999 ? speed%100000/10000+0x30 : 0x20;
  149.         DisBuff[6]=speed>999 ? speed%10000/1000+0x30 : 0x20;
  150.         DisBuff[7]=speed>99 ? speed%1000/100+0x30 : 0x20;
  151.         DisBuff[8]=speed>9 ? speed%100/10+0x30 : 0x20;
  152.         DisBuff[9]=speed%10+0x30;
  153.         DisBuff[10]='s';
  154.         DisBuff[11]='t';
  155.         DisBuff[12]='e';
  156.         DisBuff[13]='p';
  157.         DisBuff[14]='/';
  158.         DisBuff[15]='s';
  159.         if(run)
  160.              lcd1602_showStr(0,0,"     Run        ");//第一行
  161.         else lcd1602_showStr(0,0,"     Stop       ");
  162.         lcd1602_showStr(0,1,DisBuff);//第二行
  163. }

  164. /***********返回键盘值0--16************/
  165. uchar GetKey()
  166. {
  167.   P_key=0xfe;
  168.   if((P_key&0x80)!=0x80) return 0x03;
  169.   if((P_key&0x40)!=0x40) return 0x07;
  170.   if((P_key&0x20)!=0x20) return 0x0b;
  171.   if((P_key&0x10)!=0x10) return 0x0f;
  172.   P_key=0xfd;
  173.   if((P_key&0x80)!=0x80) return 0x02;
  174.   if((P_key&0x40)!=0x40) return 0x06;
  175.   if((P_key&0x20)!=0x20) return 0x0a;
  176.   if((P_key&0x10)!=0x10) return 0x0e;
  177.   P_key=0xfb;
  178.   if((P_key&0x80)!=0x80) return 0x01;
  179.   if((P_key&0x40)!=0x40) return 0x05;
  180.   if((P_key&0x20)!=0x20) return 0x09;
  181.   if((P_key&0x10)!=0x10) return 0x0d;
  182.   P_key=0xf7;
  183.   if((P_key&0x80)!=0x80) return 0x00;
  184.   if((P_key&0x40)!=0x40) return 0x04;
  185.   if((P_key&0x20)!=0x20) return 0x08;
  186.   if((P_key&0x10)!=0x10) return 0x0c;
  187.   return 0xff;
  188. }

  189. /***********键盘扫描处理************/
  190. void ScanKey()          
  191. {
  192.   if(KeyValue==GetKey()) return;
  193.   delayNms(2); //防抖       
  194.   if(KeyValue==GetKey()) return;
  195.   KeyValue=GetKey();
  196.   switch(KeyValue)
  197.   {
  198.     case 0x00:        //按键0
  199.         {
  200.           SetMotorSpeed(0);
  201.           break;
  202.         }
  203.         case 0x01:        //按键1
  204.         {                                                                                               
  205.           SetMotorSpeed(5);
  206.           break;
  207.         }
  208.         case 0x02:        //按键2
  209.         {
  210.           SetMotorSpeed(10);
  211.           break;
  212.         }
  213.         case 0x03:        //按键3
  214.         {
  215.           SetMotorSpeed(15);
  216.           break;
  217.         }
  218.         case 0x04:        //按键4
  219.         {
  220.           SetMotorSpeed(20);
  221.           break;
  222.         }
  223.         case 0x05:        //按键5
  224.         {
  225.           SetMotorSpeed(25);
  226.           break;
  227.         }
  228.         case 0x06:        //按键6
  229.         {
  230.           SetMotorSpeed(30);
  231.           break;
  232.         }
  233.         case 0x07:        //按键7
  234.         {
  235.           SetMotorSpeed(35);
  236.           break;
  237.         }
  238.         case 0x08:        //按键8
  239.         {
  240.           SetMotorSpeed(40);
  241.           break;
  242.         }
  243.         case 0x09:        //按键9
  244.         {
  245.           SetMotorSpeed(45);
  246.           break;
  247.         }
  248.         case 0x0a: //按键A
  249.         {
  250.           SetMotorSpeed(50);
  251.           break;
  252.         }
  253.         case 0x0b: //按键B
  254.         {
  255.           SetMotorSpeed(55);
  256.           break;
  257.         }
  258.         case 0x0c: //按键C
  259.         {
  260.           SetMotorSpeed(60);
  261.           break;
  262.         }
  263.         case 0x0d: //按键D
  264.         {
  265.           SetMotorSpeed(65);
  266.           break;
  267.         }
  268.         case 0x0e: //按键E
  269.         {
  270.           SetMotorSpeed(70);
  271.           break;
  272.         }
  273.         case 0x0f://按键F
  274.         {
  275.           SetMotorSpeed(75);
  276.           break;
  277.         }

  278.         default: break;
  279.   }
  280. }
复制代码



lcd1602 motor.zip

79.56 KB, 下载次数: 52, 下载积分: 黑币 -5

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:88960 发表于 2015-8-27 14:06 | 只看该作者
真棒,感谢楼主分享
回复

使用道具 举报

板凳
ID:73762 发表于 2017-2-8 16:37 | 只看该作者
感谢楼主分享
回复

使用道具 举报

地板
ID:89286 发表于 2017-2-9 13:10 | 只看该作者
amazing, thanks for sharing
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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