单片机
返回首页

位寻址和不可位寻址

2017-01-11 来源:eefocus

#include    // 引用52包文件

sbit P0_0 = P0^0;     // 定义P0第0个管脚

sbit P0_1 = 0x81;     // 定义P0第1个管脚

sbit P0_2 = 0x80^2;   // 定义P0第2个管脚

 

void main()

{

P0_0 = 0;             // 点亮P0第1管脚连接的LED

P0_1 = 0;

P0_2 = 0;

}

为什么用三种方式设置引脚都可以呢,这是因为P0口可以按位寻址,STC单片机的特殊功能寄存器布局如下:

 

 

从上图可以看到,P0口是处在可位寻址区,可位寻址的特性就是这样,以sbit P0_1 = 0x81代码为例

sbit关键字指定了后面的变量是要位寻址,赋值P0_1 = 0x81,系统会找到寄存器地址0x80,然后再找对应的位,同理,SCON对应的地址是0x98也是处在可位寻址,也是可以直接赋值位,如下代码

#include       // 引用52包文件

sbit P0_0 = P0^0;        // 定义P0第0个管脚

sbit P0_1 = 0x81;        // 定义P0第1个管脚

sbit P0_2 = 0x80^2;      // 定义P0第2个管脚

sbit TCON_0 = TCON^0;

sbit TCON_1 = 0x89;

 

void main()

{

P0_0 = 0;                // 点亮P0第1管脚连接的LED

P0_1 = 0;

P0_2 = 0;

TCON_0 = 0;

TCON_1 = 0;

}

细心的朋友会发现,在reg52.h中定义了 sfr SP = 0x81;那么,为什么代码中sbit P0_1 = 0x81和sfr SP = 0x81不冲突呢,这不是sfr和sbit关键字的区别了,系统会自动根据不同的关键字处理不同的操作,举个简单的例子,你和邻居家都有8个柜子,你家的门牌号是0x80,邻居家的是0x81

sbit P0_1 = 0x81就好比是先找到你家的地址0x80,再找到你家的第一个柜子的位置,即0x80 + 0x01 = 0x81,而sfr SP = 0x81则仅仅是只到邻居家的地址;

有了上面的理解,我们可以在代码里验证一下,当增加代码sbit SP_0 = SP^0; 后编译 提示 light.c(8): error C146: 'SP': invalid base address,根本就编译不过去,也就是说,系统不可位寻址区是不能按位访问的,

#include      // 引用52包文件

sbit P0_0 = P0^0;       // 定义P0管脚1

sbit P0_1 = 0x81;       // reg52.h中定义了 sfr SP = 0x81;

sbit P0_2 = 0x80^2;

sbit TCON_0 = TCON^0;

sbit TCON_1 = 0x89;

//sbit SP_0 = SP^0;     // 提示 light.c(8): error C146: 'SP': invalid base address

 

void main()

{

P0_0 = 0;               // 点亮P0第1管脚连接的LED

P0_1 = 0;

P0_2 = 0;

TCON_0 = 0;

TCON_1 = 0;

SP = 0x81;              // 可以给SP直接赋值 这时SP地址中的数据是0x81

}

 

要点:

1.位寻址可以直接操作地址中的某一个位中的数据


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 家用电源无载自动断电装置的设计与制作

  • PIC单片机控制的遥控防盗报警器电路

  • 短波AM发射器电路设计图

  • 使用ESP8266从NTP服务器获取时间并在OLED显示器上显示

  • 如何构建一个触摸传感器电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章