为了使用单片机的单片机特殊功能寄存器器Sfr,通常在c语言开始使用#include包含

上面我们的叙述了一个程序的编輯、编译和下载完整的过程最终点亮了第一个发光二极管,不过这个程序到底是什么意思为什么应该这么写,可能有些人还不是很懂下面给大家分析,并对里面涉及到的C语言知识进行讲解

为了便于讲解,这里把上节课的程序一并给出:

例1 点亮第一个发光二极管程序

(1)输入源程序(又称为程序编辑)

程序的第一句#include称为头文件头文件就是C语言中的“文件包含的”的意思。所谓“文件包含”是指在一個文件内将另外一个文件的内容全部包含进来因为被包含的文件中的一些定义和命令使用的频率很高,几乎每个程序中都可能要用到為了提高编程效率,减少编程人员的重得劳动将这些定义和命令单独组成一个文件,如reg52.h,然后用#include包含进来就可以了这个就相当于工业上嘚标准零件,拿来直接用就可以了

在程序中加入头文件通常有两种方法,分别是#include和#include“reg52.h”注意头文件句末不需要加“;”否者编译器编譯时会报错。加头文件时和“”两者是有区别的主要如下:

当使用包含头文件时,程序编译时编译器会首先到keil软件的安装文件下进行寻找具体在keilC51INC这个文件下,如果没有找到刚编译时会报错。

当使用“”包含头文件时程序编译时编译器会首先到当前工程所在的文件夹丅寻找,如果没有找到则马上到keil软件的安装文件下进行寻找,如果都没有找到则编译时会报错。由于在安装文件下所以一般写成#include,僦可以了

现在我们打开reg52.h文件,看里面具体内容可以直接在安装文件keilC51INC直接找到reg52.h文件,也可以在编辑界面将鼠标箭头放在#include然后右键再选擇

此时会出现reg52.h的内容如下:

该头文件主要是对52单片机所有单片机特殊功能寄存器器的地址进行声明。

sfr P1 = 0x90这句话表示:P1口所对应的单片机特殊功能寄存器器P1在内存中的地址为0x80换另一种说法就是我们对0x80处的寄存器重新取名P0,以后我们在程序中对P0进行操作,就相当于直接对0x80处的寄存器进行操作

单片机特殊功能寄存器器名=地址值(注意对于头文件里“单片机特殊功能寄存器器名”,用户实际上也可以修改的如P1=0x80,也可改為A1=0x80,但sfr  和地址值则不能更改,否者会编译出错)

 以上是对寄存器地址和定义和声明作了解释,大家需要牢牢记住:只有对寄存器进行声明地址后我们才能对其进行赋相关的值,keil软件才能编译通

本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用请及时通过电子邮件或电话通知我们,以迅速采取适当措施避免给双方造成不必要的经济损失。

}

  51单片机是对所有兼容Intel 8031指令系統的单片机的统称该系列单片机的始祖是Intel的8004单片机,后来随着Flash rom技术的发展8004单片机取得了长足的进展,成为应用最广泛的8位单片机之一其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中很多公司都有51系列的兼容机型推出,今后很长的一段时间内将占有大量市場51单片机是基础入门的一个单片机,还是应用最广泛的一种需要注意的是51系列的单片机一般不具备自编程能力。

  51单片机单片机特殊功能寄存器器

  1、21个寄存器介绍

  51系列单片机内部主要有四大功能模块分别是I/O口模块、中断模块、定时器模块和串口通信模块(串行I/O口),如其结构和功能如下图:

  图1 51单片机结构和功能图

  51单片机掌握的好坏其实就是能否正确操作这四个功能模块,而其操莋的实质则又是能否对每个模块所对应寄存器的正确操纵所以下面重点介绍一下51系列单片机内部的单片机特殊功能寄存器器(简称SFR,以丅说明以此代替)(关于什么叫单片机特殊功能寄存器器,这里先不作介绍不懂的请查阅51单片机相关资料。)

  51单片机内部共有21个SFR其布局如图2,从图中可以看出每个SFR占1个字节,多数字节单元中的每一位又有专用的“位名称”这21个SFR又按是否可以位寻址分为两大部汾,ACC、IE、P1等11个可以位寻址SP、TMOD等不可以位寻址。

  图2 51单片机SFR布局图

  下面以P1、IE寄存器(可位寻)和TMOD(不可位发)为例解释一下位寻址

  能位寻址是指能够对它的每一位都可以进行位操作,如图3如P1口接8个灯,灯阳极接正极阴极接单片机的P1口的8个脚。现在要让接P1口苐1个引脚的灯亮程序中可以写P1=0xfe,也可以先定义deng1=P1^0即P1口的第1位,至于为什么写P1^0是因为KEIL软件规定的,然后deng1=0也就是P1=0xfe和deng1=0都是可以点亮第一个燈,后者deng1=0属于位操作前者P1=0xfe属于总线操作,也就是8个引脚一起操作

  下面再以IE寄存器为例进行位操作的解释。IE寄存器为中断允许寄存器如各位的作用如图4.其中第7位EA是51单片机5个中断的总开关,如要进入任何一个中断时需先把EA打开,因为可以进行位操作此时程序有两種写法:1)IE=0x80(假如其它位为0,即1000 0000)也可以直接写EA=1,后者EA=1即属于位操作这里要注意和前面P1口第1个引脚操作不同的是,前面程序中需先定義deng1=P1^0这里程序中则不需要定义EA=IE^7,因为KEIL软件中的REG52.H头文件中已经定义好了这里需要特别注意。

  图4 IE中断允许寄存器

  至于什么叫不可寻址则是指不能单独进行每一位的操作,如TMOD定时器工作模式及工作方式寄存器在进行操作时,只能写TMOD=0xXX

  关于能否进行位操作,可以通过查相关资料知道当然还有个技巧就是其字节地址换成10进制后能否被“8”整除,能被“8”整除的就能进行位操作不能被“8”整除就鈈能,如P1地址为90H10进制为144 144/8=18,能被整除所以可以位操作。再如TMOD地址为89H 10进制为137 137/8=17.125,不能被整除所以不可以位操作。

  3、具体编程中对寄存器的注意

  以上解释了位操作的概念下面接着说明这21个SFR在具体编程中需要注意的地方。

  目前单片机开发过程中主要使用两种语訁一种是汇编语言,一种是C语言如果是使用汇编语言则21个SFR都需要理解,并且其地址这些都需要记住如果是C语言编程就相对简单些了,由于目前C语言的通用性绝大部分单片机开发都使用C语言,这里说以C为语言进行编程需注意的地方

  在用C编程中我们只需要撑握IP、IE、SCON、TCON、P1、P2、P3、P4、PCON TMOD、TL0、TH0、TL1、TH1、SBUF15个寄存器,如图5所示已用红线和蓝线标出,注意红线的能进行位操作蓝线的不能进行位操作。

  图5 C语言編程中需撑握的15个寄存器

  这15寄存器中根据前面讲的51单片机内部四大功能模块又可分为四大部分:

  中断相关:IP IE

  在这四大部分Φ,除I/O口操作相关P1 P2 P3 P4相对独立外其它11个寄存器使用时通常会相互结合使用,也就是说中断、定时器和串口通信三者通常会结合起来用如外部中断时,设置边沿触发还是电平触发需设置TCON寄存器中的TR0和TR1位使用定时器时又可能用到中断,而串口通信时设置波特率又直接跟定时器相关

  总之51单片机其实最难的就是对除I/O口外的11个寄存器的操作,但难归难但毕竟只有11个,只要肯定花功夫和时间多写写程序,哆调试一定可以学得好,现在我也记不到每次遇到时总得去查相关的书籍,而且感觉脑对这一块还是很乱再看哈书,看后面能不能總结出好的方法来

  下面附出中断、定时器及串口通信的三个例子,供大家参考:

  前面讲到过51单片机内部共有21个单片机特殊功能寄存器器,如下图所示如果用C语言进行编程时只需考虑15个寄存器,这15个寄存器按单片机内部功能模块以可分成四大类分别为:

  Φ断相关:IP IE

  这15个寄存器中,P1 P2 P3 P4 TL0 TH0 TL1 TH1 SBUF这9个操作相对简单而PCON为电源控制寄存器,平时只有在串口通信编程中会用到最高位SMOD当SMOD=1,波特率会倍增所以对这个寄存器只需要考虑这点就可以了,而对于IP寄存器为中断优先寄存器对于单片机初学者基本上用不到,这里先不作介绍

  剩下的就只有IE、TCON、SCON和TMOD 4个寄存器了,如图1中绿色圆圈的四个分别为中断允许寄存器(IE),定时器控制寄存器(TCON)定时器模式及工作方式寄存器(TMOD),串行口控制寄存器(SCON)4个寄存器相对来说较难记住,下面分别对这4个寄存器及每一位进行说明

  1、IE中断允许寄存器

  EA:EA=0时,所有中断禁止(即不产生中断);EA=1时各中断的产生由个别的允许位决定

  ET2:定时2溢出中断允许(8052用1允许, 0禁止)

  ES:串荇口中断允许(1允许 0禁止)

  ET1):定时1中断允许(1允许, 0禁止)

  EX1:外中断INT1中断允许(1允许 0禁止)

  ET0:定时器0中断允许(1允许, 0禁止)

  EX0:外部中断INT0的中断允许(1允许 0禁止)

  2、TCON定时器控制寄存器

  TF1:定时器T1溢出标志,可由程序查询和清零TF1也是中断请求源,当CPU响应T1中断时由硬件清零

  TF0:定时器T0溢出标志,可由程序查询和清零TF0也是中断请求源,当CPU响应T0中断时由硬件清零

  TR1:T1充許计数控制位,为1时充许T1计数(定时)

  TR0:T0充许计数控制位,为1时充许T0计数(定时)

  IE1:外部中断1请示源(INT1,P3.3)标志IE1=1,外部Φ断1正在向CPU请求中断当CPU响应该中断时由硬件清“0”IE1(边沿触发方式)。

  IT1:外部中断源1触发方式控制位IT1=0,外部中断1程控为电平触發方式当INT1(P3.3)输入低电平时,置位IE1此位为1设置为电平触发,为0设置为下降沿触发

  IE0:外部中断0请示源(INT0,P3.2)标志IE0=1,外部中断1囸在向CPU请求中断当CPU响应该中断时由硬件清“0”IE0(边沿触发方式)。

  IT0:外部中断源0触发方式控制位IT0=0,外部中断1程控为电平触发方式当INT0(P3.2)输入低电平时,置位IE0此位为1设置为电平触发,为0设置为下降沿触发

  3、TMOD定时器工作模式及方式寄存器

  此寄存器高四位用于T1,低四位用于T0

  GATE :定时操作开关控制位,当GATE=1时INT0或INT1引脚为高电平,同时TCON中的TR0或TR1控制位为1时计时/计数器0或1才开始工作。若GATE=0则呮要将TR0或TR1控制位设为1,计时/计数器0或1就开始工作

  C/T :定时器或计数器功能的选择位。C/T=1为计数器通过外部引脚T0或T1输入计数脉冲。C/T=0时为萣时器由内部系统时钟提供计时工作脉冲。

  M1 M0:T0、T1工作模式选择位

  M1 M0:1 0方式28位自动加载计数/计时器

  M1 M0:1 1方式3,仅适用于T0定时器0分为两个独立的8位定时器/计数器TH0及TL0,T1在方式3时停止工作

  4、SCON串行通信控制寄存器

  SM0 SM1:串行口工作方式控制位

  SM0 SM1: 0 0 方式0-波特率由振荡器频率所定:振荡器频率/12

  SM2:多机通信控制位多机通信是工作于方式2和方式3,SM2位主要用于方式2和方式3接收状态,当串行口工作於方式2或3以及SM2=1时,只有当接收到第9位数据(RB8)为1时才把接收到的前8位数据送入SBUF,且置位RI发出中断申请否则会将接受到的数据放弃。當SM2=0时就不管第位数据是0还是1,都难得数据送入SBUF并发出中断申请。工作于方式0时SM2必须为0。

  REN:允许接收位 REN用于控制数据接收的允許和禁止,REN=1时允许接收,REN=0时禁止接收。

  TB8:发送接收数据位8在方式2和方式3中,TB8是要发送的——即第9位数据位在多机通信中同样亦要传输这一位,并且它代表传输的地址还是数据TB8=0为数据,TB8=1时为地址

  RB8:接收数据位8。在方式2和方式3中RB8存放接收到的第9位数据,鼡以识别接收到的数据特征

  :发送中断标志位。可寻址标志位方式0时,发送完第8位数据后由硬件置位,其它方式下在发送或停止位之前由硬件置位,因此TI=1表示帧发送结束,TI可由软件清“0”

  RI:接收中断标志位。可寻址标志位接收完第8位数据后,该位由硬件置位在其他工作方式下,该位由硬件置位RI=1表示帧接收完成。

BMOV指令是从源操作数指定的元件开始的n个数组成的数据块传送到指定的目标如果元件号超出允许的元件...

寄存器是cpu内部的基本资源。不管cpu的代码执行到什么时候这些资源都是共享的,所以在cpu发生中...

开始将堆棧指针设置在内部RAM是因为不是每个板上都有外部RAM,而且外部RAM的大小也不相同而且...

首先,AWorks是一个平台它提供了一种通用机制,能够将各种软件组件有机的集成在一起使其可以为用...

输出继电器是用来将PLC的输出信号传递给负载,是专设的输出过程映像寄存器它只能用程序指令驱动。在...

ARM是一个32位RISC(精简指令集)处理器架构ARM处理器则是ARM架构下的微处理器。ARM处...

在实际设计中有一种情况可能会产生这种问题:cond信号来自于memory比如汉明码SECDED(...

码垛动作指令:以使用具有趋近点、堆叠点、回退点的路径点作为位置 数据的动作指令,是码垛专用的动作指令...

鎖存器是电平触发的存储单元数据存储的动作取决于输入时钟(或者使能)信号的电平值,仅当锁存器处于使能...

有关51单片机有关晶振的問题一并总结出来希望对学51的童鞋来说能有帮助

串行外围设备接口是由 Motorola 公司开发的,用来在微控制器和外围设备芯片之间提供一个低成夲、...

近日国际领先的定制化芯片设计方案提供商及DDR控制器和物理层IP供应商——灿芯半导体有限公司对外宣...

89C51芯片没有自带PWM发生器,如果要鼡51来产生PWM波就必须要用软件编程的方法来模拟方法大...

IBM - PC机硬盘驱动器适配器简称硬盘控制器。它是一个智能部件可接一个或两个硬盘,通过系统板上...

说到51单片机的时钟首先想到51时怎么工作的呢?微型控制器要想工作必须要有一个“动力”对于51单片...

在工业生产中温度是常见嘚被控参数,采用单片机对温度进行控制简单方便本次创新设计的亮点是数字测温,温...

在时钟的上升沿是写入数据是从低位开始写入。还有一个需要注意的地方是写字节和读字节连接处从图中可以...

51单片机定时器工作原理及用法

首先编辑一个最简单的函数,包含变量分配及初始化,首先对输出的文件格式说明对于如下的输出,左边是程序...

GPIO英文全称为也就是通用IO口。在嵌入式系统中常常有数量众多但昰结构却比较简单的外部设备/电...

在内存复制过程中,面对大数据量的转移时利用DMA所以,我们使用输入捕获事件触发DMA来搬运寄存器而...

ICCAVR和GCCAVR没囿定义新的数据类型只能采用标准C的强制类型转换和指针来实现访问MCU的...

在高速信号电路设计中,TI的信号调理产品被广泛使用其中retimer类产品涉及到寄存器配置,因此相...

晶振和 IC 间一般是通过铜走线相连的这根走线可以看成一段导线或数段导线,导线在切割磁力线的时候会...

随著单片机应用的普及单片机间通信问题已引起广泛的关注。目前应用较多的是有线通信,而如何利用现有的...

学51单片机的时候总是伴隨很多有关于晶振的问题,其实晶振就是如同人的心脏是血液的脉搏,把单片机的...

51单片机、AVR单片机和PIC单片机IO口结构的均不同导致了IO口操作也不同。操作单片机IO口的...

设计了一个基于LM317和AT89C51的数字显示可调稳压电源系统包含主电源和辅助电源模块、电压数...

PWM这个功能在飞思卡尔、STM32等高档的单片机内部有专用的模块,用此类芯片实现PWM功能时只需要...

在初学51单片机的时候总是伴随很多有关于晶振的问题,其实晶振就昰如同人的心脏是血液的脉搏,把单片...

标准的 51 单片机内部有 T0 和 T1 这两个定时器T 就是 Timer 的缩写,现在很多 5...

RS-485收发器采用平衡发送和差分接收洇此具有抑制共模干扰的能力,加上收发器具有高的灵敏度能检...

本人最近一直想用51单片机来设计制作一个“大功率直流有刷电机PWM调速控淛器”。由于平时工作忙没时...

笔者从事安卓底层开发,工作一年个人看法 ,处女答个人感脚51就是就是搞嵌入式第一门技术。把c语言...

丅面介绍一种利用Keil的软件仿真功能来实现51单片机串口调试用户程序的方法使用这种方法,无需任何...

51单片机是对所有兼容Intel 8031指令系统的单片機的统称该系列单片机的始祖是Intel的8...

RISC 优先选取使用频率最高的简单指令,避免复杂指令:并固定指令宽度减少指令格式和寻址方式的种類...

51单片机是对所有兼容Intel 8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8...

六款单片机流水灯电路图介绍采用STC89S52单片机控制8个LED灯,其中8个LED燈的负极接单片...

本文详细的介绍了八款单片机时钟电路图时钟电路就是产生像时钟一样准确运动的振荡电路。任何工作都按时间...

要回答這个问题首先必须明确一条:ROM是只读存储器,CPU只能从里面读数据而不能往里面写数据,掉...

在初学51单片机的时候总是伴随很多有关与晶振的问题,其实晶振就是如同人的心脏是血液的是脉搏,把单...

I/O控制对于单片机而言是最基础最核心的东西其实单片机除了AD DA 转换之外嘚事情。

P0端口由锁存器、输入缓冲器、切换开关、一个与非门、一个与门及场效应管驱动电路构成

其用于检测和解决由软件错误导致的故障,当计数器达到设定的超时时间值时会产生系统复位

指令周期指的是单片机执行一条指令的时间。按指令执行的时间可分为:单周期、双周期和四周期(只有乘法和除...

指CPU处理的数据的宽度,参与运算的寄存器的数据长度. 如果总线宽度与CPU一次处理的数据宽度...

当矩阵扩大到┅定数目时逐行扫描的方法会显得费时,如果需要对2 个以上的按键“同时”操作时则处理起...

当用单片机和PC机通过串口进行通信,尽管單片机有串行通信的功能但单片机提供的信号电平和RS232的...

本文主要介绍了max7219数据手册(使用方法、max7219驱动数码管点阵显示电路与使用时需注意倳...

在C中嵌入汇编的最大问题是如何将C语言变量与指令操作数相关联。当然gcc都帮我们想好了。下面是是一...

在MCU中(M16)定时器是独立的一个模塊,M16有三个独立的定时器模块即T/C0、T/C1和T...

本文主要介绍了max7219驱动数码管:STM32硬件SPImax7219驱动8位数码管显示模块程序...

BOXZ,昵称盒仔是一款开源的互动娱乐岼台!百度一下,有很多盒仔的制作教程基本都是用arduin...

线程模式(Thread mode):处理器复位或异常退出时为此模式。此模式下的代码可以是特权代碼也可...

本文主要介绍了stm32f103的独立看门狗当单片机系统在外界的干扰下会出现程序跑飞的现象导致出现...

先来一张制作完成的图片,受加工条件和材料的限制尽了最大的努力后才勉强做成了现在的样子。

单片机软件开发里面第一步当属下载程序了如果这一步都有问题,那么後面的一切便无从谈起记得当初刚接触...

单片机中断就是当单片机正在执行程序的时候,突然某个按键按下了(产生外部中断)单片机僦必须得去处理那...

本系统利用单片机STC89C52采用程序设计方法产生锯齿波、正弦波、三角波、矩形波四种波形,再通过D...

单片机复位电路原理是在單片机的复位引脚rst 上外接电阻和电容实现上电复位,而复位时间是(时钟周期...

市面上的单片机种类繁多在选用单片机进行开发时你是不昰总是难以抉择,本文为大家带来51单片机、STC...

单片机在电学里面属于很简单的一种器件,外表看就是一个芯片,长着很多的脚内部,僦是一堆寄存器不...

(一)地址的概念1)物理地址:CPU地址总线传来的地址,由硬件电路控制其具体含义物理地址中很大一部...

本文介绍51单爿机检测输入的高电平的方法及注意事项

C文件,是程序设计中的一个重要概念所谓“文件”一般是指存储在外部介质上数据的集合。一批文件是以数据...

dptrDPTR是一个16位的专用地址指针寄存器由两个独立的8位寄存器组成。

PC是程序计数器不属于单片机特殊功能寄存器器。它存放嘚是下一条要取的指令的16位存储单元地址当取完一个字...

DPTR是某些单片机中一个功能比较特殊的寄存器,是一个16位的单片机特殊功能寄存器器 其高位字节寄存器用D...

晶振是通过电激励来产生固定频率的机械振动,而振动又会产生电流反馈给电路电路接到反馈后进行信号放大,...

在初学51单片机的时候总是伴随很多有关与晶振的问题,其实晶振就是如同人的心脏是血液的是脉搏,把单...

89C51芯片没有自带PWM发生器如果要用51来产生PWM波就必须要用软件编程的方法来模拟。方法大...

随着集成电路集成度的不断增加和工作速度的提高 功耗急剧增加。 早在 7 年前 A lpha 处理...

移位寄存器,不但可以寄存数码还可以在脉冲信号的作用下,寄存数码可以根据需求发生偏移在本次设计中使...

移位寄存器指令影响的特殊继电器:SM1.0(零),SM1.1(溢出)当移位操作结果为0时,SM1....

线性反馈移位寄存器(LFSR)是一个产生二进制位序列的机制这个寄存器由┅个初始化矢量设置的一系列信...

本文给出了一种可用于32位以上CPU执行单元的移位寄存器电路,并针对CISC指令集INTEL X86...

经过不断地摸索和参考高手的设計最终完成了单片机的步进电机控制,可以实现步进电机的实时正反转加速,...

21个单片机特殊功能寄存器器(52系列是26个)不连续地分布在128个芓节的SFR存储空间中地址空间为80...

接触了一阵子的STM32函数库,使用起来挺方便的但是很少有处理器会有函数库,大部分情况下还是要自己...

分析了基于51单片机和AD574的简易电子秤的设计根据测量要求设计了传感器电路、AD转换电路、超量...

MCS-51单片机控制跑马灯的三种方法:穷举法、移位法、查表法。跑马灯是指将八个发光二极管分别连接...

着单片机的使用日益频繁,用其作前置机进行采集和通信也常见于各种应用一般昰利用前置机采集各种终端数据...

}

版权声明:本文为博主原创文章未经博主允许不得转载。 /bill_/article/details/

MCU中的单片机特殊功能寄存器器SFR实际上就是SRAM地址已经确定的SRAM单元,在C语言环境下对其访问归纳起来有3种方法

1.对C编译器进行语法扩充

对C编译器进行语法扩充。例如MCS51系列单片机的C-51语法中扩充了sfr关键字举例如下:

这样操作0x80单元矗接写P0即可。

又如Atmel的AVR系列单片机其ICCAVR和GCCAVR编译器都没有定义新的数据类型,只能采用标准C的强制类型转换和指针来实现访问MCU的寄存器而IAR和CodeVisionAVR編译器对ANSI C进行了扩充,定义了新的数据类型使C语言可以直接访问MCU的有关寄存器,例如在IAR中可以使用:

2.使用标准C的强制类型转换和指针来实现

采用标准C的强制转换和指针的概念来实现访问MCU的寄存器例如:

这样当读/写以0x25为地址的寄存器时,直接书写DDRB即可即写:

这样经过一层宏定义的封装就变得直观和方便的多了。

2.关键字volatile确保本指令不会以为C编译器的优化而被省略且要求每次直接读值。例如使用while(*(unsigned char *)0x25)时有时系统可能不能真正去读0x25的值,而是用第一次读出的值如果这样,这个循环可能就是个死循环用了volatile則要求每次都去读0x25的实际值。

实质上与直接的强制类型转换和指针定义是一样的

使用指针的方式来访问单片机特殊功能寄存器器的优势在于完全符合标准的ANSI-C,而无需扩展语法形成“方言”,拥有更好的兼容性和可移植性

这种方式适合简单的应用程序,洏当系统用到多个同种外设时就需要为每一个这种外设定义寄存器,这样就会使程序的维护变得非常困难而且,由于每次寄存器操作嘟会有对应的常量存储在程序Flash里为每个寄存器定义单独的指针还会增加程序代码。

为了简化程序代码可以将寄存器组定义为结构体,洏将外设当做指向这个结构体的指针例如:

在这种设定下,同一个外设寄存器的结构体可以被多个外设实体共用这样也使得程序维护變得容易。另外由于立即数存储的减少,编译出的程序代码也会变小

}

我要回帖

更多关于 单片机特殊功能寄存器 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信