51单片机定时器中断函数中变量初始化的问题

前几天在进行单片机实验时,目的是用定时器0写一个流水灯的程序,代码如下,编译没有问题,但就是灯不亮,检查了好几次始终找不到问题,现在找到了,分享一下

    #include<reg51.h>//调用头文件

    #define uint unsigned int    //宏定义
    #define uchar unsigned char
    #define long_time 10 //定时时间,每次50ms

    uint n=0;    //查表变量
    uchar temp[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//流水灯查表实现
    /*********主函数**************/
    void main(void)
    {
            EA=1; //开总中断
            ET0=1;//开定时器0中断
            TMOD=0X01;//选择方式1
            TH0=(65536-50000)/256;//每次定时50秒
            TL0=(65526-50000)%256;
            TR0=1;//开启定时器
            while(1);
    }
    void time0(void) interrupt 1 using 0
    {
        uint i=0;        //此处存在问题,每次进入中断函数i都会被置为0
        i++;             //i始终为1
        if(long_time0==i)//如果long_time0=1,则程序不会出错即使不等于1,编译时也不会报错,属于逻辑错误
        {
            i=0;
            P1=temp[n++];
            if(8==n) n=0;
        }
        TH0=(65536-50000)/256;//重新装入初值
        TL0=(65526-50000)%256;
    }

收获:

1.中断函数中定义的变量一定要注意赋初值是否符合逻辑,特别是循环中的变量

2.局部变量和全局变量或者静态变量的作用范围,比如将上面中断函数中的变量定义为全局变量或者静态变量就不会有问题

道行尚浅,不足之处,还希望各位指正

时间: 2024-09-30 23:46:55

51单片机定时器中断函数中变量初始化的问题的相关文章

python main函数中变量默认为global variable

在python的main函数中的变量默认为全局变量,而其他的def函数中的变量则默认为局部变量. 当然,局部变量会优先于全局变量,在执行formal_print(t_global)语句时便可看出. 测试代码如下: <span style="font-size:18px;">#coding=utf-8 #测试python的全局变量,局部变量的机制 def formal_print(s_global):#常规的传参用法,传递参数进行print,变量名可任意 print &quo

51单片机的中断嵌套怎么实现呢?

今天在练习51单片机的嵌套中断时,发现了一个奇怪的点,就是中断服务函数在执行的时候,无论优先级的高低,都不能被打断.嗯,就是外部中断0和外部中断1都不能打断定时器0的中断服务函数.(优先级:外部中断0>定时器0>外部中断1). 我本来想开启定时器0,外部中断0和外部中断1,实现中断嵌套. 比如外部中断0到达时,执行中断服务函数Int0,因为它的优先级高,所以当外部中断1和定时器0到达时,不会打断外部中断0的中断服务函数.而当定时器0中断时,外部中断0到达可以打断其执行,外部中断1到达不可打断.

定时器setTimeout/setInterval中变量报错:not defined 的解决方法

首先声明本人资质尚浅,如有错误,欢迎指正.共同提高. ----------------------------------------------------------------------------------- 首先声明:本文不重点讨论this作用域,而是讨论普通变量在定时器中容易报错的情况: setTimeout的基本用法不再重述, 详见:http://www.w3school.com.cn/htmldom/met_win_settimeout.asp bug: setTimeout

c++中函数中变量内存分配以及返回指针、引用类型的思考

众所周知,我们在编程的时候经常会在函数中声明局部变量(包括普通类型的变量.指针.引用等等). 同时,为了满足程序功能的需要,函数的返回值也经常是指针类型或是引用类型,而这返回的指针或是引用也经常指向函数中我们自己声明的局部变量. 这样,程序在某些情况下就可能存在一定的问题.看似很简单的问题,通过仔细的分析,我们就能够更好的理解c++中内存分配和释放的问题. 好,废话不多说,我们进入正题.首先,简单介绍一下程序的内存区域的分配: 程序的内存分配 ①堆区(heap).这一部分主要是由程序开发人员自己

智能车学习(二十三)&mdash;&mdash;K60单片机注册中断函数

一.头文件: #ifndef __ISR_H #define __ISR_H 1 #include "include.h" /* 重新定义中断向量表 * 先取消默认的中断向量元素宏定义 #undef VECTOR_xxx * 在重新定义到自己编写的中断函数 #define VECTOR_xxx xxx_IRQHandler * 例如: * #undef VECTOR_003 * #define VECTOR_003 HardFault_Handler 重新定义硬件上访中断服务函数 *

Java 中变量初始化、子类和父类构造器调用的顺序

先说结论 变量初始化 -> 父类构造器 -> 子类构造器 贴代码 Animcal.java 父类 public class Animal { private static int index = 0; private static String getStaticName() { String name = String.format("animal %d" , index++); System.out.println(name); return name; } priva

51 单片机定时器数码管 从1数到100(带三个按键控制开始,暂停,复位)

#include <reg51.h> #define uint unsigned int #define uchar unsigned char sbit wei=P2^7; sbit duan=P2^6; sbit key1=P3^4; sbit key2=P3^5; sbit key3=P3^6; uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//1~9 //0~9,0x77,0x7c,0x39

React中render函数中变量map中事件无法关联的解决办法

如下所示的代码,Input的checkbox可以正常显示3个,但是都无法和 handleChange关联上. 由于代码无法正常显示,我用图片 var Input = ReactBootstrap.Input; var TestCom = React.createClass({ getInitialState: function() { return {value: 'Hello!', value2: 'nihao2' }; }, handleChange: function(event) { v

C#语言基础 Main 函数中变量 整型

在我们每次上网或者用电脑的时候,请输入你的xxx 或者你的名字(年龄/身高/学校/籍贯)是 在这里我们就要学到一些变量,就是不确定的东西 string a:   赋予变量 a ="内容": 变量赋值 合起来就是 string a ="内容";  就是赋予变量 变量赋值 string a =""; a = a+"";