• 一个犯过的编程错误


    为了得到周期一定的时序,我们总是用定时器产生,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;

        //添加你需要的代码

      }

    }

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

  • 相关阅读:
    hdu 2822 Dogs (BFS+优先队列)
    hdu 2757 Ocean Currents(BFS+DFS)
    hdu2844 Coins(普通的多重背包 + 二进制优化)
    hdu1495 && pku3414
    hdu1054 Strategic Game(树形DP)
    FckEditor V2.6 fckconfig.js中文注释
    数字文本控件
    统计在线用户列表 for .net WebForm
    智能客户端
    模拟Confirm的Web自定义控件
  • 原文地址:https://www.cnblogs.com/emptyYPen/p/6818727.html
Copyright © 2020-2023  润新知