找回密码
 立即注册

QQ登录

只需一步,快速开始

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

步进电机仿真实验,亲测可用

[复制链接]
跳转到指定楼层
楼主
1 2控制正反转,加减控制转速。亲测可用

完整代码和仿真文件下载:http://www.51hei.com/bbs/dpj-20399-1.html
  1. #include"reg51.h"
  2. #include"intrins.h"
  3. #include"math.h"
  4. #include"absacc.h"
  5. #define  PORTA  XBYTE[0x8500]
  6. #define  PORTB  XBYTE[0x8502]
  7. #define  PORTC  XBYTE[0x8504]
  8. #define  PORTC0 XBYTE[0x8506]
  9. #define nop _nop_()
  10. #define Right_RUN  1
  11. #define Left_RUN  0
  12. unsigned long RunSpeed=76;
  13. unsigned  char  RUNState=1;
  14. sbit  RS=P2^0;
  15. sbit  RW=P2^1;
  16. sbit  E=P2^2;
  17. sbit P17=P1^7;
  18. bit   flag=0;
  19. unsigned char xx[]="speed(n/min):";
  20. unsigned char SD[]="76";
  21. char  state[2][14]={"direction:cw","direction:ccw"};
  22. unsigned char  FLG,INMA=0;
  23. unsigned  char  t,s=0x01;
  24. unsigned  int   a;
  25. main()
  26. {
  27.   void  OPJIAN();
  28.   unsigned char JIAN();
  29.   unsigned char JIANZHI();
  30.    void  speed();
  31. void  SHOW_LCD();
  32. void  show_state();
  33. void  write1();
  34. void  writ2(unsigned char i);
  35. void  delay();
  36. void time();
  37. void  busy();
  38. unsigned  char  i;
  39.   i=0x90;
  40.   PORTC0=i;
  41.   i=0x01;
  42.   TMOD=i;
  43.   t=0x10;
  44.   a=0x0f;
  45.   TH0=0x10;
  46.   TL0=0x0f;
  47.   FLG=INMA;  
  48.   SHOW_LCD();
  49.   show_state();
  50.   EA=1;
  51.   ET0=1;
  52.   TR0=1;
  53. while(1)
  54. {
  55. i=JIAN();
  56.      if(i!=0)
  57. {
  58.    time();
  59.    time();
  60.   }
  61. i=JIAN();
  62. if(i!=0)
  63. {
  64. INMA=JIANZHI();
  65.    OPJIAN();
  66.   time();
  67. }
  68.   if(FLG!=INMA||flag==1)
  69.    {  FLG=INMA;
  70.   SHOW_LCD();
  71.       show_state();
  72.   flag=0;
  73.   }
  74.   }
  75.   }
  76. void SHOW_LCD()/*lcd设置程序*/
  77. {
  78.   P1=0x38;
  79.   write1();
  80.   delay();
  81.   P1=0x38;
  82.   write1();
  83.   delay();
  84.   P1=0x38;
  85.   write1();
  86.   delay();
  87.   P1=0x01;
  88.   write1();
  89. delay();
  90.   P1=0x0f;
  91.   write1();
  92. delay();
  93.   P1=0x06;
  94.   write1();
  95.   delay();
  96.   P1=0x0c;
  97.   write1();
  98.   
  99. }
  100. void  show_state()/*状态显示程序*/
  101.   {
  102.    unsigned char i=0;
  103.    P1=0x80;
  104. write1();
  105. while(xx[i]!='\0')
  106.    {
  107.      writ2(xx[i]);
  108.    i++;
  109.    delay();
  110.    }
  111.    i=0;
  112.   while(SD[i]!='\0')
  113.     {
  114.    writ2(SD[i]);
  115.    delay();
  116.    i++;
  117.   
  118.    }
  119.    P1=0xc0;
  120.   write1();
  121.   i=0;
  122.   if(RUNState==Right_RUN)
  123.   while(state[0][i]!='\0')
  124.     {
  125.     writ2(state[0][i]);
  126.     i++;
  127.    }
  128. else
  129.    if(RUNState==Left_RUN)
  130.     while(state[1][i]!='\0')
  131.      {
  132.      writ2(state[1][i]);
  133.       i++;
  134.     }
  135.    }
  136. void  write1()/*lcd写控制字*/
  137. {
  138.    RS=0;
  139. RW=0;
  140. E=0;
  141. busy();
  142. E=1;
  143.   }
  144. void  writ2( unsigned char i)/*lcd写数据*/
  145. { P1=i;
  146.    RS=1;
  147. RW=0;
  148. E=0;
  149.    busy();
  150. E=1;
  151. }

  152. void delay()/*延时程序*/
  153. {
  154.   unsigned char  i;
  155.   for(i=0;i<100;i++)
  156.     {
  157.     i=i;
  158.   }
  159.   
  160. }
  161. void time()
  162. { unsigned char i,j;
  163. for(i=0;i<100;i++)
  164. {
  165. for(j=0;j<30;j++)
  166. {
  167.    j=j;
  168.   }
  169.   }
  170. }
  171. void busy()         //判断LCD是否忙
  172. {   
  173.   do
  174.   {
  175.   P1=0xff;
  176.    RS=0;
  177.      RW=1;
  178.      E=0;
  179.    nop;
  180.    E=1;
  181.    }while(P17==1);
  182.   
  183. }
  184. unsigned char JIAN()/*判断是否有键按下*/
  185. {
  186.   unsigned char  i,j;
  187.      i=0xff;
  188.      PORTA=i;
  189.      time();
  190.      i=0x00;
  191.      PORTB=i;
  192.      j=PORTA;
  193.      j=~j;
  194.      j=j&(0x0f);
  195.      return  j;
  196. }
  197. unsigned char JIANZHI()/*读键值程序*/
  198. {
  199.    unsigned i,j,d,k,m=1;
  200.   i=0xfe;
  201.   k=0x01;
  202.   do
  203.   {
  204.   PORTB=i;
  205.   j=PORTA;
  206.   m=j&(0x01);
  207.     if(m==0)
  208.     d=k/2;
  209.   else
  210.      {
  211.   m=j&(0x02);
  212.       if(m==0)
  213.      d=k/2+4;
  214.     else
  215.       {
  216.      m=j&(0x04);
  217.       if(m==0)
  218.       d=k/2+8;
  219.        else
  220.       {
  221.        m=j&(0x08);
  222.                   if(m==0)
  223.       d=k/2+12;
  224.       }
  225.          }
  226.        }
  227. k=k+2;
  228. i=i<<1;
  229. i=i|(0x01);
  230. }while(m!=0);
  231. return  d;
  232. }
  233. void OPJIAN() /* 键值处理程序*/
  234. {
  235.    switch(INMA)
  236. {
  237.    case 0x08:  {RUNState=Right_RUN;s=0xf7;}break;
  238.    case 0x09:  {RUNState=Left_RUN;s=0x01;}break;
  239.    case 0x0b:  {
  240.             flag=1;
  241.       t=t-2;
  242.       RunSpeed=5000000/(65536-t*256-a);
  243.       speed();}break;
  244.    case 0x0f:  {flag=1;
  245.                 t=t+2;
  246.                  RunSpeed=5000000/(65536-t*256-a);
  247.                  speed();}
  248. }
  249. }
  250. void speed()/*速度处理程序*/
  251. {
  252.   unsigned  char  i=0;
  253.   SD[0]=RunSpeed/100+48;
  254.   SD[1]=RunSpeed%100/10+48;
  255.   SD[2]=RunSpeed%10+48;
  256.   }
  257.   void time1(void) interrupt 1 using 2
  258.   {
  259.    TR0=0;
  260.    PORTC=s;
  261. if(RUNState==0)
  262. {
  263. s=(s<<1);
  264. if(s==0x10)
  265.    s=0x01;
  266. }
  267.    else
  268. {
  269.   s=s>>1;
  270. if(s==0x0f)
  271. s=0xf7;
  272.   }
  273.    TH0=t;
  274.   TL0=a;
  275.   TR0=1;
  276.   }
复制代码

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:196313 发表于 2017-5-4 00:24 | 只看该作者
楼主好人
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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