注册 登录
编程论坛 单片机编程

51单片机初学,中断卡死问题

w838068053 发布于 2015-01-14 10:31, 4840 次点击
以下为单片机程序,由于初学,本人已经努力排版、注释了。
运行问题为当i<100时,右移会卡死。
同样改成i<200时,可正常运行。
里面的时间设计,我是随便定的,请不要纠结这些。
请大侠们帮忙,直接说重点。谢谢,再三顿首。
#include <reg52.h>
#include<intrins.h>
    unsigned int i=0; //在中断中记录中断次数
    unsigned char Kx; //左移右移控制
    void Delay10ms(unsigned int);//延时程序声明
void main()
{
    P2=0xFE; //P2端口控制小灯,11111110只有最右边的灯亮
    EA = 1;  //以下为计时器中断问题,时间随便设置的
    TMOD = 0x01;
    TH0 = 0x00;  
    TL0 = 0x00;
    ET0 = 1;
    TR0 = 1;
    Kx=1;  //Kx赋值
while(1)
    {if(Kx==1)
    P2=_crol_(P2,1);//判断左移
    if(Kx==0)
    P2=_cror_(P2,1);//判断右移
    Delay10ms(1);    //延时程序调用
    }
}
void Delay10ms(unsigned int a)//延时程序
   {unsigned int b,c;
    for(;a>0;a--)
        for(b=38;b>0;b--)
             for(c=138;c>0;c--);}
void JSQZD0()interrupt 1   //计时器中断
    {TH0=0x00;//重新赋值
    TL0=0x00;
    i++;      //计数
    if(i>100) //超过100次置0,Kx取反
    {i=0;
    Kx=~Kx;
    }
}
5 回复
#2
w8380680532015-01-14 10:34
200也会卡死,sorry,说错了
#3
w8380680532015-01-14 10:51
void JSQZD0()interrupt 1   //计时器中断
    {TH0=0x00;//重新赋值
    TL0=0x00;
    i++;      //计数
    if(i>100) //超过100次置0,Kx取反
    Kx=0;
    if(i>200)
    {Kx=1;
    i=0;}
}
我尝试把中断改了,把Kx=~Kx去掉用上面代替,就能用,真是0-0.
#4
w8380680532015-01-14 10:56
本帖只有我自己回复,我自己发现了怎么改,为了不坑大家,我说一下,结贴了。
把unsigned int Kx 改为 bit Kx。。
#5
jhxxy2015-03-18 08:20
虚心学习 都是高手
#6
q9137942862017-04-27 08:40
谁告诉你的Kx=~Kx的输出结果是0和1?非零和0就一定是0和1吗?所以麻烦你把if语句中的==1去掉。
1