[51单片机] 程序定为步进电机2.5周,可是实际为10周了。请赐教

[复制链接]
870|2
 楼主| 小分子 发表于 2016-8-16 07:41 | 显示全部楼层 |阅读模式
  1. /********************************
  2. 用定时中断实现步进电机反转两周半
  3. ********************************/

  4. #include <reg52.h>

  5. #define uchar unsigned char
  6. #define ulong unsigned long

  7. void Timer0Init(void);                                                          //定时器0初始化声明
  8. void MotorAngle(ulong angle);                                          //步进电机角度函数声明
  9. ulong g_Beats = 0;                                                                  //两周半的节拍数

  10. void main(void)
  11. {
  12.         Timer0Init();
  13.         MotorAngle(360*2+180);                                                  //两周360*2度加半周180度
  14.         while (1);       
  15. }

  16. void Timer0Init(void)
  17. {
  18.         EA = 1;
  19.         TMOD |= 0x01;
  20.         TH0 = 0xF8;                                                                    //定时1MS一个节拍
  21.         TL0 = 0xCD;
  22.         ET0 = 1;
  23.         TR0 = 1;
  24. }

  25. void MotorAngle(ulong angle)
  26. {
  27.         EA = 0;                                                                           //防止总节拍数没有算完就开启中断,LONG型数所点四个字节,而单片机为8位的。
  28.         g_Beats = (angle * 4076) / 360;                           //计算两周半共有多少节拍
  29.         EA = 1;
  30. }
  31. void Timer0Interrupt() interrupt 1
  32. {
  33.         static uchar index = 0;
  34.         uchar temp;
  35.         uchar code BeatCode[8] = {0x0E,0x0C,0x0D,0x09,
  36.                                                           0x0B,0x03,0x07,0x06};
  37.         TH0 = 0xF8;
  38.         TL0 = 0xCD;

  39.         if (g_Beats != 0)
  40.         {
  41.                 temp = P1;                                                                        //用temp暂存P1口的值
  42.                 temp = temp & 0xF0;                                                        //只对P1口的低四位进行操作,要保护好高四位
  43.                 P1= temp | BeatCode[index];                                        //把节拍数送到P1口的低四位
  44.                 index ++;
  45.                 index &= 0x07;                                                                 //8个节拍后重新归0;
  46.                 g_Beats --;                                                                        //节拍数递减1;
  47.         }
  48.         else
  49.                 P1 |= 0x0F;                                                                        //节拍数等于零时,关闭步进电机。
  50. }

麻烦各位大师了。
 楼主| 小分子 发表于 2016-8-16 11:09 | 显示全部楼层
大神们。抽出时间,给看一看。拜托了。
 楼主| 小分子 发表于 2016-9-1 22:41 | 显示全部楼层
自己结贴了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

68

帖子

1

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