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;

        //添加你需要的代码

      }

    }

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

  • 相关阅读:
    pureftpd无法上传、新建、覆盖文件的解决方法
    nginx 安装
    Generating Artifacts问题解决汇总
    Java Project和Web Project 区别
    CString 截取字符串全攻略
    截取字符串--sql和access的区别
    VC++线程函数内怎么调用外部函数
    CTime与CString相互转化
    CString的所有函数
    深层次的理解_variant_t
  • 原文地址:https://www.cnblogs.com/emptyYPen/p/6818727.html
Copyright © 2011-2022 走看看