标题:51单片机初学,中断卡死问题
只看楼主
w838068053
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2015-1-6
结帖率:50%
 问题点数:0 回复次数:5 
51单片机初学,中断卡死问题
以下为单片机程序,由于初学,本人已经努力排版、注释了。
运行问题为当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;
    }
}
搜索更多相关主题的帖子: 单片机程序 include 计时器 记录 
2015-01-14 10:31
w838068053
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2015-1-6
得分:0 
200也会卡死,sorry,说错了
2015-01-14 10:34
w838068053
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2015-1-6
得分:0 
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.
2015-01-14 10:51
w838068053
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2015-1-6
得分:0 
本帖只有我自己回复,我自己发现了怎么改,为了不坑大家,我说一下,结贴了。
把unsigned int Kx 改为 bit Kx。。
2015-01-14 10:56
jhxxy
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2014-4-9
得分:0 
虚心学习 都是高手
2015-03-18 08:20
q913794286
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2017-4-27
得分:0 
谁告诉你的Kx=~Kx的输出结果是0和1?非零和0就一定是0和1吗?所以麻烦你把if语句中的==1去掉。
2017-04-27 08:40



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-441089-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.811440 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved