找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于51单片机的步进电机调速及下反转控制LCD显示程序+仿真

[复制链接]
跳转到指定楼层
楼主
    基于51单片机的步进电机调速及下反转控制LCD显示,实现步进电机转速调节以及步进电机正反转控制。
全部资料51hei下载地址:
基于51单片机的步进电机调速及正反转控制,LCD显示.zip (76.56 KB, 下载次数: 140)

单片机源程序如下:
  1. #include "AT89X51.h"

  2. int delay();
  3. void inti_lcd();
  4. void show_lcd(int);
  5. void cmd_wr();
  6. void ShowState();
  7. void clock(unsigned int Delay) ;
  8. void DoSpeed();       //计算速度
  9. //正转值
  10. #define RIGHT_RUN 1
  11. //反转值
  12. #define LEFT_RUN 0
  13. sbit RS=0xA0;
  14. sbit RW=0xA1;
  15. sbit E=0xA2;

  16. char SpeedChar[]="SPEED(n/min):";
  17. char StateChar[]="RUN STATE:";
  18. char STATE_CW[]="CW";
  19. char STATE_CCW[]="CCW";
  20. char SPEED[3]="050";
  21. unsigned int RunSpeed=50;                //速度
  22. unsigned char RunState=RIGHT_RUN;  //运行状态
  23. main()
  24. {
  25.         
  26.         /*定时器设置*/
  27.         TMOD=0x66;            //定时器0,1都为计数方式;方式2;
  28.         EA=1;                        //开中断
  29.         
  30.         TH0=0xff;                //定时器0初值FFH;
  31.         TL0=0xff;
  32.         ET0=1;
  33.         TR0=1;        
  34.         
  35.         TH1=0xff;                //定时器1初值FFH;
  36.         TL1=0xff;
  37.         ET1=1;
  38.         TR1=1;
  39.            
  40.         IT0=1;                        //脉冲方式
  41.         EX0=1;                        //开外部中断0:加速
  42.         IT1=1;                        //脉冲方式
  43.         EX1=1;                        //开外部中断1:减速

  44.     inti_lcd();
  45.     DoSpeed();      
  46.     ShowState();
  47.     while(1)
  48.     {
  49.       clock(RunSpeed);
  50.       P0_1=P0_1^0x01;
  51.     }

  52. }

  53. //定时器0中断程序:正转
  54. void t_0(void) interrupt 1
  55. {
  56.         RunState=RIGHT_RUN;        
  57.     P0_0=1;
  58.     P1=0x01;
  59.     cmd_wr();
  60.     ShowState();
  61. }


  62. //定时器1中断:反转
  63. void t_1(void) interrupt 3
  64. {
  65.         RunState=LEFT_RUN;
  66.     P0_0=0;
  67.     P1=0x01;
  68.     cmd_wr();
  69.     ShowState();

  70. }

  71. //中断0:加速程序
  72. void SpeedUp() interrupt 0
  73. {   
  74.        if(RunSpeed>=12)
  75.           RunSpeed=RunSpeed-2;
  76.        DoSpeed();
  77.        P1=0x01;
  78.        cmd_wr();
  79.        ShowState();

  80. }

  81. //中断1:减速程序
  82. void SpeedDowm() interrupt 2
  83. {   

  84.     if(RunSpeed<=100)
  85.         RunSpeed=RunSpeed+2;
  86.     DoSpeed();
  87.     P1=0x01;
  88.     cmd_wr();
  89.     ShowState();


  90. }

  91. int delay()         //判断LCD是否忙
  92. {   
  93.     int a;
  94. start:

  95.     RS=0;
  96.     RW=1;
  97.     E=0;
  98.     for(a=0;a<2;a++);
  99.     E=1;
  100.     P1=0xff;
  101.     if(P1_7==0)
  102.        return 0;
  103.     else        
  104.        goto start;

  105. }

  106. void inti_lcd()  //设置LCD方式
  107. {

  108.    P1=0x38;
  109.    cmd_wr();
  110.    delay();

  111.    P1=0x01;     //清除
  112.    cmd_wr();
  113.    delay();

  114.    P1=0x0f;
  115.    cmd_wr();
  116.    delay();

  117.    P1=0x06;
  118.    cmd_wr();
  119.    delay();

  120.    P1=0x0c;
  121.    cmd_wr();
  122.    delay();
  123. }

  124. void cmd_wr()           //写控制字
  125. {
  126.    RS=0;
  127.    RW=0;
  128.    E=0;
  129.    E=1;
  130. }

  131. void show_lcd(int i)   //LCD显示子程序
  132. {  
  133.    P1=i;
  134.    RS=1;
  135.    RW=0;
  136.    E=0;
  137.    E=1;

  138. }

  139. void ShowState()    //显示状态与速度
  140. {
  141.     int i=0;
  142.     while(SpeedChar[i]!='\0')
  143.     {
  144.        delay();
  145.        show_lcd(SpeedChar[i]);
  146.        i++;
  147.     }

  148.     delay();
  149.     P1=0x80 | 0x0d;
  150.     cmd_wr();

  151.     i=0;
  152.     while(SPEED[i]!='\0')
  153.     {
  154.        delay();
  155.        show_lcd(SPEED[i]);
  156.        i++;
  157.     }

  158.     delay();
  159.     P1=0xC0;
  160.     cmd_wr();

  161.     i=0;
  162.     while(StateChar[i]!='\0')
  163.     {
  164.        delay();
  165.        show_lcd(StateChar[i]);
  166.        i++;
  167.     }

  168.     delay();
  169.     P1=0xC0 | 0x0A;
  170.     cmd_wr();

  171.     i=0;
  172.     if(RunState==RIGHT_RUN)
  173.         while(STATE_CW[i]!='\0')
  174.         {
  175.           delay();
  176.           show_lcd(STATE_CW[i]);
  177.           i++;
  178.         }
  179.     else
  180.        while(STATE_CCW[i]!='\0')
  181.         {
  182.           delay();
  183.           show_lcd(STATE_CCW[i]);
  184.           i++;
  185.         }

  186. }
  187. void clock(unsigned int Delay)   //1ms延时程序
  188. {  unsigned int i;
  189.    for(;Delay>0;Delay--)
  190.     for(i=0;i<124;i++);

  191. }

  192. void DoSpeed()
  193. {
  194.     SPEED[0]=(1000*6/RunSpeed/100)+48;
  195.     SPEED[1]=1000*6/RunSpeed%100/10+48;
  196.     SPEED[2]=1000*6/RunSpeed%10+48;
  197. }
复制代码


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:636984 发表于 2019-11-7 14:40 | 只看该作者
我下载您的程序,线路图接法也是一样的,为什么我的显示屏不显示东西啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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