Board logo

标题: 单片机中断问题,下面这段程序不知道为什么只进一次中断,就没有反应了 [打印本页]

作者: rxjrlsq    时间: 2011-10-25 23:03     标题: 单片机中断问题,下面这段程序不知道为什么只进一次中断,就没有反应了

#include<reg51.h>  //  包含51单片机寄存器定义的头文件 #define uint unsigned int
sbit key1=P1^4;
sbit key2=P1^5;
void delay1ms(uint i)
{    uchar j;
     while(i--)
     {
          for(j=0;j<125;j++)          //1ms基准延时程序
               {                 ;              }
      }
}
void init()
{
EA=1;             //开总中断
ES=1;          //开串口中断
TMOD= 0x21;    //定时器1定时方式2,定时器1工作于8位自动重载模式, 用于产生波特率
SCON = 0x50;   // 设定串行口工作方式1 允许接收
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1= 0xfd;     //11.0592M 波特率9600
TL1= 0xfd;           PCON =0x00;    // 波特率不倍增
TR1= 1;        //启动定时器T1
TR0=1;                //启动定时器T0
ET0=1;   //打开T0中断
}
void key()
{
       if(key2==0)
            P0=0x3f;
            delay1ms(5000);
            P0=0xf3;
}
void mainxh()
{
      while(1)
        {
           key();
           P0=0x32;
         }
}
void keybreak()
{
     P0=0xf1;
     delay1ms(5000);
     P0=0x1f;
     mainxh();
}
void main(void)
{
      init();
      mainxh();
}
void Time0(void) interrupt 1
{        
       TH0=(65536-50000)/256; //定时器T0的高8位重新赋初值
        TL0=(65536-50000)%256; //定时器T0的高8位重新赋初值
        if(key1==0)
        keybreak();
}

     这个程序上电后P0口显示0x32;按下key2显示0x3f;key1用于中断,每20ms检测是否有按下key1键,有的话,P0口显示0xf1。但我试验的时候发下第一次按下key1,P0口灯有反应,在按下就没有反应了,请问是什么原因那?





欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0