|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
大侠们都来帮忙看看这个程序哪里出问题了!!!!!
首先说下程序。程序在中断中修改中断的返回地址,回到想要的回到的地方执行,判断要执行哪个任务,以达到快速响应的目的。
问题:程序在Keil中仿真通过,可以实现想要的功能,但下载到单片机后一点反应都没有……不知道是什么原因,期待大侠指点!!!!!
下面是程序:
include <at89x51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
xdata PC_Value, SP_Value; //储存中断返回点、SP初值的全局变量
uchar Ctrl_Code=0;
void initinal()
{
EX0=1;
IT0=1;
}//外部中断0允许中断,下降沿触发
Get_Next_PC(void) //获取下一条指令的地址
{
xdata address;
address=*((uchar *)SP);//PC的高字节
address <<= 8;
address+=*((uchar *)(SP-1)); //PC的低字节
return address+8; //查看反汇编代码,计算所得
}
void delay_ms(uint aa)
{
uint i,j;
for(i=0;i<aa;i++)
for(j=0;j<114;j++);
}//1ms延时程序
void task(uchar bb)
{
if(bb==1) P1=0xfe;
else if(bb==2) P1=0xfc;
else if(bb==3) P1=0xf8;
delay_ms(1000);
for(;;)
{
P1=_crol_(P1,1);
delay_ms(1000);
}
}
void main()
{
initinal(); //初始化函数
SP_Value=SP; //获取SP的初始值
PC_Value=Get_Next_PC(); //获取下一条指令的地址
EA=1; //获取PC、SP初值后再开中断保证稳定性
if(Ctrl_Code!=0) SP=SP_Value; //重置堆栈指针,防止堆栈溢出
switch( Ctrl_Code) //任务入口地址,即中断的返回点
{
case 1: goto TASK1;
case 2: goto TASK2;
case 3: goto TASK3;
default: goto TASK4;
}
TASK1: for( ; ; )
{ task(1); }
TASK2: for( ; ; )
{ task(2); }
TASK3: for( ; ; )
{ task(3); }
TASK4: for(;;);
}
void TX0(void) interrupt 0 using 0
{
uchar a1,a2;
a1=a1*a2;//使寄存器B入栈,保证堆栈结构稳定
EA=0;
*((unsigned char *)(SP-5))=(PC_Value>>8);
*((unsigned char *)(SP-6))=(PC_Value&0x00ff); //修改中断返回时程序计数器PC值*/
Ctrl_Code++;
if(Ctrl_Code==4) Ctrl_Code=1;
} |
|