代码改变世界

一个犯过的编程错误

2017-05-06 21:32  小白很我  阅读(227)  评论(0编辑  收藏  举报

为了得到周期一定的时序,我们总是用定时器产生,C51中最常见的用法就是:

void tim0_IRQHandler(void)  interrupt 1

{

  static unsigned int cnt = 0;

  TH0 = XX;

  TL0 = XX;

  cnt++;

  if((cnt %10) == 0){

      //一个时序

  }

  if((cnt%13) == 0)

  {

    //又一个时序

  ]

  if(cnt == 6500){

    cnt = 0;

  }

}:

 

这样的写法一点问题都没有,如果你将cnt定义为全局变量,if判断条件不放在定时器0中断函数里面时,这种做法就出错了。如下:

unsigned int cnt = 0;

void tim0_IRQHandler(void)  interrupt 1

{

  TH0 = XX;

  TL0 = XX;

  cnt++;

}

void fun(void)

{

  if((cnt %10) == 0){

      //一个时序

  }

  if((cnt%13) == 0)

  {

    //又一个时序

  ]

  if(cnt == 6500){

    cnt = 0;

  }

}

void main(void)

{

  fun();

}

错误就出在,当cnt=10是一段时间,存在时间为一次中断时间间隔,在这个时间间隔了,if((cnt % 10 ) == 0){},括弧里面的内容被执行了好多遍。为什么中断函数行呢?因为

中断函数只有发生中断才能进入,所以只会执行if((cnt % 10 ) == 0){}括弧里面的内容一遍。

如果你想放外边,又只想{}里的内容执行一遍,解决办发就是设置一个标志。

void fun(void)

{

  static  unsigned char old = 0xff;

  if(((cnt %10) == 0) && (cnt != old)){

    old = cnt;

    //添加你需要的代码

  }

}

很低级的错误,就是一些小错误也让你找半天。哎,分享给那些需要的同学。水平比较低,见笑。