想在外部中断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;
}
}
#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.
你需要看和理解中断的原理的基础知识,中断不是这样嵌套的,或者说没有中断嵌套的做法,只有哪个中断优先处理的问题。
这个是思路就错了。
那请问您有中断嵌套的实例程序吗?我学习一下