有关keil51仿真过程中的问题
用c51编的程序,分开测试均没问题,
一连起来,没运行多久就跳进这样一个循环,
?C_STARTUP: LJMP STARTUP1
RSEG ?C_C51STARTUP
STARTUP1:
IF IDATALEN <> 0
MOV R0,#IDATALEN - 1
CLR A
IDATALOOP: MOV @R0,A
DJNZ R0,IDATALOOP
ENDIF
循环过后就从main最开头重新执行,为什么啊?
而且有时候还会出现这种错误
*** error 65: access violation at C:0x2000 : no 'execute/read' permission
何意?好困惑,敬请高人指点。
问题点数:50、回复次数:6Top
1 楼icesnows(逝去日子)回复于 2005-04-05 08:57:01 得分 20
前面那段程序是C51初始化程序,是编译器自己加上去的,你不用去管它!下面那个错误好像是访问了不能访问的地址Top
2 楼li_hai_quan(冰若水)回复于 2005-04-05 12:01:29 得分 10
帖出来看Top
3 楼flowercity(菜农)回复于 2005-04-05 20:26:12 得分 20
堆栈溢出
程序飞了Top
4 楼Nal_ra_007()回复于 2005-04-05 23:02:11 得分 0
好像就是堆栈溢出,该如何改啦,程序如下,
就是接收三个按键,然后发送命令给微机,处理后返回状态。
#include<AT89X51.H>
#define uint unsigned int
#define uchar unsigned char
void delay(uint n);
uchar Getkey(void);
void putbyte (uchar c);
#define OLEN 32 //size of serial transmission buffer
idata uchar outbuf[OLEN]; //storage for transmission buffer
uchar idata *outlast; //最后由中断传输出去的字节位置
uchar idata *putlast; //最后放入发送缓冲区的字节位置
uint count_key_busy, count_key_idle;
bit outbufempty; //缓冲区最后一个数据发完标志 发完=0
bit outbufsign; //输出缓冲区非空标志 有=1
bit KeyFirst;
bit Flag_mmhg;
bit Flag_manual;
bit Flag_celsius;
bit Flag_paint;
bit Flag_work;
bit NIBP_mux;
void main ()
{
TMOD=0x21;
TH0=(65536-16667)/256;
TL0=(65536-16667)%256;
TL1=0xfd;TH1=0xfd;
SCON=0xd8;PCON=0x80;
EA=1;ES=1;
ET0=1;ET1=1;
TR0=1;
TR1=1;
outbufempty=0;
outbufsign=0;
outlast=outbuf;
putlast=outbuf;
P3=P3|0x38;
KeyFirst=0;
count_key_busy=0;
count_key_idle=0;
while (1)
{
uchar Keyvalue=0;
Keyvalue=Getkey();
if (Keyvalue!=0)
{
switch (Keyvalue)
{
case 0x30: putbyte(0xfe); putbyte(0x0f); break; //对应左键,发enter
case 0x28: putbyte(0xfe); putbyte(0x4b); break; //对应中间的键,发left
case 0x18: putbyte(0xfe); putbyte(0x4d); break; //对应右键,发right
default: break;
}
}
}
}
void delay(uint n)
{
uint i;
for(i=0;i<n;i++)
{
;
}
}
uchar Getkey(void)
{
uchar KeyTemp=0;
if((P3&0x38)!=0x38)
{
count_key_busy++;
count_key_idle=0;
if (KeyFirst)
{
delay(10);
if((P3&0x38)!=0x38)
{
KeyFirst=0;
count_key_busy=0;
KeyTemp=P3&0x38;
return KeyTemp;
}
}
else if (count_key_busy>=2000)
{
count_key_busy=0;
KeyTemp=P3&0x38;
return KeyTemp;
}
else return 0;
}
else
{
count_key_idle++;
if (count_key_idle>=2000)
{
count_key_idle=0;
KeyFirst=1;
return 0;
}
else return 0;
}
}
//*****************************
//放入一个字节到发送缓冲区
void putbyte (uchar c)
{
//ES=0; //暂停串行中断,以免数据比较时出错
*putlast=c; //放字节进入缓冲区
putlast++; //发送缓冲区指针加一
if (putlast==outbuf+OLEN)
{
putlast=outbuf; //指针到了顶部换到底部
outbufsign=1;
}
//ES=1;
if (!outbufempty) //缓冲区开始为空置为有,启动发送
{
outbufempty=1;
TI=1;
}
}
//*****************************************
//串口中断处理
void RS232( ) interrupt 4 using 1
{
uchar value_rs;
if (TI)
{
TI = 0;
if (outbufsign)
{
SBUF=*outlast; //未发送完继续发送
outlast++; //最后传出去的字节位置加一
if (outlast==outbuf+OLEN) outlast=outbuf; //地址到顶部回到底部
if (putlast==outlast) outbufsign=0; //数据发送完置发送缓冲区空标志
}
else outbufempty=0;
}
if (RI) // 接收中断
{
value_rs=SBUF;
switch (value_rs)
{
case 0x40: Flag_mmhg=1; break; //传mmhg
case 0x41: Flag_mmhg=0; break; //传kpa
case 0x42: Flag_manual=1; break; //手动
case 0x43: Flag_manual=0; break; //自动
case 0x50: NIBP_mux=300; break; //成人压
case 0x54: NIBP_mux=240; break; //儿童压
case 0x58: NIBP_mux=180; break; //婴儿压
case 0x60: Flag_celsius=1; break; //摄氏温度
case 0x61: Flag_celsius=0; break; //华氏温度
case 0x20: Flag_work=1; break; //工作模式
case 0x21: Flag_work=0; break; //演示模式,串口不发数据,只接收
case 0x22: Flag_paint=1; break; //九道波形数据
case 0x23: Flag_paint=0; break; //八道波形数据
default: break;
}
RI=0;
}
}Top
5 楼Nal_ra_007()回复于 2005-04-05 23:08:23 得分 0
为什么程序进不了中断里面啊?仿真时直接改变TI,RI也不行啊?Top
6 楼Nal_ra_007()回复于 2005-04-06 18:28:18 得分 0
终于搞明白了,开ET0、ET1,没写程序进去,老是跳出,唉!
Top




