[51单片机] 步进电机反转一圈简单实例

[复制链接]
974|0
 楼主| 小分子 发表于 2016-8-25 21:46 | 显示全部楼层 |阅读模式
  1. #include <reg52.h>

  2. #define uchar unsigned char

  3. long g_Beats = 0;

  4. void Timer0Init();
  5. void TurnMotor(long angle);

  6. void main()
  7. {
  8.         Timer0Init();
  9.         TurnMotor(360);
  10.         while(1);
  11. }

  12. void Timer0Init()
  13. {
  14.         TMOD |= 0x01;
  15.         TH0 = 0xFC;                                                 //定时1个MS;
  16.         TL0 = 0x66;
  17.         EA = 1;
  18.         ET0 = 1;
  19.         TR0 = 1;
  20. }
  21. void TurnMotor(long angle)
  22. {
  23.         EA = 0;
  24.         g_Beats = (angle * 4076) / 360;
  25.         EA = 1;
  26. }
  27. void Timer0IRQ() interrupt 1
  28. {
  29.         static uchar index = 0;
  30.         uchar temp;
  31.         uchar code BeatCode[8] = {0x01,0x03,0x02,0x06,
  32.                                                            0x04,0x0C,0x08,0x09};
  33.         TH0 = 0xFC;
  34.         TL0 = 0x66;
  35.        
  36.         if (g_Beats != 0)
  37.         {
  38.                 temp = P1;                                                                        //用temp暂存P1口的值
  39.                 temp = temp & 0xF0;                                                        //只对P1口的低四位进行操作,要保护好高四位
  40.                 P1 = temp | BeatCode[index];                                //把节拍数送到P1口的低四位
  41.                 index++;
  42.                 index &= 0x07;                                                                 //8个节拍后重新归0;
  43.                 g_Beats--;                                                                        //节拍数递减1;
  44.         }
  45.         else
  46.                 P1 |= 0x0F;                                                                        //节拍数等于零时,关闭步进电机。
  47.        
  48. }

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

本版积分规则

18

主题

68

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部