单片机学习小组
直播中

李杨

7年用户 134经验值
私信 关注

51单片机中指针不适于SFR的操作

      近来我也投入了学习STM32的战斗。我采用的方案是先熟悉寄存器,至于库函数,我认为就是对代码的整理、美观化、直观化和形象化,再就是封装——这些工作可以慢慢来,寄存器的操作熟悉了、库函数是理所当然!
      我突发奇想地要把STM32操作寄存器的方式应用于51单片机上。比如:要点亮P1^0一个LED小灯。已知P1的地址为90H,头文件“Reg52.h”中有:sfr  P1=0x90。我想不加头文件,也不加这句sfr P1=0x90,也跟STM32一样来个#define P1  (*(volatile u8 *)0x90)     1=0xfe。
        结果不如我所愿。百思后终于得其解。
        结论:访问51系列单片机的特殊功能寄存器SFR,必须采用直接寻址;访问52单片机RAM区的高128字节(51只有低128B),必须采用间接寻址。
        上面用到指针,也就是间接寻址,访问到的是属于RAM区的高128字节。也就是KeilC51 中idata类型。

回帖(5)

李雪雅

2019-6-21 13:27:12
51内部地址特殊功能寄存器的地址跟高字节128是重复的,51就是通过指令读取方式区分。
举报

翁靠庭

2019-6-21 13:43:20
我也这样想过但51的寄存器不多啊   直接操作比较方便
举报

陈红娟

2019-6-21 13:49:45
这个结论我不是很信服,建议LZ反汇编出来看看
举报

张峰

2019-6-21 13:57:27
     不知道您用过51单片机没。
    也不知道您试过没。
    
    51内部地址特殊功能寄存器的地址跟RAM高字节128是重复的,通过不同的寻址方式加以区分——访问51系列单片机的特殊功能寄存器SFR,必须采用直接寻址;访问52单片机RAM区的高128字节(51只有低128B),必须采用间接寻址。
    一般介绍51单片机的资料会提到这个,尤其是汇编教材更是必然。
    其实这是51单片机芯片本身的规则,而不是某某个人下的论断。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分