51avr单片机和51的区别一个疑惑求解,

查看: 3991|回复: 20
51单片机无法在中断服务函数中使用全局变量,求解
变量i无法传递到中断服务函数里,能编译通过,但是用起来i的值一直是错的
后来老师在前面加个了个data就行了。不懂为什么。#include &reg51.h&
data int i=0;
void delay()
{int i,j;
for(i=100;i&0;i--)
{for(j=10;j&0;j--)
& & & & {
& & & & & & & &
& & & & & & & & }
& & & & & & & & }& & & &
void timer_int()
{
& & & & TMOD=0x01;
& & TH0=0xf8;
& & TL0=0x8c;
& & & & EA=1;
& & ET0=1;
& & TR0=1;
}
main()
{
&&
&&P1=0x00;
&&timer_int();
&&
&&
&&for(;;)
& &&&{
& & & & if(P2==0xfe)
& & & && &{i=1;}
& && &&&else if(P2==0xfd)
& & & && &{i=2;}
& && &&&else if(P2==0xfb)
& & & && &{i=3;}
& & & & else{i=0;}
& & & &
& & & & delay();
& & & &
& &&&}
& & & &
void TIMER() interrupt 1 using 2
{
& &&&
if(i==0){ P1=0}
else{
& &if(i==1){&&
& && & & & TH0=0
& && &&&TL0=0x09;}
&&
& &else if(i==2){&&
& && & & & TH0=0
& && &&&TL0=0x44;}
& &else if(i==3){&&
& && & & & TH0=0
& && &&&TL0=0}
& & P1=~P1;
& & & & }
&&
& &
& &
}
复制代码
它的作用是指定使用0x00到0x7f的128个ram,可以让acc直接读取速度快。但是这里是撒子原因的确有点疑惑。
<font color="# 发表于
它的作用是指定使用0x00到0x7f的128个ram,可以让acc直接读取速度快。但是这里是撒子原因的确有点疑惑。 ...
貌似和编译有关系,有的编译器就可以用。
出错和寄存器分配有关
还好是测试程序,如果真正的应用程序出现这样的摸不着头脑的问题。。抓狂死了。。
曾经遇到过一次。。。
中断里面用到的全局变量,定义时加volatile
有主循环么?
对于Keil C51,如果定义的全局变量,默认是 volatile的。
加一个 data,只是指示存储的位置不一样而已。
楼主应该去看一下反汇编就知道是什么原因。
不过我貌似也没看出是什么原因。只是疑惑你说“错的”到底是如何“错的”?
Louis_Bright 发表于
对于Keil C51,如果定义的全局变量,默认是 volatile的。
加一个 data,只是指示存储的位置不一样而已。
以前好像遇到过一次情况,发现默认并非volatile的。
至于楼主的情况,很可能是内存模式设置成了large,所以变量默认是xdata,而楼主的系统里并没有XRAM,导致这个变量没有对应的物理空间。加上data后,就强制使用片内RAM,所以有效了。楼主贴上编译结果,再对照硬件参数分析一下就知道了。
qllaoda1 发表于
以前好像遇到过一次情况,发现默认并非volatile的。
至于楼主的情况,很可能是内存模式设置成了large,所 ...
对的,确实是设置为large,那怎么设置才能让他默认使用片内ram呢
chen1986sl 发表于
还好是测试程序,如果真正的应用程序出现这样的摸不着头脑的问题。。抓狂死了。。
曾经遇到过一次。。。 ...
找到什么原因了么
quzhanguang1 发表于
对的,确实是设置为large,那怎么设置才能让他默认使用片内ram呢
内存模式设置为small即可。不过如果变量太多,还是会占用XRAM的,你要结合编译提示来看。如果编译器最终提示有XDATA,而你的系统里并没有XRAM,这个程序肯定就没法正常运行了。
在中断中用到的全局变量我都是volatile idata 管它默认是什么,省得少写出问题找原因,可能这是懒办法,或许就不是个办法
我也遇到这个问题 了 多谢大神指点
把using2去掉就OK了
03.data int i=0;
04.void delay()
05.{int i,j;
在函数里再定义一次也可以么?
void TIMER() interrupt 1 using 2
把USING2删了就可以了
我的也用不了。。加一个data的方法是通用的嘛
我的也用不了。。加一个data的方法是通用的吗?
03.data int i=0;
04.void delay()
被 shadow 掉了。
中断里面用到的全局变量,定义时加volatile
在中断中用到的全局变量我都是volatile idata 管它默认是什么,省得少写出问题找原因,可能这是懒办法,或 ...
一定要加这个的,记号 volatile idata
阿莫电子论坛, 原"中国电子开发网"
, 原www.ourdev.cn, 原www.ouravr.com51单片机中的_crol_的内容是什么?求解_百度知道
51单片机中的_crol_的内容是什么?求解
我有更好的答案
循环左移的意思,要是_cror_就是循环右移的意思,一般这样的语句后面还有一对(A,B),A是被循环移动的数字,B是次数
采纳率:43%
_crol_ (temp,1) 是带进位位左移一位,相当汇编里的RLC A 而&&1 是不带进位位的左移一位,相当汇编里的RL A。
跟左移&&一样的~!只不过是一个函数形式~!
为您推荐:
其他类似问题
您可能关注的内容
51单片机的相关知识
&#xe675;换一换
回答问题,赢新手礼包&#xe6b9;
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。一个小白对51单片机的憧憬与疑惑_51单片机吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:59,470贴子:
一个小白对51单片机的憧憬与疑惑收藏
自己现在能写出一些很简单的程序,有一些c的基础虽然不是很好。憧憬:我想自己做一个计算器,想自己做一个闹钟,做一个……疑问:每个设备都要一个51单片机吗?那成本太高了啊,体积也太大不方便啊。
比如说一个最简单的电子玩具中,也只有那么几个芯片,它是怎么实现程序运行这一系列动作的?
同步整流升压芯片,小封装升压芯片,大电流升压芯片,免费提供样品及DEM板测试,快充3V升12V/1.5A升压方案 免费提供样品板联系:
OTP 4bit的片子零售才1块钱,批发就肯定更便宜如果量很大,可以订制片子或者用现成的电路,就更便宜了。就算用51,零售也才三四块钱一片,与十多年前比起来,已经很便宜了。不过51功能太弱,价格又贵,感觉现在很少在电子产品上看到它。
登录百度帐号51单片机 我需要计算一个式子,不会写,求助_百度知道
51单片机 我需要计算一个式子,不会写,求助
我需要计算T=157.15-84.82*V0V0是(R2,R3)/4095*10R2是数据高4位,R3是数据低八位(就是12位AD转换出来的值)新手,求高手指导啊
先合并R2和R3;(R2&&4) |(R3)就是AD的值。
采纳率:38%
推荐你去中国电子DIY之家看看。
很疑惑的问,为什么是4095而不是4096
为您推荐:
其他类似问题
您可能关注的内容
51单片机的相关知识
&#xe675;换一换
回答问题,赢新手礼包&#xe6b9;
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。51单片机中断嵌套怎么写?刚学,不太会,很疑惑,求大神解答【51单片机不保守交流吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0可签7级以上的吧50个
本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:960贴子:
51单片机中断嵌套怎么写?刚学,不太会,很疑惑,求大神解答
比如用外部中断0和1,就把两个用外部中断1个外部中断0写的函数放在主函数后面就行了吗,很疑惑
热销好货「天猫618」大牌尖货,限量特惠折上折,购物满就返红包,多买多得,不可错过!「天猫618」理想生活狂欢季,&嗨&购大品牌!
分别写两具中断就可以了。中断程序是独立的,运行的时候才“有可能”出现嵌套。不用特别的去写。
贴吧热议榜
使用签名档&&
保存至快速回贴

我要回帖

更多关于 pic单片机与51的区别 的文章

 

随机推荐