[求助] 为什么这个在中断中行,在主程序中就不行了呢?

leifu   2011-10-29 00:03 楼主
小弟写了一个程序,打算用定时器的方法来控制多个步进电机。
下面是程序。这个是在while循环中版本。还有一个,是在中断中的,在while中的步进电机不能转。但是在中断中就可以转了。为什么呢?
#include
#define uchar unsigned char
#define uint  unsigned int
uchar zheng[]={0x08,0x04,0x02,0x01};
uchar fan[]={0x01,0x02,0x04,0x08};   uchar k=0,i=0,j=0;
void main()
{  

  TMOD=0x01;
  TH0=(65536-50000)/256;//设置初值,每个计数周期计时50ms
  TL0=(65536-50000)%256;
  EA=1;                 //打开中断开关
  ET0=1;                //打开定时器中断
  TR0=1;                //打开定时器0
  while(1)
        {
          if(k%2==0 || k==0)
          {
            P0=zheng;
                i++;
                if(i>=4)
                i=0;
          }
        }
}
void timer0() interrupt 1
{
  TH0=(65536-50000)/256;//设置初值,每个计数周期计时50ms
  TL0=(65536-50000)%256;
  k++;
if(k>200)
k=0;
}



中断中写法。
#include
#define uchar unsigned char
#define uint  unsigned int
uchar zheng[]={0x08,0x04,0x02,0x01};
uchar fan[]={0x01,0x02,0x04,0x08};   uchar k=0,i=0,j=0;
void main()
{  

  TMOD=0x01;
  TH0=(65536-50000)/256;//设置初值,每个计数周期计时50ms
  TL0=(65536-50000)%256;
  EA=1;                 //打开中断开关
  ET0=1;                //打开定时器中断
  TR0=1;                //打开定时器0
  while(1)
        {
         ;
        }
}
void timer0() interrupt 1
{
  TH0=(65536-50000)/256;//设置初值,每个计数周期计时50ms
  TL0=(65536-50000)%256;
if(k%2==0 || k==0)
          {
            P0=zheng;
                i++;
                if(i>=4)
                i=0;
          }

  k++;
if(k>200)
k=0;
}

回复评论 (7)

P0=zheng;
这一句不对吧,zheng是个数组,你这样写是把数组的地址输出了,是不是应该输出zheng里面的值?
没仔细看,大概觉得是这样
点赞  2011-10-29 08:57
不懂。。
[url=http://www.51great.org/]嵌入式培训[/url
点赞  2011-10-29 09:34

回复 沙发 jishuaihu 的帖子

我也觉得是这样得,楼主改改看看,及时反馈啊!
点赞  2011-10-29 10:11

引用: 原帖由 jishuaihu 于 2011-10-29 08:57 发表 P0=zheng; 这一句不对吧,zheng是个数组,你这样写是把数组的地址输出了,是不是应该输出zheng里面的值?没仔细看,大概觉得是这样

其实LZ写的是P0=zheng[ i ],只是发帖[ i ]会没了,不信你们可以试试(括号内别加空格)

[ 本帖最后由 孤獨の快樂 于 2011-10-29 14:06 编辑 ]
点赞  2011-10-29 14:05

因为中断里是100ms改变一次P0的输出吧

主函数里面会一直循环,满足if的条件时,P0几us内就变一次的

点赞  2011-10-29 14:17

回复 6楼 孤獨の快樂 的帖子

仔细的想了一下似的确实是你说的这个样子啊!其实可以在中断里面加一个标志位,然后判断在加一。
点赞  2011-10-29 16:03
6L的兄弟一针见血啊.....
BTW,那个判断有点多余。
0 % 2 还是0
强者为尊,弱者,死无葬身之地
点赞  2011-10-30 00:47
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复