打印

AT89C2051外部中断0的奇怪问题

[复制链接]
3439|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liuxy236|  楼主 | 2007-3-22 09:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用AT89C2051的外部中断0做键中断,也就是在P3.2上拉了1K电阻,下接一按键,怎么按,都不会有中断,程序如下,用过AT89C2051的大虾门帮忙看看!

//compiler is keil c51 6.23c   UP

/**** this is n. v2 version in 22;56   5/14 *****/
#include <AT89C2051.H>
//#include <intrins.h>

#define uchar unsigned char
#define uint  unsigned int


/***************************************
*PIN defines
*
****************************************/

sbit OPCLS =  P1^7;
sbit START =  P3^0;


/********when ms is 200 ,time is 500ms**************/
void clk_int(void) interrupt 0 
{ uchar i=0;
  //EA=0;
  /*if(OPCLS==0)
    {OPCLS=1;
     i=1;
      }
   */
  while(START);              //暂停动作
  /*if(i==1)
    {OPCLS=0;}
  */
  EA=1;
}
void delay(uchar ms)
{
   uchar t;
   do {
       for(t=0;t!=255;t++);
       for(t=0;t<60;t++);
       }
   while(ms--);

}

void InitSystem(void)
{
P1=0xff;
//P0=0xff;
//P2=0xff;
//P3=0xff;
EX0=1;        //打开中断0
IT0=0;        //电平触发
//EA=0;         //关闭中断
}
void Point5s(uint ss)                 //5s点击子程序
{   uchar i;
    while(ss)
      { for(i=0;i<10;i++)
         { OPCLS=0;
           delay(500);
           OPCLS=1;
           delay(500);
         }
        ss--;
      }
}      
void Light5s(uint ss)                 //5s长明子程序
{   uchar i;
    while(ss)
      { for(i=0;i<20;i++)
          { OPCLS=0;
            delay(500);
          }
        ss--;
      }
    OPCLS=1;

void main(void)
{InitSystem();
EA=1;
while(1)
   {
    while (START==0)
      {  Point5s(60);           //点击360*5S=30M
         Light5s(60);           //点击360*5S=30M
       }
      
    
    }
}


头文件如下:
/*--------------------------------------------------------------------------
AT892051.H

Header file for the Atmel AT89C2051.
Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.
--------------------------------------------------------------------------*/

#ifndef __AT892051_H__
#define __AT892051_H__

/*------------------------------------------------
Byte Registers
------------------------------------------------*/
sfr SP      = 0x81;
sfr DPL     = 0x82;
sfr DPH     = 0x83;
sfr PCON    = 0x87;
sfr TCON    = 0x88;
sfr TMOD    = 0x89;
sfr TL0     = 0x8A;
sfr TL1     = 0x8B;
sfr TH0     = 0x8C;
sfr TH1     = 0x8D;
sfr P1      = 0x90;
sfr SCON    = 0x98;
sfr SBUF    = 0x99;
sfr IE      = 0xA8;
sfr P3      = 0xB0;
sfr IP      = 0xB8;
sfr PSW     = 0xD0;
sfr ACC     = 0xE0;
sfr B       = 0xF0;

/*------------------------------------------------
PCON Bit Values
------------------------------------------------*/
#define IDL_    0x01
#define STOP_   0x02
#define EWT_    0x04
#define EPFW_   0x08
#define WTR_    0x10
#define PFW_    0x20
#define POR_    0x40
#define SMOD_   0x80

/*------------------------------------------------
TCON Bit Registers
------------------------------------------------*/
sbit IT0  = 0x88;
sbit IE0  = 0x89;
sbit IT1  = 0x8A;
sbit IE1  = 0x8B;
sbit TR0  = 0x8C;
sbit TF0  = 0x8D;
sbit TR1  = 0x8E;
sbit TF1  = 0x8F;

/*------------------------------------------------
TMOD Bit Values
------------------------------------------------*/
#define T0_M0_   0x01
#define T0_M1_   0x02
#define T0_CT_   0x04
#define T0_GATE_ 0x08
#define T1_M0_   0x10
#define T1_M1_   0x20
#define T1_CT_   0x40
#define T1_GATE_ 0x80

#define T1_MASK_ 0xF0
#define T0_MASK_ 0x0F

/*------------------------------------------------
P1 Bit Registers
------------------------------------------------*/
sbit P1_0 = 0x90;
sbit P1_1 = 0x91;
sbit P1_2 = 0x92;
sbit P1_3 = 0x93;
sbit P1_4 = 0x94;
sbit P1_5 = 0x95;
sbit P1_6 = 0x96;
sbit P1_7 = 0x97;

sbit AIN0 = 0x90;       /* + Analog comparator input */
sbit AIN1 = 0x91;       /* - Analog comparator input */

/*------------------------------------------------
SCON Bit Registers
------------------------------------------------*/
sbit RI   = 0x98;
sbit TI   = 0x99;
sbit RB8  = 0x9A;
sbit TB8  = 0x9B;
sbit REN  = 0x9C;
sbit SM2  = 0x9D;
sbit SM1  = 0x9E;
sbit SM0  = 0x9F;

/*------------------------------------------------
IE Bit Registers
------------------------------------------------*/
sbit EX0  = 0xA8;       /* 1=Enable External interrupt 0 */
sbit ET0  = 0xA9;       /* 1=Enable Timer 0 interrupt */
sbit EX1  = 0xAA;       /* 1=Enable External interrupt 1 */
sbit ET1  = 0xAB;       /* 1=Enable Timer 1 interrupt */
sbit ES   = 0xAC;       /* 1=Enable Serial port interrupt */
sbit ET2  = 0xAD;       /* 1=Enable Timer 2 interrupt */

sbit EA   = 0xAF;       /* 0=Disable all interrupts */

/*------------------------------------------------
P3 Bit Registers (Mnemonics & Ports)
------------------------------------------------*/
sbit P3_0 = 0xB0;
sbit P3_1 = 0xB1;
sbit P3_2 = 0xB2;
sbit P3_3 = 0xB3;
sbit P3_4 = 0xB4;
sbit P3_5 = 0xB5;
/* P3_6 Hardwired as AOUT */
sbit P3_7 = 0xB7;

sbit RXD  = 0xB0;       /* Serial data input */
sbit TXD  = 0xB1;       /* Serial data output */
sbit INT0 = 0xB2;       /* External interrupt 0 */
sbit INT1 = 0xB3;       /* External interrupt 1 */
sbit T0   = 0xB4;       /* Timer 0 external input */
sbit T1   = 0xB5;       /* Timer 1 external input */
sbit AOUT = 0xB6;       /* Analog comparator output */

/*------------------------------------------------
IP Bit Registers
------------------------------------------------*/
sbit PX0  = 0xB8;
sbit PT0  = 0xB9;
sbit PX1  = 0xBA;
sbit PT1  = 0xBB;
sbit PS   = 0xBC;

/*------------------------------------------------
PSW Bit Registers
------------------------------------------------*/
sbit P    = 0xD0;
sbit FL   = 0xD1;
sbit OV   = 0xD2;
sbit RS0  = 0xD3;
sbit RS1  = 0xD4;
sbit F0   = 0xD5;
sbit AC   = 0xD6;
sbit CY   = 0xD7;

/*------------------------------------------------
Interrupt Vectors:
Interrupt Address = (Number * 8) + 3
------------------------------------------------*/
#define IE0_VECTOR    0  /* 0x03 External interrupt 0 */
#define TF0_VECTOR    1  /* 0x0B Timer 0 */
#define IE1_VECTOR    2  /* 0x13 External interrupt 1 */
#define TF1_VECTOR    3  /* 0x1B Timer 1 */
#define SIO_VECTOR    4  /* 0x23 Serial port */

#endif

相关帖子

沙发
高勇| | 2007-3-22 09:36 | 只看该作者

主程序中

主程序中加 在EA  = 1;后加 EX0 = 1;
你只说是不会中断。这样应该可以进入中断了。

使用特权

评论回复
板凳
ayb_ice| | 2007-3-22 09:41 | 只看该作者

随便说说

  首先MCU肯定没有问题,一定是程序问题,建议先写一个最简单的程序测试一下...

使用特权

评论回复
地板
mugenwon| | 2007-3-22 09:41 | 只看该作者

一点建议

其实软件可以在编译环境做很多检查而不用烧在芯片里面再试。例如keil。
你可以在程序开头定义一些变量,在各种地方改变这个变量的值,然后运行,再查看这些值有没有按你的意思去改变。
这样可以了解你的程序哪里出了问题。

使用特权

评论回复
5
ayb_ice| | 2007-3-22 09:45 | 只看该作者

随便说说

  可以用软件置位IE0后看是否能进入中断...

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

1

粉丝