首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

单片机中断问题,下面这段程序不知道为什么只进一次中断,就没有反应了

单片机中断问题,下面这段程序不知道为什么只进一次中断,就没有反应了

#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口灯有反应,在按下就没有反应了,请问是什么原因那?
返回列表