基于51单片机交通灯控制器设计内容摘要:

第 三 章 软件系统设计介绍 为了使汇编程序段和 C 程序能够兼容,必须为汇编语言编写的程序段指定段名并进行定义。 如果要在它们之间传递函数,则必须保证汇编程序用来传递函数的存储区和 C 函数使用的存储区是一样的。 被调用的汇编函数不仅要在汇编程序中使用伪指令以使 CODE 选项有效,并声明为可再定位的段类型,而且还要在调用它的 C 语言主程序中进行声明。 函数名的转换规律如表 所示。 段名的转换规律如表 所 示。 表 函数名的转换规律 主函数中的声明 汇编符号名 说明 Void funs(void) FUNC 无参数传递或不含寄存器的函数名不作改变转入目标文件中,名字只是简单地转为大写形式 Void funs(char) _FUNC 带寄存器参数的函数名,前面加“ _”前缀,它表明这类函数包含寄存器内的参数传递 Void funs(void) reentrant _?FUNC 对于重入函数,前面加“ _?”前缀,它表明该函数包含栈内的参数传递 表 段名的转换规律 存储区 命名转换 CODE ?PR?CO XDATA ?XD DDATA ?DT BIT ?BI PDATA ?PD 3. Keil C51 与汇编的接口 (1)模块内接口 有时候,需要使用汇编语言来编写程序,比如对硬件进行操作或在一些对时钟要求很严格的场合,但又不希望用汇编语言来编写全部程序或调用汇编语言编写的函数,那么可以通过预编译指令“ asm”,在 C 代码中插入汇编代码。 方法是用 pragma 语句 ,具体结构是 : pragma asm 汇编行 pragma endasm 这种方法是通过 asm与 endasm告诉 C51 编 译器中问行不用编译为汇编行。 (2)模块间接口 基于 51 单片机交通灯控制器设计 17 C 模块与汇编模块的接口较简单,分别用 C51 与 A51 对源文件进行编译,然后用 L51 连接 obj 文件即可。 (3)SRC 控制 该控制指令将 C 文件编译生成汇编文件 (.SRC),该汇编文件在改名后,生成汇编 .ASM 文件,再用 A51 进行编译。 C51 对标准 C 语言的扩展 C51 语言的特色主要体现在以下几方面 : (1)1 虽然继承了标准 C 语言的绝大部分的特性,而且基本语法相同,但其本身又在特定的硬件结构上有所扩展,如关键字 sbit, data, idata, pdata,xdata,code 等。 (2)应用 C51 更要注重对系统资源的理解,因为单片机的系统资源相对 PC 机来说很贫乏,对于 RAM,ROM 中的每一字节都要充分利用。 可以通过多看编译生成的 .m51 文件来了解自己程序中资源的利用情况。 (3)程序上应用的各种算法要精简,不要对系统构成过重的负担。 尽量少用浮点运算,可以用 unsigned 无符号型数据的就不要用有符号型数据,尽量避免多字节的乘除运算,多使用移位运算等。 1. 数据类型 C51 具有标准 C 语言的所有标准数据类型,除此之外,为了更加有效地利用8051 的 结构,还加入了以下特殊的数据类型。  bit 位变量值为 0或 1。  sbit 从字节中声明的位变量 0或 1。  sfr 特殊功能寄存器, sfr 字节地址为 0~ 255  sfr16 同上,只是 sfr 字地址为 0~ 65535 其余数据类型如 char,enum,short,int,long,float 等与标准语言 C 相同。 完整的数据类型表如表 所示。 表 数据类型 数据类型 位数 字节数 数值范围 bit 1 0~ 1 char 8 1 128~ +127 unsigned char 8 1 0~ 255 18 第 三 章 软件系统设计介绍 enum 16 2 32768~ +32767 short 16 2 32768~ +32767 unsigned short 16 2 0~ 65535 int 16 2 32768~ +32767 unsigned int 16 2 0~ 65535 long 32 4 2147483648~+2147483647 unsigned long 32 4 0~ 4294967295 float 32 4 177。 ~177。 +38 sbit 1 0~ 1 sfr 8 1 0~ 255 sfr 16 16 2 0~ 65535 bit,sbit,sfr 和 sfr16 数据类型专门用于 8051 硬件和 C51 编译器,并不是标准 C语言的一部分,不能通过指针进行访问。 bit,sbit,sfr 和 sfr16 数据类型用于访问 8051的特殊功能寄存器,例如 sfr P0=0x80,表示声明变量 P0,并为其分配特殊功能寄存器地址 0x80。 当结果为不同的数据类型时, C51 编译器自动转换数据类型。 除了数据类型的转换之外,带符号变量的符号扩展也是自动完成的。 2. 存储类型及存储区 C51 编译 器支持 8051 及其扩展系列,并提供对 8051 所有存储区的访问。 存储区可分为内部数据存储区、外部数据存储区以及程序存储区。 8051 CPU 内部的数据存储区是可读写的, 8051 派生系列最多可有 256 字节的内部数据存储区,其中低 128 字节可直接寻址,高 128 字节 (从 0x80 到 0xff)只能间接寻址,从 20H 开始的 16 字节可位寻址。 内部数据区又可以分成 3 个不同的存储类型 :data、 idata 和bdata。 外部数据区也是可读写的,访问外部数据区比访问内部数据区慢,因为外部数据区是通过数据指针加载地址来间接访问的。 C51 编译器提供两种不同的存储类型 xdata 和 pdata 访问外部数据。 程序 CODE 存储区是只读的,不能写。 程序存储区可能在 8051CPU 内或者在外部或者内外都有,这由 8051 派生的硬件决定。 每个变量可以明确地分配到指定的存储空间,对内部数据存储器的访问比对外部数据存储器的访问快许多,因此应当将频繁使用的变量放在内部数据存储器中,而把较少使用的变量放在外部数据存储器中。 各存储区的简单描述如表 所示。 变量的声明中还包括了对存储器类型的指定,即指定变量存放的位置。 基于 51 单片机交通灯控制器设计 19 表 存储区的简单描述 存储区 描述 DATA RAM 的低 128 字节,可在一个周期内直接寻址 BDATA DATA 区可字节、位混合寻址的 16 字节区 IDATA RAM 区的高 128 字节,必须采用间接寻址 XDATA 外部存储区,使用 DPTR 间接寻址 PDATA 外部存储区的 256 字节,通过 P0 口的地址对其寻址。 使用指令 MovX @Rn,需要两个指令周期 CODE 程序存储区使用 DPTR 寻址  DATA 区 DATA 区的寻址是最快的,所以应该把经常使用的变量放在 DATA区。 但是 DATA 区的空间是有限的, DATA 区除了包含程序 变量外,还包含了堆栈和寄存器组。 DATA 区声明中的存储类型标识符为 data,通常指低 128 字节的内部数据区存储的变量,可直接寻址。  BDATA 区 BDATA 区实际就是 DATA 区中的位寻址区,在这个区声明变量就可进行位寻址。 位变量的声明对状态寄存器来说是十分有用的,因为它可能仅仅需要使用某一位,而不是鹅字节。 BDATA 区声明中的存储类型标识符为bdata,指内部可位寻址的 1字节存储区 (20H到 2FH)可位寻址变量的数据类型。 编译器不允许在 BDATA 区中声明 float 和 double 型的变量。 如果想对浮点数的每 一位进行寻址,可以通过包含 float 和 long 的联合体来实现 .  IDATA 区 IDATA 区存放使用比较频繁的变量,使用寄存器作为指针进行寻址,即在寄存器中设置 8 位地址进行间接寻址。 与外部存储器寻址相比它的指令执行周期和代码长度都比较短。 IDATA 区声明中的存储类型标识为 idata,指内部的 256 字节的存储区,但是只能间接寻址,速度比直接寻址慢。  PDATA 和 XDATA 区 PDATA 和 XDATA 区属于外部存储区,外部数据区是可读写的存储区,最多可有 64KB ,当然这些地址不是必须用作存储区的。 访问外部数据 存储区比访问内部数据存储区慢,因为外部数据存储区是通过数据指针加载地址来间接访问的。 程序存储区 CODE 程序存储区的数据是不可改变的,跳转向量和状态表对CODE 段的访问和对 XDATA 区的访问时间是一样的。 编译的时候要对程序存储区中的对象进行初始化,否则就会产生错误,程序存储区 CODE 声明中的标识符为 code,在 C51 编译器中可用 code 存储区类型标识符来访问程序存储区。 20 第 三 章 软件系统设计介绍 3. 存储器模式 存储器模式是函数自变量、自动变量和没有明确规定存储类型的变量的默认存储器类型,指定存储器类型需要在命令行中使用 SMALL,COMPACT 和 LARGE3个控制命令中的 1 个。  SMALL 在该模式中,所有变量都默认地位于 51内部数据存储器,这和使用data 指定存储器类型的方式一样。 在此模式下,变灵访问的效率很高,但所有的数据对象和堆栈必须适合内部 RAM。  COMPACT 当使用 COMPACT 模式时,所有变量都被默认为在外部数据存储器的页内,这和使用 pdata 指定存储器类 型 是一样的。 该存储器类型适用于变量不超过 256 字节的情况,此限制是由寻址方式所决定的。 和 SMALL 模式相比,该存储器模型的效率比较低,对变量访问的速度也慢 一些,但比 LARGE模式快。 地址的高字节通常通过 P2 口设置,编译器没有设置该口。 LARGE 在 LARGE 模式中,所有变量都默认为位于外部数据存储器 (这和使用xdata 指定存储器类型是一样的 ),并使用数据指针 DPTR 进行寻址。 通过数据指针访问外部数据存储器的效率较低,特别是当变量为 2 字节或更多字节时,该模式要比 SMALL 和 COMPACT 产生更多的代码。 4. 特殊功能寄存器 (SFR) 51 单片机提供 128 字节的 SFR 寻址区,地址为 80H~ FFH。 51 单片机中,除了程序计数器 PC 和 4 组通用寄存器组之外,其 他所有的寄存器均为 SFR,并位于片内特殊寄存器区。 这个区域可位寻址、字节寻址或字寻址,用以控制定时器、计数器、串口、 I/O 及其他部件。 特殊功能寄存器可山以下几种关键字说明。 (1) sfr 声明字节寻址的特殊功能寄存器,比如 sfr P0=0x80;表示 P0 口地址为 80H。 注意:“ sfr”后面必须跟一个特殊寄存器名。 “ =”后面的地址必须是常数,不允许带有运算符的表达式,这个常数值的范围必须在特殊功能寄存器地址范围内,位于 0x80H 到 0xFFH 之间。 (2) sfr16 许多新的 8051派生系列单片机用两个连续地址的 SFR来指定 16位值,例如 8052 用地址 0xCC 和 0xCD 表示定时器 /计数器 2的低和高字节,如 sfr 16 T2=0xCC;表示 T2 口地址的低地址 T2L=0xCC,高地址 T2H=0xCD。 sfr16 声明和 sfr 声明遵循相同的原则,任何符号名都可用在 sfr16 的声明中。 声明中名字后面不是赋值语句。 而是一个 SFR 地基于 51 单片机交通灯控制器设计 21 址,其高字节必须位于低字节之后。 这种声明适用于所有新的 SFR,但不能用于定时 /计数器 0和计数器 1。 (3) sbit 声明可位寻址的特殊功能寄存器和别的可位寻址的目标。 “ =”号后将绝对地址赋给变量名, 3 种变量声明 形式如下。 5. C51 指针 (1) 通用指针 C51 提供一个 3字节的通用指针,通用指针的声明和使用均与标准C语言相同,但它同时还可以说明指针的存储类型。 (2) 指定存储区指针 C51 允许使用者规定指针指向的存储段,这种指针叫指定存储区指针。 (3) 指针转换 C51 编译器可以在指定存储区指针和通用指针之间转换,指针转换可以用类型转换的直接程序代码来强迫转换,或在编译器内部强制转换。 当把指定存储区指针作为参数传递给要求使用通用指针的函数时, C51 编译器就把指定存储区指针转换为通用指针。 (4) 绝对 指针 绝对指针类型可访问任何存储区的存储区地址,也可用绝对指针调用定位在绝对或固定地址的函数。 6. 函数 (1) 函数声明 Keil C51 编译器扩展了标准 C 函数声明,这些扩展有: 1)指定一个函数作为一个中断函数。 2)选择所用的寄存器组 : 3)选择存储模式 : 4)指定重入。 5)指定 ALIEN PL。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。