5120|9

106

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

用 INT0做中断,为什么进了去出不了!!!哪里出问题了????? [复制链接]

现在玩个红外接收的模块,用 INT0做中断,为什么进了去出不了!!!哪里出问题了?????
-----------------------------------把程序贴上-------------
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
uint q;
//------1602---------//
sbit rs6=P2^6;sbit rw6=P2^5;sbit e6=P2^7;
xml6(uchar a){rs6=0;rw6=0;P0=a;e6=1;for(q=0;q<8;q++);e6=0;}
xsj6(uchar a){rs6=1;rw6=0;P0=a;e6=1;for(q=0;q<8;q++);e6=0;}
dw(uchar r,uchar c){if(r==0)xml6(0x80+c);else xml6(0xc0+c);}
csh6(){xml6(0x38);xml6(0x0c);xml6(0x01);for(q=0;q<10;q++);}
xstr6(uchar a,uchar b,uchar *str){
        dw(a,b);
        while(*str!=0){               
                xsj6(*str);
                str++;
        }
}
sbit led=P2^0;
uint number;
sbit out =P3^2;   //红外接收
uchar time,js;
uchar kb[4];    //4个数组  
uchar i,j;
t0int() interrupt 0
{
        EX0=0;
        for(q=0;q<800;q++);                          
        for(q=0;q<800;q++)if(out==1)break;   //  引导码 9ms 低电平
        if(out==1)
        {
                for(q=0;q<800;q++){if(out==0)break;}//  引导码 4.5ms 高电平
               
                for(time=0;time<4;time++)
                {
                        for(js=0;js<8;js++)
                        {       
                                for(i=0;i<115;i++){if(out==1)break;}
                                if(out==1){
                                        for(j=0;j<280;j++){if(out==0)break;}
                                        kb[time]<<=1;
                                        if(j>120)kb[time]+=1;          //超过 1ms 左右 示位  1 否则 0     
                                }
                        }                               
                }
        }
        EX0=1;
}
uint www;
main(){
        csh6();
        for(q=0;q<5000;q++);
        _nop_();
        xstr6(0,0," -number-");
        dw(1,2); xsj6(0x30+(number/100%10));xsj6(0x30+(number/10%10));xsj6(0x30+(number%10));
        EX0=1;     //开外部中断 0
        IT0=1;
        EA=1;       
        while(1){
                dw(1,2);                
                xsj6(0x30+(kb[2]/100%10));xsj6(0x30+(kb[2]/10%10));xsj6(0x30+(kb[2]%10));
                for(www=0;www<20000;www++);
                led=!led;
        }
}


此帖出自51单片机论坛

最新回复

没有具体看也说不清是不是因为中断占用时间太长,你进了中断之后关了也不一定有用,有可能你中断结束的时候新的中断已经来了,标志已经置位了,只是你没有允许,等你一使能中断就马上又进去了。用51一般都不仿真,但是你可以加一个测试点,比如点亮一个LED,如果频率 比较高的话可以在需要测试的地方计数,当计数到一定数时点亮LED,可以帮着判断。有示波器的话就更好了,可以直接看测试点的波形 不过不管怎么说,中断里尽量少做事,一般都是在中断里置一些标志,然后放到中断外面做判断。你做的这个程序我没有做过,暂时没有好的办法,你先试试吧。  详情 回复 发表于 2014-8-21 20:20
点赞 关注
 

回复
举报

1119

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
过来看看~~~~~~~~~~~~ 也不是很懂
此帖出自51单片机论坛
 
 
 

回复

1798

帖子

0

TA的资源

五彩晶圆(初级)

板凳
 
你在中断里面放了这么多个for循环,而且循环次数还这么多,基本就是这个问题导致的了
此帖出自51单片机论坛

点评

#include #include #include #define uchar unsigned char #define uint unsigned int uint q; //------1602---------// sbit rs6=P2^6;sbit rw6=P2^5;sbit e6=P2^7; xml6(uchar a){rs6=0;rw6=0;P0=a;e  详情 回复 发表于 2014-8-20 17:16
 
 
 

回复

106

帖子

0

TA的资源

一粒金砂(中级)

4
 
sint27 发表于 2014-8-20 16:08
你在中断里面放了这么多个for循环,而且循环次数还这么多,基本就是这个问题导致的了

#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
uint q;
//------1602---------//
sbit rs6=P2^6;sbit rw6=P2^5;sbit e6=P2^7;
xml6(uchar a){rs6=0;rw6=0;P0=a;e6=1;for(q=0;q<8;q++);e6=0;}
xsj6(uchar a){rs6=1;rw6=0;P0=a;e6=1;for(q=0;q<8;q++);e6=0;}
dw(uchar r,uchar c){if(r==0)xml6(0x80+c);else xml6(0xc0+c);}
csh6(){xml6(0x38);xml6(0x0c);xml6(0x01);for(q=0;q<10;q++);}
xstr6(uchar a,uchar b,uchar *str){
        dw(a,b);
        while(*str!=0){               
                xsj6(*str);
                str++;
        }
}
sbit led=P2^0;
uint number;
sbit out =P3^2;   //红外接收
uchar time,js;
uchar kb[4];    //4个数组  
uint i,j;
t0int() interrupt 0
{
        EX0=0;  
        for(q=0;q<800;q++);                          
        for(q=0;q<800;q++)if(out==1)break;   //  引导码 9ms 低电平
        if(out==1)
        {
                for(q=0;q<700;q++){if(out==0)break;}//  引导码 4.5ms 高电平
               
                for(time=0;time<4;time++)
                {
                        for(js=0;js<8;js++)
                        {       
                                while(out==0);                                               
                                if(out==1){
                                        for(j=0;j<=300;j++){if(out==0)break;}
                                        if(j==300){kb[2]=0;out=0;return;}
                                        kb[time]>>=1;
                                        if(j>=170)kb[time]|=0x80;          //超过 1ms 左右 示位  1 否则 0     
                                }
                        }                               
                }

        }
        out=0;
        for(q=0;q<20000;q++);
        EX0=1;
       
}
uint www;
main(){
        csh6();
        for(q=0;q<5000;q++);
        _nop_();
        xstr6(0,0," -number-");
        dw(1,2); xsj6(0x30+(number/100%10));xsj6(0x30+(number/10%10));xsj6(0x30+(number%10));
        EX0=1;     //开外部中断 0
        IT0=1;
        EA=1;       
        while(1){
                dw(1,2);                
                xsj6(0x30+(kb[2]/100%10));xsj6(0x30+(kb[2]/10%10));xsj6(0x30+(kb[2]%10));
                for(www=0;www<20000;www++);
                led=!led;
                if(out==0){for(q=0;q<20000;q++);        EX0=1;out=1;}

        }
}



这样写就可以勒, 我把 中断程序结束前在EX0=1;上面加句把中断的I/0口置下0    就能出来勒 , (不过外面要重新置高位 if(out==0){out=1;})!!!不知什么原因~~~~~




此帖出自51单片机论坛
 
 
 

回复

16

帖子

1

TA的资源

一粒金砂(初级)

5
 
程序是干嘛的
此帖出自51单片机论坛

点评

红外接受而已···  详情 回复 发表于 2014-8-21 16:11
 
 
 

回复

3404

帖子

6

TA的资源

裸片初长成(初级)

6
 
中断忙不过来就出不去呗,中断里尽量少干活
此帖出自51单片机论坛

点评

版主,进中断后 关 EX0再开 也会忙不过来?  详情 回复 发表于 2014-8-21 16:10

赞赏

1

查看全部赞赏

 
 
 

回复

106

帖子

0

TA的资源

一粒金砂(中级)

7
 
jishuaihu 发表于 2014-8-21 10:58
中断忙不过来就出不去呗,中断里尽量少干活

版主,进中断后    关 EX0再开 也会忙不过来?
此帖出自51单片机论坛
 
 
 

回复

106

帖子

0

TA的资源

一粒金砂(中级)

8
 

红外接受而已···
此帖出自51单片机论坛
 
 
 

回复

3404

帖子

6

TA的资源

裸片初长成(初级)

9
 
没有具体看也说不清是不是因为中断占用时间太长,你进了中断之后关了也不一定有用,有可能你中断结束的时候新的中断已经来了,标志已经置位了,只是你没有允许,等你一使能中断就马上又进去了。用51一般都不仿真,但是你可以加一个测试点,比如点亮一个LED,如果频率 比较高的话可以在需要测试的地方计数,当计数到一定数时点亮LED,可以帮着判断。有示波器的话就更好了,可以直接看测试点的波形
不过不管怎么说,中断里尽量少做事,一般都是在中断里置一些标志,然后放到中断外面做判断。你做的这个程序我没有做过,暂时没有好的办法,你先试试吧。
此帖出自51单片机论坛

点评

多谢版主!!!我会注意了!!!  详情 回复 发表于 2014-8-22 19:35

赞赏

1

查看全部赞赏

 
 
 

回复

106

帖子

0

TA的资源

一粒金砂(中级)

10
 
jishuaihu 发表于 2014-8-21 20:20
没有具体看也说不清是不是因为中断占用时间太长,你进了中断之后关了也不一定有用,有可能你中断结束的时候 ...

多谢版主!!!我会注意了!!!
此帖出自51单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表