搜索
bottom↓
回复: 20

51单片机无法在中断服务函数中使用全局变量,求解

[复制链接]

出0入0汤圆

发表于 2013-4-17 01:03:30 | 显示全部楼层 |阅读模式
变量i无法传递到中断服务函数里,能编译通过,但是用起来i的值一直是错的
后来老师在 int i;前面加个了个data就行了。不懂为什么。
  1. #include "reg51.h"

  2. data int i=0;
  3. void delay()
  4. {int i,j;
  5. for(i=100;i>0;i--)
  6. {for(j=10;j>0;j--)
  7.         {
  8.                
  9.                 }
  10.                 }       
  11.        
  12. }

  13. void timer_int()
  14. {
  15.         TMOD=0x01;
  16.     TH0=0xf8;
  17.     TL0=0x8c;
  18.    
  19.         EA=1;
  20.     ET0=1;
  21.     TR0=1;
  22. }


  23. main()
  24. {
  25.   

  26.   P1=0x00;
  27.   timer_int();
  28.   
  29.   
  30.   for(;;)
  31.      {
  32.         if(P2==0xfe)
  33.           {i=1;}
  34.         else if(P2==0xfd)
  35.           {i=2;}
  36.         else if(P2==0xfb)
  37.           {i=3;}
  38.         else{i=0;}
  39.        
  40.         delay();
  41.        
  42.      }
  43.        
  44.        


  45. }


  46. void TIMER() interrupt 1 using 2
  47. {

  48.      
  49. if(i==0){ P1=0xff;}

  50. else{
  51.    if(i==1){  
  52.            TH0=0xff;
  53.         TL0=0x09;}
  54.   
  55.    else if(i==2){  
  56.            TH0=0xfc;
  57.         TL0=0x44;}
  58.    else if(i==3){  
  59.            TH0=0xfc;
  60.         TL0=0xac;}

  61.     P1=~P1;
  62.         }
  63.   
  64.    
  65.    
  66. }
复制代码

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2013-4-17 01:15:32 来自手机 | 显示全部楼层
它的作用是指定使用0x00到0x7f的128个ram,可以让acc直接读取速度快。但是这里是撒子原因的确有点疑惑。

出0入0汤圆

 楼主| 发表于 2013-4-17 01:50:09 | 显示全部楼层
1066950103 发表于 2013-4-17 01:15
它的作用是指定使用0x00到0x7f的128个ram,可以让acc直接读取速度快。但是这里是撒子原因的确有点疑惑。 ...

貌似和编译有关系,有的编译器就可以用。
出错和寄存器分配有关

出0入0汤圆

发表于 2013-4-17 03:03:04 | 显示全部楼层
还好是测试程序,如果真正的应用程序出现这样的摸不着头脑的问题。。抓狂死了。。

曾经遇到过一次。。。

出0入0汤圆

发表于 2013-4-17 06:58:25 来自手机 | 显示全部楼层
中断里面用到的全局变量,定义时加volatile

出0入0汤圆

发表于 2013-4-17 08:31:51 | 显示全部楼层
有主循环么?

出0入0汤圆

发表于 2013-4-17 09:12:57 | 显示全部楼层
对于Keil C51,如果定义的全局变量,默认是 volatile的。
加一个 data,只是指示存储的位置不一样而已。
楼主应该去看一下反汇编就知道是什么原因。
不过我貌似也没看出是什么原因。只是疑惑你说“错的”到底是如何“错的”?

出0入0汤圆

发表于 2013-4-17 09:24:39 | 显示全部楼层
Louis_Bright 发表于 2013-4-17 09:12
对于Keil C51,如果定义的全局变量,默认是 volatile的。
加一个 data,只是指示存储的位置不一样而已。
楼 ...


以前好像遇到过一次情况,发现默认并非volatile的。
至于楼主的情况,很可能是内存模式设置成了large,所以变量默认是xdata,而楼主的系统里并没有XRAM,导致这个变量没有对应的物理空间。加上data后,就强制使用片内RAM,所以有效了。楼主贴上编译结果,再对照硬件参数分析一下就知道了。

出0入0汤圆

 楼主| 发表于 2013-4-17 11:04:25 | 显示全部楼层
qllaoda1 发表于 2013-4-17 09:24
以前好像遇到过一次情况,发现默认并非volatile的。
至于楼主的情况,很可能是内存模式设置成了large,所 ...

对的,确实是设置为large,那怎么设置才能让他默认使用片内ram呢

出0入0汤圆

 楼主| 发表于 2013-4-17 11:07:06 | 显示全部楼层
chen1986sl 发表于 2013-4-17 03:03
还好是测试程序,如果真正的应用程序出现这样的摸不着头脑的问题。。抓狂死了。。

曾经遇到过一次。。。 ...

找到什么原因了么

出0入0汤圆

发表于 2013-4-17 11:09:04 | 显示全部楼层
quzhanguang1 发表于 2013-4-17 11:04
对的,确实是设置为large,那怎么设置才能让他默认使用片内ram呢

内存模式设置为small即可。不过如果变量太多,还是会占用XRAM的,你要结合编译提示来看。如果编译器最终提示有XDATA,而你的系统里并没有XRAM,这个程序肯定就没法正常运行了。

出70入0汤圆

发表于 2013-4-19 11:34:59 | 显示全部楼层
在中断中用到的全局变量我都是volatile idata 管它默认是什么,省得少写出问题找原因,可能这是懒办法,或许就不是个办法

出0入0汤圆

发表于 2013-10-27 14:19:44 | 显示全部楼层
我也遇到这个问题 了 多谢大神指点

出0入0汤圆

发表于 2014-4-12 15:42:54 | 显示全部楼层
把using2去掉就OK了

出20入22汤圆

发表于 2014-4-12 19:53:54 | 显示全部楼层
03.data int i=0;

04.void delay()

05.{int i,j;
在函数里再定义一次也可以么?

出0入0汤圆

发表于 2014-4-16 13:22:51 | 显示全部楼层
void TIMER() interrupt 1 using 2
把USING2删了就可以了

出0入0汤圆

发表于 2014-10-6 11:54:59 | 显示全部楼层
我的也用不了。。加一个data的方法是通用的嘛

出0入0汤圆

发表于 2014-10-6 11:55:28 | 显示全部楼层
我的也用不了。。加一个data的方法是通用的吗?

出0入12汤圆

发表于 2014-10-6 11:57:24 | 显示全部楼层
gyzzg2030 发表于 2014-4-12 19:53
03.data int i=0;

04.void delay()

被 shadow 掉了。

出0入0汤圆

发表于 2014-10-6 12:13:13 | 显示全部楼层
qllaoda1 发表于 2013-4-17 06:58
中断里面用到的全局变量,定义时加volatile

同意

出0入0汤圆

发表于 2015-8-8 16:53:20 | 显示全部楼层
绿茶山人 发表于 2013-4-19 11:34
在中断中用到的全局变量我都是volatile idata 管它默认是什么,省得少写出问题找原因,可能这是懒办法,或 ...

一定要加这个的,记号 volatile idata
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 10:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表