请教个弱问题

[复制链接]
3249|12
 楼主| she0800 发表于 2007-8-15 13:37 | 显示全部楼层 |阅读模式
我现在在学习C51,自己搭了个小板子
定时器0,1,2都可以使用,中断服务程序可以执行
现在想使用89C52的外部中断0,却无法执行中断程序,
烧写至单片机和使用软件模拟均无法进入中断程序(俺没仿真机55)

相关程序如下
谢谢!!

#include<AT89X52.H>
#define uchar unsigned char
#define uint  unsigned int

sbit    tk = P3^6;
sbit    sk = P3^2;

uint    show_time,hide_time;
bit    flag;

void delay(uchar); 

void main(void)
{
    

    IT0=0;                //边沿触发方式
    IE0=1;                //使能外部中断INT0
    
    IT1=0;                //电平触发方式
    IE1=1;                //使能外部中断INT0        

    EA=1;                //全局中断使能

    while(1)
    {
        delay(10);
    }
    
 
}

void delay(uchar z)
{
    uchar x,y;
    while(z--!=0)
    { 
        for(x=0;x<10;x++)
        for(y=0;y<100;y++);
    }
}


void inte0_service(void) interrupt 0        //外部中断0中断服务程序
{
    

    IT0=0;                //边沿触发方式
    IE0=1;                //使能外部中断INT0
    delay(100);    
    tk=!tk;

}



 楼主| she0800 发表于 2007-8-15 14:40 | 显示全部楼层

主要问题

要使用外部中断0的
除了IT0,IE0和EA要设置外,还有什么东西需要设置的吗?
农民讲习所 发表于 2007-8-15 14:41 | 显示全部楼层

你可以自己用KEILC的模拟调试先调试下

自己模拟条件的产生。
ayb_ice 发表于 2007-8-15 14:44 | 显示全部楼层

"IE0=1; //使能外部中断INT0"有问题吧...

使能外部中断INT0应该是EX0 = 1;IE0是中断标志吧...
zhaohe2001 发表于 2007-8-15 14:47 | 显示全部楼层

在中断程序中加EA=1

农民讲习所 发表于 2007-8-15 14:56 | 显示全部楼层

中断程序中不要家EA=0,1之类的废话。

“IT0=0;                //边沿触发方式
IE0=1;                //使能外部中断INT0”
之类都是废话。因为不可能发生改变。

类似常见废话还有在中断中:
ES = 0;
....
ES = 1;
因为进入中断自身不能再重入了。
 楼主| she0800 发表于 2007-8-15 14:58 | 显示全部楼层

试了,

我现在就是用keil模拟,
在中断程序中加EA=1,
然后在Peripherals的IO Ports里面改P3.2的端口电平
程序仍然运行不到中断服务程序中的断点,
昏,这到底是什么原因

四年以前我用汇编的时候用的挺好,可惜当时程序早不知道到哪去了
 楼主| she0800 发表于 2007-8-15 15:00 | 显示全部楼层

呵呵,这两条本来就是废话程序

这两条语句相当于空操作
“IT0=0;                //边沿触发方式
IE0=1;                //使能外部中断INT0”


主要用于我放一个断点看程序有没有运行到这个地方来的
农民讲习所 发表于 2007-8-15 15:01 | 显示全部楼层

EX0 = 1;

gjg191 发表于 2007-8-15 15:08 | 显示全部楼层

dd

应该是EX0=1;才对
#include<AT89X52.H>
#define uchar unsigned char
#define uint  unsigned int

sbit    tk = P3^6;
sbit    sk = P3^2;

uint    show_time,hide_time;
bit    flag;

void delay(uchar); 

void main(void)
{
    

    IT0=0;                //边沿触发方式
    IE0=1;                //使能外部中断INT0
    
    IT1=0;                //电平触发方式
    //IE1=1;                //使能外部中断INT0        
    EX0=1;
    EA=1;                //全局中断使能

    while(1)
    {
        delay(10);
    }
    

}
void delay(uchar z)
{
    uchar x,y;
    while(z--!=0)
    { 
        for(x=0;x<10;x++)
        for(y=0;y<100;y++);
    }
}


void inte0_service(void) interrupt 0        //外部中断0中断服务程序
{
    

    IT0=0;                //边沿触发方式
    IE0=1;                //使能外部中断INT0
    delay(100);    
    tk=!tk;

}这样就ok拉!!
 楼主| she0800 发表于 2007-8-15 15:08 | 显示全部楼层

感谢农民讲习所大哥!!

偶把IE0=1;误当做中断使能了,失误!!

感谢大家!!
 楼主| she0800 发表于 2007-8-15 15:09 | 显示全部楼层

同感谢gjg191和ayb_ice!

zhushuping 发表于 2007-8-15 15:18 | 显示全部楼层

同意4楼的

EX0可以不写
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

19

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部