51单片机C语言学习笔记4:keil C51绝对地址访问

发布者:朱雀最新更新时间:2016-01-21 来源: eefocus关键字:51单片机  C语言学习  绝对地址访问 手机看文章 扫描二维码
随时随地手机看文章
在利用keil进行8051单片机编程的时,常常需要进行绝对地址进行访问.特别是对硬件操作,如DA AD 采样 ,LCD 液晶操作,打印操作.等等.
C51提供了三种访问绝对地址的方法: 
1. 绝对宏: 
    在程序中,用“#include”即可使用其中定义的宏来访问绝对地址,包括: 
CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD 
具体使用可看一看absacc.h便知 

例如:

#include


#define ADstart  XBYTE[0x8000]        //总线方式访问AD

#define ADL     XBYTE[0x8000]

#define ADH     XBYTE[0x8001]

 

rval=CBYTE[0x0002];指向程序存贮器的0002h地址 
rval=XWORD [0x0002];指向外RAM的0004h地址 



2. _at_关键字 
直接在数据定义后加上_at_ const即可,但是注意: 
(1)绝对变量不能被初使化; 
(2)bit型函数及变量不能用_at_指定。 

例如:


idata struct link list _at_ 0x40;指定list结构从40h开始。 
xdata char text[25b] _at_0xE000;指定text数组从0E000H开始 
提示:如果外部绝对变量是I/O端口等可自行变化数据,需要使用volatile关键字进行描述,请参考absacc.h。 

3. 连接定位控制 
    此法是利用连接控制指令code xdata pdata data bdata对“段”地址进行,如要指定某具体变量地址,则很有局限性,不作详细讨论。 

附:(c51)


/*-------------------------------------------------------------------------- 
ABSACC.H 

Direct access to 8051, extended 8051 and Philips 80C51MX memory areas. 
Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc. 
All rights reserved. 
--------------------------------------------------------------------------*/ 

#ifndef __ABSACC_H__ 
#define __ABSACC_H__ 

#define CBYTE ((unsigned char volatile code *) 0) 
#define DBYTE ((unsigned char volatile data *) 0) 
#define PBYTE ((unsigned char volatile pdata *) 0) 
#define XBYTE ((unsigned char volatile xdata *) 0) 

#define CWORD ((unsigned int volatile code *) 0) 
#define DWORD ((unsigned int volatile data *) 0) 
#define PWORD ((unsigned int volatile pdata *) 0) 
#define XWORD ((unsigned int volatile xdata *) 0) 


#ifdef __CX51__ 
#define FVAR(object, addr) (*((object volatile far *) (addr))) 
#define FARRAY(object, base) ((object volatile far *) (base)) 
#define FCVAR(object, addr) (*((object const far *) (addr))) 
#define FCARRAY(object, base) ((object const far *) (base)) 
#else 
#define FVAR(object, addr) (*((object volatile far *) ((addr)+0x10000L))) 
#define FCVAR(object, addr) (*((object const far *) ((addr)+0x810000L))) 
#define FARRAY(object, base) ((object volatile far *) ((base)+0x10000L)) 
#define FCARRAY(object, base) ((object const far *) ((base)+0x810000L)) 
#endif 

#endif 

附:(c166) 

/*-------------------------------------------------------------------------- 
ABSACC.H 

Direct access to 166 memory areas for C166/EC++ Version 5. 
Copyright (c) 1992-2004 Keil Elektronik GmbH and Keil Software, Inc. 
All rights reserved. 
--------------------------------------------------------------------------*/ 

#ifndef __ABSACC_H__ 
#define __ABSACC_H__ 

#if (__MODEL__ == 0) 
#define MVAR(object, addr) (*((object volatile *) (addr))) 
#define MARRAY(object, base) ((object volatile *) (base)) 
#else 
#define MVAR(object, addr) (*((object volatile far *) (addr))) 
#define MARRAY(object, base) ((object volatile far *) (base)) 

#define HVAR(object, addr) (*((object volatile huge *) (addr))) 
#define HARRAY(object, base) ((object volatile huge *) (base)) 
#define XVAR(object, addr) (*((object volatile xhuge *) (addr))) 
#define XARRAY(object, base) ((object volatile xhuge *) (base)) 
#endif 

#endif
关键字:51单片机  C语言学习  绝对地址访问 引用地址: 51单片机C语言学习笔记4:keil C51绝对地址访问

上一篇:51单片机C语言学习1
下一篇:51单片机C语言学习笔记5:include的区别

推荐阅读最新更新时间:2024-03-16 14:44

51单片机综合学习系统之步进电机控制篇
大家好,通过以前的学习,我们已经对51单片机综合学习系统的使用方法及学习方式有所了解与熟悉,学会了红外线遥控的基本知识,体会到了综合学习系统的易用性与易学性,这一期我们将一起学习步进电机控制的基本原理与使用方法。 先看一下我们将要使用的51单片机综合学习系统能完成哪些实验与产品开发工作:分别有流水灯,数码管显示,液晶显示,按键开关,蜂鸣器奏乐,继电器控制,IIC总线,SPI总线,PS/2实验,AD模数转换,光耦实验,串口通信,红外线遥控,无线遥控,温度传感,步进电机控制等等。 上图是我们将要使用的51单片机综合学习系统硬件平台,本期实验我们用到了综合系统主机、步进电机,综合系统其它功能模块原理与使用详见前几期《 电子制
[单片机]
<font color='red'>51单片机</font>综合<font color='red'>学习</font>系统之步进电机控制篇
如何使用8051单片机在7段显示器上显示数字?
在使用 单片机开发 项目的时候,经常会使用到7段显示器。7段显示器可以显示字母和数字,它内部是其实是发光 LED 灯,通过控制不同的 接口 点亮内部LED灯,从而显示出数字。目前,它在许多 电子产品 中用于显示 信息 ,比如:充电宝、直发器等。 7段显示器由8个LED构成,这些LED以顺序方式连接,以方便在打开某些LED组合时显示0到9的数字。点亮时,它一次只显示一位数字。 使用80 51单片机 在7段显示器上显示数字的原理图: 在7段显示器上显示从“0到F”的数字的程序是: #include reg51.h sbit a= P3^0; sbit x= P3^1; sbit y= P3^2; sbit z= P3
[单片机]
如何使用80<font color='red'>51单片机</font>在7段显示器上显示数字?
基于51单片机的超声波液位控制器设计
一.硬件方案 利用超声波传输中距离与时间的关系,采用8051单片机进行控制及数据处理,设计出了能精确测量两点间距离的超声波液位检测系统。并通过液位的高低开,通过控制继电器,选择注水或者放水。 主要由51单片机+HC-SR04超声波传感器+LCD1602液晶+水泵+按键+蜂鸣器+继电器设计而成;如图: 二.设计功能 (1)本设计中液晶显示有4个字母,分别为 H------容器的最高水位设定值(不能高于实际高度) L------容器的最低水位设定值 D-----容器实际高度(可以设置) C-----容器内液体的高度(在实际演示中,障碍物离探头越近,液晶C显示越大,因为障碍物好比液面,离探头近了说明水位高了) (2)如果容器实际
[单片机]
基于<font color='red'>51单片机</font>的超声波液位控制器设计
51单片机在片设备与中断(4)
填空 1、在串行通信中,有数据传送方向为( 单工 )、( 半双工 )和( 全双工 )三种方式。 2、要串口为10位UART,工作方式应选为( 方式1 )。 3、用串口扩并口时,串行接口工作方式应选为方式( 0 )。 4、计算机的数据传送有两种方式,即( 并行数据传送 )和( 串行数据传送 )方式,其中具有远距离成本低特点的是( 串行数据传送 )方式。 5、串行通信按同步方式可分为( 异步通信 )和( 同步通信 )。 6、异步串行数据通信的帧格式由( 起始 )位、( 数据 )位、( 奇偶校验 )位和( 停止 )位组成。 7、MCS-51有5个中断源,2个中断优先级,优先级由软件填写特殊功能寄存器(IP )加以选择。 8、
[单片机]
51单片机学习笔记(六)_串口中断通信+定时器2串口中断
51单片机默认使用定时器1作为串口通信的波特率发生器、定时器1中断通信,串口与定时器1冲突,在遇到定时器不够用的时候可以用定时器2 #include reg52.h void DelayMs(unsigned int i); void SerialInit(); void SendByte(unsigned char sbyte); void SendString(unsigned char *pstr); void main(void) { SerialInit(); while(1); //注:必需要无限循环 } /* //单片机时钟周期:11.0592MHz 以时钟1作为波特率发生器 void SerialInit
[单片机]
基于51单片机的模拟交通灯
/*----------------------------------------------- 注:P1口连接至LED用于显示红绿灯,P0口接数码管段码,用于显示时间; 两个74HC573控制段码和位码。段码接P20,位码接P21 ------------------------------------------------*/ #include reg52.h #define uchar unsigned char #define uint unsigned int sbit DUAN=P2^0; sbit WEI=P2^1; /*-------------------------------------------
[单片机]
51单片机P3口介绍
P3.0 P3.7为P3口的8位双向口线,第一功能为基本输入/输出;各脚第二功能见下表: P3口内部结构及其功能描述 如图是P2口内部1位的电路结构。 当P3端口使用第一功能(通用I/O口)输出数据时, 第二输出功能 信号应保持高电平,使与非门开锁,此时端口数据锁存器的输出端Q可以控制P3.x引脚上的输出电平; 当P3端口使用第二输出功能时,P3端口对应位的数据锁存器应置1,使与非门开锁,此时 第二输出功能 输出的信号可控制P3.x引脚上的输出电平; 当P3端口作为输入端口时,无论输入的是第一功能还是第二功能的信号,相应位的输出锁存器和 第二输出功能 信号都应保持为1,使下拉驱动器截止;
[单片机]
51单片机系列连载6—定时器初始化补充
在上一节中提到定时器很重要,而对于定时器来说,就是简单的一个初始化,只要把这个弄明白了,后面的编程操作也就水到渠成了,今天再简单地对定时器初始化做个补充。 首先,再说一下T/C(定时器/计数器)的基本结构,它们基本部件是2个8位的计数器,其中TH1和TL1是T1的计数器,TH0和TL0是T0的计数器,记住这两个计数器,后面的操作都是围绕这两个展开的,要有这种意识。 在作为定时器使用时,是对单片机内部机器周期的计数,因其内部频率为晶振频率的1/12,如果晶振频率为12MHz,则定时器每接受一个输入脉冲的时间为1us,后面很多定时都用到这个基本常识。 当它用作对外部事件计数时,接相应的外部引脚T0(P3.4)或T1(P
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved