zoukankan      html  css  js  c++  java
  • 一个犯过的编程错误

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

        //添加你需要的代码

      }

    }

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

  • 相关阅读:
    Win7 配置Android开发环境 狼人:
    Windows Phone 7 Tips (3) 狼人:
    Windows Phone 7 Tips (1) 狼人:
    探索移动Web网页编码设计 狼人:
    初探AIR for Android开发 狼人:
    Android设计趋势分析10则 狼人:
    Android与服务器端数据交互 狼人:
    Android UI基本测验:线性布局 狼人:
    Android用户界面设计:线性布局 狼人:
    Eclipse开发Android应用程序入门:重装上阵 狼人:
  • 原文地址:https://www.cnblogs.com/emptyYPen/p/6818727.html
Copyright © 2011-2022 走看看