CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  硬件/嵌入开发 >  单片机/工控

有关keil51仿真过程中的问题

楼主Nal_ra_007()2005-04-04 19:32:54 在 硬件/嵌入开发 / 单片机/工控 提问

用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

相关问题

  • 有关uv2软件仿真的问题
  • 有关过程的问题?
  • 有关过程的问题?
  • 有关存储过程的!
  • 问Robocup仿真
  • 有关存储过程,再次请教!
  • 有关存储过程,再次请教!!
  • 有关存储过程的问题
  • 紧急问题!有关存储过程!
  • 有关存储过程的问题!

关键词

  • 中断
  • ti
  • 数据
  • outlast
  • putlast
  • putbyte
  • 缓冲区
  • outbufempty
  • outbufsign
  • olen

得分解答快速导航

  • 帖主:Nal_ra_007
  • icesnows
  • li_hai_quan
  • flowercity

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo