微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 想在外部中断0的中断程序里执行一次定时中断

想在外部中断0的中断程序里执行一次定时中断

时间:10-02 整理:3721RD 点击:
//想在外部中断0的中断程序里执行一次定时中断,为此,我设置了中断优先寄存器,使定时器中断0优先于外部中断0,然而并没有达成实验效果,不知道为什么。主要看这里面的红色部分,问题出在那里。
#include<reg51.h>
#include<intrins.h>
#define LCDIO P0
sbit irread=P3^2;
sbit RS=P2^6;
sbit RW=P2^5;
sbit E=P2^7;
sbit p1=P2^0;

void irinit();
void lcdwritecom(unsigned char com);
void lcdwritedata(unsigned char dat);
void lcdinit();
unsigned char code CDIS1[13]={" Red Control "};
unsigned char code CDIS2[13]={" IR-CODE:--H "};
unsigned char irvalue;
unsigned int time1us;
unsigned char m;
unsigned char k;

void main()
{

   lcdinit();
   irinit();
   irread=0;           //触发外部中断0
  while(1)
  { lcdwritecom(0x80);
           for(k=0;k<13;k++)
        {
                lcdwritedata(CDIS1[k]);       
        }
        lcdwritecom(0x80+0x40);
        for(k=0;k<13;k++)
        {
                lcdwritedata(CDIS2[k]);       
        }
   }
}

//LCD程序
void lcdwritecom(unsigned char com)        //写入命令
{
  E=0;
  RS=0;
  RW=0;
  LCDIO=com;
  m=10;
  while(m>0)
  {
   m--;
  }
  E=1;
  m=10;
  while(m>0)
  {
   m--;
  }
  E=0;
}
void lcdwritedata(unsigned char dat)        //写入数据
{
  E=0;
  RS=1;
  RW=0;
  LCDIO=dat;
  m=10;
  while(m>0)
  {
   m--;
  }
  E=1;
  m=10;
  while(m>0)
  {
   m--;
  }
  E=0;
}
void lcdinit()                         //初始化LCD
{
   lcdwritecom(0x38);
   lcdwritecom(0x0c);
   lcdwritecom(0x06);
   lcdwritecom(0x01);
   lcdwritecom(0x80);
}
/**************************************************************/
/***************************************************************/
/**************************************************/
void irinit()
{
TMOD=0X01;
TH0=0XFC;        //设置初值
TL0=0X18;
ET0=1;
TR0=0;                //定时器中断暂时不打开
  IT0=1;         //外部中断0,负跳变触发方式
  EX0=1;         //打开外部中断0
  EA=1;                 //打开总中断
  irread=1;//初始化端口
  IP=0x02;           //设置中断优先寄存器,使定时器0优先于外部中断0
}
void configuration1us() interrupt 1                                                                  
{
   TH0=0XFC;          //通过改变TH0和TL0改变时间步长
   TL0=0X18;
   time1us=2;
}
/*****************************************************************/
void irconfiguration() interrupt 0                        //进入外部中断0
{

   p1=0;
   time1us=0;                                          
   TR0=1;                                                  //在这个外部中断里打开定时器0
   if(time1us>=2)                                  //如果定时器运行的话,会执行p1=1,那么小灯就不会亮,而实际上,小灯亮了,
                                  //说明在这个外部中断的程序里就压根没有执行定时器中断
   {
          p1=1;
   }
}

定时器初值没有倒计数到0.

你需要看和理解中断的原理的基础知识,中断不是这样嵌套的,或者说没有中断嵌套的做法,只有哪个中断优先处理的问题。
这个是思路就错了。

那请问您有中断嵌套的实例程序吗?我学习一下

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top