资源描述:
《单片机原理与C51程序设计基础教程6》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、重点内容:程序设计及编程方法KeilC51和A51接口编程基础C与汇编语言混合编程实现模块化程序设计本章小结第6章C与汇编语言混合编程一、程序设计及编程方法无论是高级语言还是汇编语言,源程序都要转换成目标代码(机器语言)单片机才能执行。在Kell中程序的编译过程如图6.1所示。C语言程序经过c51编译器、汇编语言程序经过汇编器编译后可以产生浮动地址目标程序,经过连接定位器生成十六进制的可执行文件。1、单片机程序编制过程一、程序设计及编程方法单片机用c语言编程具有开发周期短、可读性强、可移植性好和修改方便等特点,但是对c语言进行汇编生成的汇编代码往往较长。直接用汇
2、编语言编程虽然编写的程序较短,在直接对机器硬件进行控制方面具有相当的优势,但是开发周期长,修改也不方便。较好的解决办法是程序的框架或主体部分用c语言编写,要求执行效率高的部分用汇编语言编写。这种混合编程的方法将c语言和汇编语言的优点结合起来,成为目前单片机开发最流行的编程方法。2、混合编程的优势二、KeilC51和A51接口编程基础1.A51中的段A51中的代码及数据分为不同的段,各段及功能如表6-1所示。1、宏汇编器A51二、KeilC51和A51接口编程基础A51中保留了些关键字如表6-2所示。1、宏汇编器A51二、KeilC51和A51接口编程基础2.A5
3、1中的伪指令宏汇编器A51有一些伪指令,可以让我们定义符号值,预留和初始化内存,以及控制代码的位置。下面主要介绍在混合编程中会经常碰到的程序连接伪指令和段伪指令。(1)程序连接伪指令程序连接伪指令可以使我们通过允许模块间的引用和和模块的命名来实现各模块之间通信。①PUBLIC伪指令PUBLIC列出将在其它目标模块中使用的符号。伪指令PUBLIC使指定符号在生成的目标模块中可用。这实际上就是把这些符号的名称公用化。伪指令PUBLIC的格式如下:PUBLIC符号PUBLIC指令后可以指定多个符号名,各个名字之间用逗号隔开。例如:PUBLICTimer0_Init//
4、指定一个外部可以使用的函数名。1、宏汇编器A51二、KeilC51和A51接口编程基础②EXTERN/EXTRNEXTERN/EXTRN指令与PUBLIC指令对应,如果要使用其他模块中的符号,则必须用EXTERN/EXTRN指令进行说明。指令格式为:EXTRNclass:type(symbol,symbol...)EXTERNclass:type(symbol,symbol...)class是该符号被定义处的存储空间类型,可以是下列类型之一:BIT,CODE,CONST,DATA,EBIT,ECONST,EDATA,ECODE,HDATA,HCONST,IDAT
5、A,XDATA,或NUMBER(声明一个无类型符号);type是外部符号的符号类型,可以是下列类型之一:BYTE,WORD,DWORD,NEAR,FAR。symbol是一个外部符号名。例如:EXTRNCODE(PUT_CRLF),DATA(BUFFER)EXTERNCODE(BINASC,ASCBIN)EXTRNNUMBER(TABLE_SIZE)EXTERNCODE:FAR(main)EXTRNEDATA:BYTE(VALUE,COUNT)EXTRNNCONST:DWORD(LIMIT)通过以上指令说明后,本程序段中才可以访问外部变量。1、宏汇编器A51二、K
6、eilC51和A51接口编程基础③NAMENAME指令用来标识当前模块。指令格式为:NAME目标模块名目标模块名最多可包含40个字符,此模块名与对应该模块的文件名无关,每个模块只能有一个模块名,如果源程序中没有给出模块名,则以不带扩展名的文件名做为模块名。(2)段伪指令一个段是一个代码或数据存储块,它根据汇编器从x51汇编源文件中的代码或数据创建。我们在源模块中怎样使用段,取决于我们的应用的复杂度。较小的应用需要较少的存储空间,一般比大型多模块应用的复杂度低。下面分别介绍。①RSEG(RelocatableSegment)RSEG为再定位段指令,用于选择一个已经
7、在前面定义的再定位段做为当前段。指令格式为:RSEG段名段名必须是在前面已经声明过了的可再定位段。1、宏汇编器A51二、KeilC51和A51接口编程基础②绝对段伪指令绝对段伪指令为CSEG、DSEG、XSEG、ISEGBSEG,分别选择绝对代码段、内部绝对数据段、外部绝对数据段、内部间接寻址绝对数据段和绝对位寻址数据段。指令格式如下:CSEG[AT绝对地址表达式]DSEG[AT绝对地址表达式]XSEG[AT绝对地址表达式]ISEG[AT绝对地址表达式]BSEG[AT绝对地址表达式]括号内为可选项,用来指定当前绝对段的基址。例如我们写串口中断程序,起始地址是0x
8、23.就这样写CSEGA