题记:刚开始练51时就用C语言,现在想再加强一下汇编,所以不得不对单片机的硬件结构,特别是地址空间的分配方面详细的做一下了解了。 于是决定拿起课本北航的《智能化测量控制仪表原理与设计》重新学一遍。书本是基础,然后应该把自己的一些应用体会实例什么的也加上去,这样学起来就事半功 倍了毕竟这是再学习不是入门了。

51单片机的存储器结构:

在物理上可以分为4个 存储器空间:即片内ROM,片外ROM,片 内RAM,片外RAM。51/52单片机有64KB(2的16次方,16条 地址线寻址)的ROM地址空间。其中51有4KB的片内ROM,52有8KB的片内ROM。至于使用片内还是片外的存储器,可以靠控制信号EA脚 来设置,当从片内存储器开始取指令时,EA脚接正(对于ROM型 单片机,通常采取此方式),此时如果指令地址超过4KB空间,则自动从片外开始取指令。而如果不使 用片内存储器只从片外存储器取指令时,将EA接地即可。

ROM中有些单元是保留给系统使用的:0000-0002H单 元是所有执行程序的入口地址,复位后程序总是从0000H单元开始执行。(所以在汇编的开始总是一 句

ORG    0000

LJMP   nnnn       ;主程序中断入口

这个语句的意思是在0000这个地址上存放着LJMP nnnn这个语句,这里的nnnn是程序的入 口地址,也就是编程者希望上电后程序从哪个地方开始执行)。

0003-002AH单元均匀的分为5段, 用于5个中断服务程序的入口。(例如

ORG   00BH

LJMP  BT0         ;TO中断入口

也就是说00BH上存放着LJMP BTO这个语句,当产生TO中断时,前提当然 是此中断处于开启状态了,程序将执行该语句,然后跳转到BT0所指的地址上的程序继续执行)。

51/52的片内数据存储器RAM有256Byte,其中00H-7FH地址空间是直接寻 址区。该区从00H-1FH是工作寄存器区,有4组 工作寄存器组,至于使用哪一组则有PSW的RS0和RS1的状态决定。片内RAM的20H-2FH地址为位寻址区。片内RAM的80H-FFH地址空间是特殊功能寄存器(SFR) 区。52系列有26个特殊功能寄存器。下面 就把头文件reg52.h里的部分内容贴出来。(对于寄存器地址参考头文件就足够了,对于别的一些CPU也差不多)。

/*-------------------------------------------------------------------

REG52.H

Header file for generic 80C52 and 80C32 microcontroller.

Copyright (c) 1988-2001 Keil Elektronik GmbH and Keil Software, Inc.

All rights reserved.

-------------------------------------------------------------------*/

/*  BYTE Registers  */

sfr P0    = 0x80;

sfr P1    = 0x90;

sfr P2    = 0xA0;

sfr P3    = 0xB0;

sfr PSW   = 0xD0;

sfr ACC   = 0xE0;

sfr B     = 0xF0;

sfr SP    = 0x81;

sfr DPL   = 0x82;

sfr DPH   = 0x83;

sfr PCON  = 0x87;

sfr TCON  = 0x88;

sfr TMOD  = 0x89;

sfr TL0   = 0x8A;

sfr TL1   = 0x8B;

sfr TH0   = 0x8C;

sfr TH1   = 0x8D;

sfr IE    = 0xA8;

sfr IP    = 0xB8;

sfr SCON  = 0x98;

sfr SBUF  = 0x99;

/*  8052 Extensions  */

sfr T2CON  = 0xC8;

sfr RCAP2L = 0xCA;

sfr RCAP2H = 0xCB;

sfr TL2    = 0xCC;

sfr TH2    = 0xCD;

关于MCU的时钟问题:

一般用的是12MHz的 晶体,而MCU执行一个机器周期需要12各 时钟周期(所谓时钟周期,就是指晶体振荡一个周期的时间),那么正好是1us,一般的指令需要1-2个机器周期即可完成,乘除指令的运算量比较大需要4各 机器周期。

寻址方式:

51单片机有7种 寻址方式。

1、寄存器寻址:前面提到 了内部RAM中的00H-1FH地址单元作 为工作寄存器使用。一共是有32各地址单元,分成四组,每组有8个寄存器,命名为R0-R7,每次可以使用其中的一 组。当使用R0-R7来表示操作数时,就属于寄存器寻址方式。

例如:MOV  A,R0;把寄存器R0的内容送入累加器A中

2、直接寻址:在指令中直 接给出操作数地址,就属于直接寻址方式。此时指令的操作数部分直接是操作数的地址。

例如:MOV A,2AH ;把RAM地 址2AH的内容送入累加器A中

3、立即寻址:

例如:MOV A,#3AH ;该指令就是表示把立即数3AH送入累加器A中,立即数前加上一个#,和直接寻址方式区分

4、寄存器间接寻址:若以 寄存器的名称直接给出操作数的地址,则称为寄存器间接寻址。

例如:MOV A,@R0 ;该指令是把RO里 的内容作为地址,这个地址的数据送入累加器A,注意前面需要加@

5、变址寻址:变址寻址是 以某个寄存器的内容为基本的地址,然后在这个基址上加以地址的偏移量,才是真正的操作数地址。

例如:MOV A,@A+DPTR ;地址是A+DPTR的 值,这个地址的内容送如累加器A

6、相对寻址:相对转移指 令需要用到相对寻址方式,此时操作数部分给出的是地址的相对偏移量部分。

目的地址 = 源地址+ 指令 字节数+ rel(rel可正可负)

例如:SJMP rel

7、位寻址:概念就不做解 释了。还是把reg52.h这个头文件贴出来说。

/*  BIT Registers  */

/*  PSW  */

sbit CY    = PSW^7;

sbit AC    = PSW^6;

sbit F0    = PSW^5;

sbit RS1   = PSW^4;

sbit RS0   = PSW^3;

sbit OV    = PSW^2;

sbit P     = PSW^0; //8052 only

/*  TCON  */

sbit TF1   = TCON^7;

sbit TR1   = TCON^6;

sbit TF0   = TCON^5;

sbit TR0   = TCON^4;

sbit IE1   = TCON^3;

sbit IT1   = TCON^2;

sbit IE0   = TCON^1;

sbit IT0   = TCON^0;

/*  IE  */

sbit EA    = IE^7;

sbit ET2   = IE^5; //8052 only

sbit ES    = IE^4;

sbit ET1   = IE^3;

sbit EX1   = IE^2;

sbit ET0   = IE^1;

sbit EX0   = IE^0;

/*  IP  */

sbit PT2   = IP^5;

sbit PS    = IP^4;

sbit PT1   = IP^3;

sbit PX1   = IP^2;

sbit PT0   = IP^1;

sbit PX0   = IP^0;

/*  P3  */

sbit RD    = P3^7;

sbit WR    = P3^6;

sbit T1    = P3^5;

sbit T0    = P3^4;

sbit INT1  = P3^3;

sbit INT0  = P3^2;

sbit TXD   = P3^1;

sbit RXD   = P3^0;

/*  SCON  */

sbit SM0   = SCON^7;

sbit SM1   = SCON^6;

sbit SM2   = SCON^5;

sbit REN   = SCON^4;

sbit TB8   = SCON^3;

sbit RB8   = SCON^2;

sbit TI    = SCON^1;

sbit RI    = SCON^0;

/*  P1  */

sbit T2EX  = P1^1; // 8052 only

sbit T2    = P1^0; // 8052 only

/*  T2CON  */

sbit TF2    = T2CON^7;

sbit EXF2   = T2CON^6;

sbit RCLK   = T2CON^5;

sbit TCLK   = T2CON^4;

sbit EXEN2  = T2CON^3;

sbit TR2    = T2CON^2;

sbit C_T2   = T2CON^1;

sbit CP_RL2 = T2CON^0;

从前面的特殊功能寄存器地址里已经了解了它们在RAM中的存 放地址,这里又对它们中的部分寄存器的各个位做了定义,也就是说,这些各个位做了定义的寄存器,它们的每一个位是可以单独进行操作的。

例如STEB EA;EA置1,表示开总中断,EA又是IE寄存器的最高位,这里单独对它进行操作,可以免去对整个IE寄 存器做赋值操作,优化程序

通过这些知识的复习,我觉得下一步该动手写程序感受一下了。

单片机c语言片外寻址指令,51手记之寄存器寻址篇相关推荐

  1. 单片机c语言100例 的案例,51单片机C语言100个实例 [推荐下载】

    51单片机c语言100例 ,墙裂推荐下载 附上目录 ************************************************************函数的使用和熟悉****** ...

  2. 单片机c语言程序开发洗衣机,基于51单片机洗衣机控制器的设计(附程序)☆

    基于51单片机洗衣机控制器的设计(附程序)☆(任务书,开题报告,中期检查表,毕业论文21000字,程序) 摘  要 洗衣机是人们日常生活中常见的一种家电,已经成为人们生活中不可缺少的家用电器.在工业生 ...

  3. 51单片机C语言访问外ram,C51中访问外部RAM的方法

    C51的P0,P2口做外部扩展时使用,其中XBYTE [0x0002],P2口对应于地址高位,P0口对应于地址低位.一般P2口用于控制信号,P0口作为数据通道. XBYTE定义的是外部地址,这样才能和 ...

  4. 单片机c语言reti的用法,基于51单片机中断跳出指令“RETI”浅议

    原标题:基于51单片机中断跳出指令"RETI"浅议 =RET指令+通知CPU中断服务已结束. 最近在基于编程的过程中出现了个很奇怪的问题"程序执行中在寄存器EA=1,ET ...

  5. 单片机c语言reti的用法,谈谈51单片机的RETI指令

    最近在基于51单片机编程的过程中出现了个很奇怪的问题"程序执行中在寄存器EA=1,ET0=1,TR0=1条件下,单TF0=1时并没有执行中断". 在有过单片机中断编程经历者都知道当 ...

  6. 51单片机c语言编程的头文件,51单片机编程的头文件reg51.h详解

    我们在用c语言编程时往往第一行就是头文件,51单片机为reg51.h或reg52.h,51单片机相对来说比较简单,头文件里面内容不多,像飞思卡尔.ARM系列的单片机头文件往往内容就非常多,尽管如此,对 ...

  7. 单片机c语言计数器测速,基于51单片机的光电编码器测速.doc

    课程设计报告 课程名称: 微机原理课程设计 题 目: 基于51单片机的光电编码器测速 摘要 光电编码器是高精度位置控制系统常用的一种位移检测传感器.在位置控制系统中,由于电机既可能正转,也可能反转,所 ...

  8. 单片机 c语言百位加上小数点,51单片机水温控制LCD显示加VB上位机温度曲线绘制...

    现功能,1L水由1KW电炉加热,要求水温在一定范围内人工设定,并能随着环境温度改变自动调节,以维持设定的温度不变. 矩阵键盘输入设定温度,LCD1602显示温度值,VB上位机绘制温度曲线 /***** ...

  9. 单片机c语言交通信号灯设计,基于51单片机的交通信号灯设计毕业设计.pdf

    摘 要 在现代城市中,随着人口和汽车的急剧增长,市区交通日益拥挤,要是没有红绿灯 作为指挥工具,恐怕川流不息的汽车就会由于混乱而造成严重阻塞.因此,交通灯是交 管部门管理城市交通的重要工具之一.随着电 ...

最新文章

  1. php mysql 星级评分_jQuery+PHP实现星级评分
  2. Flashback Query笔记
  3. shell常用命令总结总结
  4. 【多重背包】太空电梯(jzoj 1286)
  5. python selenium 判断元素是否可见
  6. 阿里智能运维平台如何助力研发应对双11挑战
  7. CVPR2020 | 当目标跟踪遇上对抗攻击
  8. 【Oracle】redo与undo
  9. 如何使用VS2012进行简单程序的DEBUG(入门级)
  10. Hibernate之DetachedCriteria、Criteria
  11. 车间调度建模系列8|扩展析取图之基于时间片段的赋时三维析取图模型
  12. 基于Word2vec文本聚类
  13. 【转载】UWP应用设置和文件设置:科普
  14. iPhone自定义铃声(iOS12 + iTunes in macOS Mojave)
  15. 设计32信道的多相滤波结构数字接收机
  16. mui.fire运用
  17. 广东省中医院微信公众号医保个账支付功能
  18. “RTOS:实时应用的操作系统”
  19. English Learning - L3 综合练习 1 VOA-Color 2023.04.26 周三
  20. iphonex正面图_iPhoneX高清全方位图赏

热门文章

  1. 解决:dependencies.dependency.version' for com.google.guava:guava:jar is missing.
  2. Iterator方法详解
  3. 《建筑工程定额与预算》
  4. 2021年3月PHP免费自学最全教程来了
  5. torch.optim.lr_scheduler.LambdaLR与OneCycleLR
  6. 超简单安装Win10!不用U盘!保留原应用快速纯净!安装Window10系统,Windows7升级到Windows10。(亲测有效)
  7. 【python】用tkinter做一个最近很火的强制表白神器
  8. 2D降噪3D降噪(NR:Noise Reduce)
  9. matlab 图片雾化代码,雾化效果图片制作代码汇总
  10. 图片怎么加水印?添加水印其实很简单