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

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

    #include//调用头文件

    #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.局部变量和全局变量或者静态变量的作用范围,比如将上面中断函数中的变量定义为全局变量或者静态变量就不会有问题

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

你可能感兴趣的:(单片机)