第3章 C51语言编程基础_第1页
第3章 C51语言编程基础_第2页
第3章 C51语言编程基础_第3页
第3章 C51语言编程基础_第4页
第3章 C51语言编程基础_第5页
已阅读5页,还剩131页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第3章 C51语言编程基础 1内容概要内容概要目前单片机应用设计与开发,多使用目前单片机应用设计与开发,多使用C51C51语言来编程。语言来编程。C51C51语言是在标准语言是在标准C C的基础上,根据单片机存储器硬件结构及的基础上,根据单片机存储器硬件结构及内部资源,扩展相应的数据类型和变量,而在语法规定、内部资源,扩展相应的数据类型和变量,而在语法规定、程序结构与设计方法上,都与标准程序结构与设计方法上,都与标准C C相同。相同。本章介绍本章介绍C51C51语言的基础知识、对语言的基础知识、对C51C51集成开发环境集成开发环境KeilKeil Vision3Vision3以及单片机虚拟仿

2、真平台以及单片机虚拟仿真平台ProteusProteus也作以介绍。也作以介绍。 2在单片机应用开发中,软件编程占有非常重要的地位。要求在单片机应用开发中,软件编程占有非常重要的地位。要求编程人员在短时间内编写出执行效率高、运行可靠的程序编程人员在短时间内编写出执行效率高、运行可靠的程序代码。同时,由于实际系统的日趋复杂,对程序的可读性代码。同时,由于实际系统的日趋复杂,对程序的可读性、升级与维护以及模块化的要求越来越高,以方便多个工、升级与维护以及模块化的要求越来越高,以方便多个工程师协同开发。程师协同开发。C51C51语言是近年来在国内外的语言是近年来在国内外的5151单片机开发中,普遍使

3、用的单片机开发中,普遍使用的一种程序设计语言。一种程序设计语言。C51C51能直接对单片机硬件进行操作,能直接对单片机硬件进行操作,既有高级语言的特点,又有汇编语言的特点,因此在单片既有高级语言的特点,又有汇编语言的特点,因此在单片机应用的程序设计中,得到非常广泛的使用。机应用的程序设计中,得到非常广泛的使用。 3.1 3.1 编程语言编程语言KeilKeil C51 C51简介简介 KeilKeil C51( C51(简称简称C51)C51),是在标准,是在标准C C语言的基础上发展的。语言的基础上发展的。3.1.1 3.1.1 KeilKeil C51 C51简介简介KeilKeil C5

4、1 C51语言是在标准语言是在标准C C的基础上针对的基础上针对5151单片机的硬件特点单片机的硬件特点进行的扩展,并向进行的扩展,并向5151单片机上移植,经多年努力,单片机上移植,经多年努力,C51C51语语言已成为公认的高效、简洁的言已成为公认的高效、简洁的5151单片机的实用高级编程语单片机的实用高级编程语言。言。 与汇编语言相比,用与汇编语言相比,用C51C51语言进行软件开发,有如下优点:语言进行软件开发,有如下优点:(1 1)可读性好)可读性好。C51C51语言程序比汇编语言程序的可读性好,语言程序比汇编语言程序的可读性好,因而编程效率高,程序便于修改、维护以及程序升级。因而编程

5、效率高,程序便于修改、维护以及程序升级。 4(2 2)模块化开发与资源共享。)模块化开发与资源共享。C51C51开发的模块可直接被其他开发的模块可直接被其他项目所用,能很好地利用已有的标准项目所用,能很好地利用已有的标准C C程序资源与丰富的库程序资源与丰富的库函数,减少重复劳动,也有利于多个工程师的协同开发。函数,减少重复劳动,也有利于多个工程师的协同开发。(3 3)可移植性好。)可移植性好。为某型单片机开发的为某型单片机开发的C51C51程序,只需将与程序,只需将与硬件相关之处和编译链接的参数进行适当修改,就可方便硬件相关之处和编译链接的参数进行适当修改,就可方便地移植到其它型号的单片机上

6、。例如,为地移植到其它型号的单片机上。例如,为5151单片机编写的单片机编写的程序通过改写头文件以及少量的程序行,就可以方便地移程序通过改写头文件以及少量的程序行,就可以方便地移植到植到PICPIC单片机上。单片机上。(4 4)生成的代码效率高。)生成的代码效率高。代码效率比直接使用汇编语言代码效率比直接使用汇编语言低低20%20%左右左右,如使用,如使用优化编译选项优化编译选项,最高,最高可达可达90%90%左右,效果左右,效果会更好。会更好。53.1.2 C513.1.2 C51与标准与标准C C的比较的比较C51C51标准标准C C语言有许多相同的地方,但也有自身特点。不同的嵌语言有许多

7、相同的地方,但也有自身特点。不同的嵌入式入式C C语言编译系统与标准语言编译系统与标准C C语言的不同,主要是由于它们所语言的不同,主要是由于它们所针对的硬件系统不同。对于针对的硬件系统不同。对于5151单片机,目前广泛使用的是单片机,目前广泛使用的是KeilKeil C51 C51语言,简称语言,简称C51C51语言。语言。C51C51的基本语法与标准的基本语法与标准C C相同,相同,C51C51在标准在标准C C的基础上进行了适合的基础上进行了适合于于5151系列单片机硬件的扩展。深入理解系列单片机硬件的扩展。深入理解KeilKeil C51 C51对标准对标准C C的的扩展部分以及不同之

8、处,是掌握扩展部分以及不同之处,是掌握C51C51语言的关键之一。语言的关键之一。C51C51与标准与标准C C的的主要区别如下主要区别如下:6(1 1)库函数的不同。)库函数的不同。标准标准C C中的部分库函数不适合于嵌入式中的部分库函数不适合于嵌入式控制器系统,被排除在控制器系统,被排除在KeilKeil C51 C51之外,如之外,如字符屏幕字符屏幕和和图形图形函数函数。有些库函数可继续使用,但这些库函数都必须针对。有些库函数可继续使用,但这些库函数都必须针对5151单片机的硬件特点做出相应的开发。单片机的硬件特点做出相应的开发。例如库函数例如库函数printfprintf和和scanf

9、scanf,在标准在标准C C中,这两个函数通常用于屏幕打印和接中,这两个函数通常用于屏幕打印和接收字符,而在收字符,而在KeilKeil C51 C51中,主要用于串行口数据的收发。中,主要用于串行口数据的收发。(2 2)数据类型有一定的区别。)数据类型有一定的区别。在在C51C51中增加了几种针对中增加了几种针对5151单单片机特有的数据类型,在标准片机特有的数据类型,在标准C C的基础上的基础上又扩展了又扩展了4 4种类型种类型。例如,。例如,5151单片机包含位操作空间和丰富的位操作指令,单片机包含位操作空间和丰富的位操作指令,因此,因此,C51C51语言与标准语言与标准C C相比就要

10、增加位类型。相比就要增加位类型。7(3 3)C51C51的变量存储模式与标准的变量存储模式与标准C C中的变量存储模式数据不中的变量存储模式数据不一样。一样。标准标准C C是为通用计算机设计的,计算机中只有一个是为通用计算机设计的,计算机中只有一个程序和数据统一寻址的内存空间,而程序和数据统一寻址的内存空间,而C51C51中变量的存储模中变量的存储模式与式与5151单片机的存储器紧密相关。单片机的存储器紧密相关。(4 4)数据存储类型的不同)数据存储类型的不同。5151单片机存储区可分为内部数单片机存储区可分为内部数据存储区、外部数据存储区以及程序存储区。据存储区、外部数据存储区以及程序存储区

11、。内部数据存内部数据存储区可分为储区可分为3 3个不同的个不同的C51C51存储类型:存储类型:datadata、idataidata和和bdatabdata。外部数据存储区分为外部数据存储区分为2 2个不同的个不同的C51C51存储类型:存储类型:xdataxdata和和pdatapdata。程序存储区只能读不能写,在。程序存储区只能读不能写,在5151单片机内部或外单片机内部或外部。部。C51C51提供了提供了codecode存储类型来访问程序存储区。存储类型来访问程序存储区。 8(5 5)标准)标准C C语言没有处理单片机中断的定义。语言没有处理单片机中断的定义。C51C51中有专门的中

12、有专门的中断函数。中断函数。(6 6)C51C51语言与标准语言与标准C C语言的输入语言的输入/ /输出处理不一样。输出处理不一样。C51C51语言语言中的输入中的输入/ /输出是通过输出是通过5151单片机的串行口来完成的,输入单片机的串行口来完成的,输入/ /输输出指令执行前必须对串行口进行初始化。出指令执行前必须对串行口进行初始化。(7 7)头文件的不同。)头文件的不同。C51C51语言与标准语言与标准C C头文件的差异是头文件的差异是C51C51头文头文件必须把件必须把5151单片机内部的外设硬件资源如定时器、中断、单片机内部的外设硬件资源如定时器、中断、I/OI/O等所相应的功能寄

13、存器的写入头文件内。等所相应的功能寄存器的写入头文件内。(8 8)程序结构的差异。)程序结构的差异。由于由于5151单片机硬件资源有限,它的编单片机硬件资源有限,它的编译系统不允许太多的程序嵌套。其次,标准译系统不允许太多的程序嵌套。其次,标准C C所具备的递归所具备的递归特性不被特性不被C51C51语言支持。语言支持。 9但是从数据运算操作、程序控制语句以及函数的使用上来说,但是从数据运算操作、程序控制语句以及函数的使用上来说,KeilKeil C51 C51与与标准标准C C几乎没有什么明显的差别几乎没有什么明显的差别。如果程序设计者具备了有关标准如果程序设计者具备了有关标准C C的编程基

14、础,只要注意的编程基础,只要注意KeilKeil C51C51与标准与标准C C的不同之处,并熟悉的不同之处,并熟悉5151单片机的硬件结构,就能单片机的硬件结构,就能够较快地掌握够较快地掌握C51C51的编程。的编程。 3.2 3.2 KeilKeil C51 C51的开发工具的开发工具KeilKeil C51 C51是德国是德国KeilKeil software software公司开发的用于公司开发的用于5151单片机的单片机的C51C51语言开发软件,在兼容标准语言开发软件,在兼容标准C C的基础上,又增加了很多与的基础上,又增加了很多与5151单片机硬件相关的编译特性,使得在单片机硬

15、件相关的编译特性,使得在5151系列单片机上开发应系列单片机上开发应用程序更为方便和快捷,生成的程序代码运行速度快,所需用程序更为方便和快捷,生成的程序代码运行速度快,所需的存储器空间小,完全可以和汇编语言相媲美。的存储器空间小,完全可以和汇编语言相媲美。10它支持众多的它支持众多的80518051架构的芯片,同时集编辑、编译、仿真等架构的芯片,同时集编辑、编译、仿真等功能于一体,具有强大的软件调试功能,是众多的单片机应功能于一体,具有强大的软件调试功能,是众多的单片机应用开发软件中的最优秀软件之一。用开发软件中的最优秀软件之一。3.2.1 3.2.1 集成开发环境集成开发环境Keil Kei

16、l Vision3Vision3简介简介 KeilKeil C51 C51已集成到一个功能强大的已集成到一个功能强大的集成开发环境集成开发环境(IDEIDEIntergratedIntergrated Development Development EviromentEviroment)Vision3Vision3中,用于中,用于5151单片机的单片机的WindowsWindows下的集成开发环境,提供对下的集成开发环境,提供对80518051内核的内核的各种型号的支持,为各种型号的支持,为5151单片机软件开发提供全新的单片机软件开发提供全新的C C语言开语言开发环境。该开发环境下集成了文件

17、编辑处理、编译链接、项发环境。该开发环境下集成了文件编辑处理、编译链接、项目(目(ProjectProject)管理、窗口、工具引用和仿真软件模拟器以)管理、窗口、工具引用和仿真软件模拟器以及及Monitor51Monitor51硬件目标调试器等多种功能硬件目标调试器等多种功能,所有功能均所有功能均11可在可在KeilKeil Vision3Vision3的开发环境中极为简便地进行操作。的开发环境中极为简便地进行操作。KeilKeil Vision3Vision3完全兼容先前的完全兼容先前的KeilKeil Vision2Vision2版本。版本。KeilKeil公公司目前已经推出了司目前已经

18、推出了v7.0v7.0以上版本的以上版本的C51C51编译器,较新的版编译器,较新的版本为本为KeilKeil C51 v8.08a C51 v8.08a。经常用到经常用到KeilKeil C51 C51和和KeilKeil Vision3Vision3两个术语。两个术语。KeilKeil C51 C51一一般简写为般简写为C51C51,指的是,指的是5151单片机编程所用的单片机编程所用的C51C51语言;而语言;而KeilKeil Vision3Vision3,可简写为,可简写为Vision3Vision3,指的是用于,指的是用于5151单片单片机的机的C51C51程序编写、调试的集成开发

19、环境。程序编写、调试的集成开发环境。Vision3Vision3内部集成了源程序编辑器,并允许用户在编辑源文内部集成了源程序编辑器,并允许用户在编辑源文件时就可设置程序调试断点,便于在程序调试过程中快速件时就可设置程序调试断点,便于在程序调试过程中快速检查和修改程序。此外,检查和修改程序。此外,Vision3Vision3还支持还支持软件模拟仿真软件模拟仿真(SimulatorSimulator)和)和用户目标板调试用户目标板调试(Monitor51)(Monitor51)两种工作方式。两种工作方式。在软件模拟仿真方式下不需要任何在软件模拟仿真方式下不需要任何5151单片机及其外围硬件即单片机

20、及其外围硬件即可完成用户程序仿真调试。在用户目标板调试方式下,利用可完成用户程序仿真调试。在用户目标板调试方式下,利用硬件目标板中的监控程序可以直接调试目标硬件系统,使用硬件目标板中的监控程序可以直接调试目标硬件系统,使用户节省购买硬件仿真器的费用。户节省购买硬件仿真器的费用。C51C51程序的程序开发是在程序的程序开发是在Keil Keil Vision3 Vision3 开发环境下进行的。开发环境下进行的。开发者可购买开发者可购买Keil Keil Vision3Vision3软件软件,也可到也可到Keil softwareKeil software公公司的主页免费下载司的主页免费下载Ev

21、alEval(评估评估)版本。该版本同正式版本一版本。该版本同正式版本一样,但有一定的限制,最终生成的代码不能超过样,但有一定的限制,最终生成的代码不能超过2KB2KB,但用,但用13于学于学习已足够。开发者还习已足够。开发者还可到可到KeilKeil公司网站申请免费的软件公司网站申请免费的软件试试用光盘。用光盘。KeilKeil Vision3Vision3内集成了功能强大内集成了功能强大源程序编辑器源程序编辑器和和调试器调试器。编。编辑器允许用户在编辑源文件时就可设置程序调试断点,便于辑器允许用户在编辑源文件时就可设置程序调试断点,便于在程序调试过程中快速检查和修改程序,可像一般文本编辑在

22、程序调试过程中快速检查和修改程序,可像一般文本编辑器一样对源代码进行编辑。器一样对源代码进行编辑。用户启动用户启动Vision3Vision3调试器之后,断点即被激活。断点可被设置调试器之后,断点即被激活。断点可被设置为条件表达式、变量或存储器访问,断点被触发后,调试器为条件表达式、变量或存储器访问,断点被触发后,调试器的命令或调试功能即可执行,因此可在编辑器内调试程序,的命令或调试功能即可执行,因此可在编辑器内调试程序,快速地检查和修改程序。还可在编辑器中选中变量和存储器快速地检查和修改程序。还可在编辑器中选中变量和存储器来观察其值。并可以在双层窗口中显示,还可对其进行适当来观察其值。并可以

23、在双层窗口中显示,还可对其进行适当14的调整。此外,的调整。此外,Vision3Vision3调试器具有符号调试特性以及历史调试器具有符号调试特性以及历史跟踪,代码覆盖,复杂断点等功能。跟踪,代码覆盖,复杂断点等功能。KeilKeil VisionVision环境下还有环境下还有串口调试器软件串口调试器软件comdebug.execomdebug.exe,用,用于在电脑端能够看到单片机发出的数据,串口调试器软件于在电脑端能够看到单片机发出的数据,串口调试器软件无需安装,可直接运行这个软件。若读者需要最新版,可无需安装,可直接运行这个软件。若读者需要最新版,可到有关搜索网站输入关键词到有关搜索网

24、站输入关键词“串口调试器串口调试器”,找到一个合,找到一个合适的下载网站,可即下载适的下载网站,可即下载“串口调试器串口调试器”的最新版本。当的最新版本。当然,使用然,使用WindowsWindows自带的自带的“超级终端超级终端”也是不错的选择。也是不错的选择。153.2.2 3.2.2 KeilKeil Vision3Vision3软件的安装、启动和运行软件的安装、启动和运行1. 1. 软件安装软件安装集成开发环境安装,同大多数软件安装一样,根据提示进行。集成开发环境安装,同大多数软件安装一样,根据提示进行。安装完毕后,可在桌面上看到安装完毕后,可在桌面上看到KeilKeil Vision

25、3Vision3的的快捷图标快捷图标。2. 2. 软件启动软件启动点击桌面上的点击桌面上的KeilKeil Vision3Vision3软件的快捷图标,即可启动该软软件的快捷图标,即可启动该软件,几秒种后,出现编辑界面。件,几秒种后,出现编辑界面。3. 3. 软件的运行软件的运行KeilKeil Vision3Vision3把用户的每一个应用程序设计都当作一个项目把用户的每一个应用程序设计都当作一个项目,16用用项目管理项目管理方法可把一个应用程序设计中所用到的、互相关联方法可把一个应用程序设计中所用到的、互相关联的程序链接在同一项目中。的程序链接在同一项目中。打开一个项目时,所需要的关联程序

26、也都进入了调试窗口,方打开一个项目时,所需要的关联程序也都进入了调试窗口,方便用户对项目中各程序的编写、调试和存储。用户也可能开便用户对项目中各程序的编写、调试和存储。用户也可能开发了多个项目,每个项目用到了相同或不同的程序文件和库发了多个项目,每个项目用到了相同或不同的程序文件和库文件,采用项目管理,就很容易区分不同项目中所用到的程文件,采用项目管理,就很容易区分不同项目中所用到的程序文件和库文件,非常容易管理。因此,在编写一个新的应序文件和库文件,非常容易管理。因此,在编写一个新的应用程序前,一定先要建立项目。下面首先介绍如何建立一个用程序前,一定先要建立项目。下面首先介绍如何建立一个新的

27、项目。新的项目。在在编辑界面下编辑界面下,首先要建立一个点击,首先要建立一个点击“Project”Project”菜单,选择菜单,选择下拉式菜单中的下拉式菜单中的“New Project”New Project”,弹出文件对话窗口,选,弹出文件对话窗口,选择要择要17保存的路径,在保存的路径,在“文件名文件名”中输入一个程序项目名称,保存后中输入一个程序项目名称,保存后的文件扩展名为的文件扩展名为“.uv2”.uv2”,这是,这是KeilKeil Vision3Vision3项目文件的项目文件的扩展名,以后可直接点击此文件就可打开先前做的项目。扩展名,以后可直接点击此文件就可打开先前做的项目。

28、点击点击“保存保存”后,这是会弹出一个对话框,要求选择单片机的后,这是会弹出一个对话框,要求选择单片机的型号,用户可根据所使用的单片机来选择。型号,用户可根据所使用的单片机来选择。KeilKeil Vision3Vision3支持几乎所有的支持几乎所有的5151内核单片机。内核单片机。 然后编写第一个程序。点击然后编写第一个程序。点击“File”File”菜单,单击菜单,单击“New”New” 。这。这时,用户可输入代码。输入完毕,单击菜单上的时,用户可输入代码。输入完毕,单击菜单上的“File”File”,在下拉菜单中单击在下拉菜单中单击“Save As”Save As”,在,在“文件名文件

29、名”栏的编辑框栏的编辑框中,键入文件名,中,键入文件名,同时,必须键入正确的扩展名同时,必须键入正确的扩展名(.C.C或或.ASM).ASM),然后,单击,然后,单击“保存保存”按钮。按钮。18上述工作完成后,还有有关项目的设置,程序的编译,链接上述工作完成后,还有有关项目的设置,程序的编译,链接,调试。这些内容,可按照,调试。这些内容,可按照KeilKeil Vision3Vision3开发环境的帮开发环境的帮助功能。助功能。3.3 C513.3 C51语言程序设计基础语言程序设计基础在标准在标准C C的基础上了解掌握的基础上了解掌握C51C51的数据类型和存储类型、基本的数据类型和存储类型

30、、基本运算与流程控制语句、运算与流程控制语句、C51C51语言构造数据类型、语言构造数据类型、C51C51函数以函数以及及C51C51程序设计的其它问题,为程序设计的其它问题,为C51C51程序设计打下基础。程序设计打下基础。3.3.1 C513.3.1 C51语言中的数据类型与存储类型语言中的数据类型与存储类型1. 1. 数据类型数据类型数据是单片机操作的对象,是具有一定格式的数字或数值,数据是单片机操作的对象,是具有一定格式的数字或数值,19数据的不同格式就称为数据的不同格式就称为数据类型数据类型。 KeilKeil C51 C51支持的基本数据支持的基本数据类型如表类型如表3-13-1所

31、示。针对所示。针对AT89S51AT89S51单片机的硬件特点,单片机的硬件特点,C51C51在在标准标准C C的基础上,扩展了的基础上,扩展了4 4种数据类型(表种数据类型(表3-13-1中最后中最后4 4行)。行)。注意:注意:扩展的扩展的4 4种数据类型,不能使用指针对它们存取。种数据类型,不能使用指针对它们存取。 202. C512. C51的扩展数据类型的扩展数据类型对扩展的对扩展的4 4种数据类型说明。种数据类型说明。(1 1)位变量)位变量bitbitbitbit的值可以是的值可以是1 1(truetrue), , 也可以是也可以是0 0(falsefalse)。)。(2 2)特

32、殊功能寄存器)特殊功能寄存器sfrsfr特殊功能寄存器分布在片内数据存储区的地址单元特殊功能寄存器分布在片内数据存储区的地址单元80H80H FFHFFH之间,之间,“sfrsfr” ” 数据类型占用一个内存单元。利用它可以数据类型占用一个内存单元。利用它可以访问访问AT89S51AT89S51单片机内部的所有特殊功能寄存器。例如:单片机内部的所有特殊功能寄存器。例如:sfrsfr P1=0 x90 P1=0 x90这一语句定义了这一语句定义了P1P1端口在片内的寄存器,在端口在片内的寄存器,在程序后续的语句中可以用程序后续的语句中可以用“P1=0 xff”P1=0 xff”使使P1P1的所有

33、引脚输的所有引脚输出为高电平之类的语句来操作特殊功能寄存器。出为高电平之类的语句来操作特殊功能寄存器。22(3 3)特殊功能寄存器)特殊功能寄存器sfr16sfr16“sfr16”“sfr16”数据类型占两个内存单元。它用于操作占两个字节的数据类型占两个内存单元。它用于操作占两个字节的特殊功能寄存器。特殊功能寄存器。例如:例如: “ “sfr16 DPTR=0 x82sfr16 DPTR=0 x82”语句定义了片内语句定义了片内1616位数据指针寄存位数据指针寄存器器DPTRDPTR,其低,其低8 8位字节地址为位字节地址为82H82H,高,高8 8位字节地址为位字节地址为83H83H。(4

34、4)特殊功能位)特殊功能位 sbitsbitsbitsbit片内特殊功能寄存器的可寻址位。例如:片内特殊功能寄存器的可寻址位。例如: sfrsfr PSW=0 xd0 PSW=0 xd0;/ /* *定义定义PSWPSW寄存器地址为寄存器地址为0 xd00 xd0* */ /sbitsbit PSW2 = 0 xd2 PSW2 = 0 xd2;/ /* *定义定义OVOV位为位为PSW.2PSW.2* */ /符号符号“”前是特殊功能寄存器的名字,前是特殊功能寄存器的名字,“”的后面数字是特殊的后面数字是特殊功能寄存器可寻址位在寄存器中的位置,取值必须是功能寄存器可寻址位在寄存器中的位置,取值

35、必须是0 07 7。23注意,不要把注意,不要把bitbit与与sbitsbit混淆。混淆。bitbit是定义普通的位变量,值只是定义普通的位变量,值只能是二进制的能是二进制的0 0或或1 1。而。而sbitsbit定义的是特殊功能寄存器的可寻定义的是特殊功能寄存器的可寻址位,它的值是可进行位寻址的特殊功能寄存器的某位的绝址位,它的值是可进行位寻址的特殊功能寄存器的某位的绝对地址,例如,对地址,例如,PSWPSW寄存器寄存器OVOV位的绝对地址位的绝对地址0 xd20 xd2。 3. 3. 数据存储类型数据存储类型在讨论在讨论C51C51的数据类型时,必须同时提及它的存储类型,以及的数据类型时

36、,必须同时提及它的存储类型,以及它与它与5151单片机存储器结构的关系,因为单片机存储器结构的关系,因为C51C51定义的任何数据定义的任何数据类型必须以一定的方式定位在类型必须以一定的方式定位在5151单片机的某一存储区中,否单片机的某一存储区中,否则没有任何实际意义。则没有任何实际意义。5151单片机有片内、外数据存储区,还有程序存储区。单片机有片内、外数据存储区,还有程序存储区。5151单片机单片机片内的数据存储区是可读写的,片内的数据存储区是可读写的,5151单片机的衍生系列最多可单片机的衍生系列最多可24有有256256个字节的内部数据存储区,其中低个字节的内部数据存储区,其中低12

37、8128字节可直接寻址,高字节可直接寻址,高128128字节(字节(80H80HFFHFFH)只能间接寻址,从)只能间接寻址,从20H20H开始的开始的1616字节可字节可位寻址。内部数据存储区可分为位寻址。内部数据存储区可分为3 3个不同的数据存储类型:个不同的数据存储类型:datadata、idataidata和和bdatabdata。访问片外数据存储区比访问片内数据存储区慢,因为片外数据存访问片外数据存储区比访问片内数据存储区慢,因为片外数据存储区是通过数据指针加载地址来间接寻址访问的。储区是通过数据指针加载地址来间接寻址访问的。C51C51提供两提供两种不同数据存储类型种不同数据存储类

38、型xdataxdata和和pdatapdata来访问片外数据存储区。来访问片外数据存储区。程序存储区只能读不能写,可能在程序存储区只能读不能写,可能在5151单片机内部或者外部,或者单片机内部或者外部,或者外部和内部都有,由外部和内部都有,由5151单片机的硬件决定,单片机的硬件决定,C51C51提供了提供了codecode存存储类型来访问程序存储区。储类型来访问程序存储区。25C51C51存储类型与存储类型与AT89S51AT89S51单片机实际的存储空间的对应关系如单片机实际的存储空间的对应关系如表表3-23-2所示。所示。26下面对下面对表表3-23-2中的各种存储区作以说明。中的各种存

39、储区作以说明。(1 1)DATADATA区。区。寻址是最快的,应该把经常使用的变量放在寻址是最快的,应该把经常使用的变量放在DATADATA区,但是区,但是DATADATA区的存储空间是有限的,区的存储空间是有限的,DATADATA区除了包区除了包含程序变量外,还包含了堆栈和寄存器组。含程序变量外,还包含了堆栈和寄存器组。DATADATA区声明中区声明中的存储类型标识符为的存储类型标识符为datadata,通常指片内,通常指片内RAMRAM的的128128字节的内字节的内部数据存储的变量,可直接寻址。部数据存储的变量,可直接寻址。声明举例如下:声明举例如下:unsigned char data

40、 system_status=0;unsigned int data unit_id8;char data inp_string20; 标准变量和用户自声明变量都可存储在标准变量和用户自声明变量都可存储在DATA区中,只要不超过区中,只要不超过DATA区的范围即可。由于区的范围即可。由于C51使用默认的寄存器组来传递参使用默认的寄存器组来传递参数,这样数,这样DATA区至少失去了区至少失去了8字节的空间。另外,当内部堆字节的空间。另外,当内部堆栈溢出的时候,程序会莫名其妙地复位。这是因为栈溢出的时候,程序会莫名其妙地复位。这是因为51单片机单片机没有报错的机制,堆栈的溢出只能以这种方式表示,因

41、此要没有报错的机制,堆栈的溢出只能以这种方式表示,因此要留有较大的堆栈空间来防止堆栈溢出。留有较大的堆栈空间来防止堆栈溢出。(2 2)BDATABDATA区。区。是是DATADATA中的位寻址区,在这个区中声明变量就可中的位寻址区,在这个区中声明变量就可进行位寻址。进行位寻址。BDATABDATA区声明中的存储类型标识符为区声明中的存储类型标识符为bdatabdata,指指的是内部的是内部RAMRAM可位寻址的可位寻址的1616字节存储区(字节地址为字节存储区(字节地址为20H20H2FH2FH)中的)中的128128个位个位。下面是在下面是在BDATABDATA区中声明的位变量和使用位变量的

42、例子:区中声明的位变量和使用位变量的例子: 28unsigned char bdata status_byte;unsigned int bdata status_word;sbit stat_flag= status_byte4;if(status_word15) stat_flag=1;C51C51编译器不允许在编译器不允许在BDATABDATA区中声明区中声明floatfloat和和doubledouble型变量。型变量。(3 3)IDATAIDATA区。区。IDATAIDATA区使用寄存器作为指针来进行间接寻区使用寄存器作为指针来进行间接寻址,常用来存放使用比较频繁的变量。与外部存储器

43、寻址址,常用来存放使用比较频繁的变量。与外部存储器寻址相比,它的指令执行周期和代码长度相对较短。相比,它的指令执行周期和代码长度相对较短。IDATAIDATA区区声明中的存储类型标识符为声明中的存储类型标识符为idataidata,指的是片内,指的是片内RAMRAM的的256256字节的存储区,只能间接寻址,速度比直接寻址慢。字节的存储区,只能间接寻址,速度比直接寻址慢。声明举例如下:声明举例如下: 29unsigned char idata system_status=0;unsigned int idata unit_id8;char idata inp_string16;float id

44、ata out_value; (4 4)PDATAPDATA区和区和XDATAXDATA区。区。PDATAPDATA区和区和XDATAXDATA区位于片外存储区位于片外存储区,区,PDATAPDATA区和区和XDATAXDATA区声明中的存储类型标识符分别为区声明中的存储类型标识符分别为pdatapdata和和xdataxdata。PDATAPDATA区只有区只有256256字节,仅指定字节,仅指定256256字节的外部数据存储区。字节的外部数据存储区。但但XDATAXDATA区最多可达区最多可达64KB64KB,对应的,对应的xdataxdata存储类型标识符可存储类型标识符可以指定外部数据

45、区以指定外部数据区64KB64KB内的任何地址。内的任何地址。对对PDATAPDATA区的寻址要比对区的寻址要比对XDATAXDATA区寻址快,因为对区寻址快,因为对PDATAPDATA区区寻址,只需要装入寻址,只需要装入8 8位地址,而对位地址,而对XDATAXDATA区寻址要装入区寻址要装入1616位地位地址,所以要尽量把外部数据存储在址,所以要尽量把外部数据存储在PDATAPDATA区中。区中。对对PDATA区和区和XDATA区的声明举例如下:区的声明举例如下:unsigned char xdata system_status=0;unsigned int pdata unit_id8;

46、char xdata inp_string16;float pdata out_value;由于外部数据存储器与外部由于外部数据存储器与外部I/OI/O口是统一编址的,外部数据口是统一编址的,外部数据存储器地址段中除了包含存储器地址外,还包含外部存储器地址段中除了包含存储器地址外,还包含外部I/OI/O口的地址。对外部数据存储器及外部口的地址。对外部数据存储器及外部I/OI/O口的寻址将在后口的寻址将在后面的绝对地址寻址中详细介绍。面的绝对地址寻址中详细介绍。 31(5 5)程序存储区)程序存储区CODECODE。程序存储区。程序存储区CODECODE声明的标识符为声明的标识符为codecod

47、e,储存的数据是不可改变的。在,储存的数据是不可改变的。在C51C51编译器中可以用编译器中可以用存储区类型标识符存储区类型标识符codecode来访问程序存储区。来访问程序存储区。声明举例如下:声明举例如下:unsigned char code a =0 x00,0 x01,0 x02,0 x03,0 x04,0 x05,0 x06,0 x07,0 x08;以上介绍了以上介绍了C51C51的数据存储类型,的数据存储类型,C51C51的数据存储类型及其大的数据存储类型及其大小和值域如小和值域如表表3-33-3所示。所示。 3233单片机访问片内单片机访问片内RAM比访问片外比访问片外RAM相对

48、快一些,所以应相对快一些,所以应当尽量把频繁使用的变量置于片内当尽量把频繁使用的变量置于片内RAM。即采用。即采用data、bdata或或idata存储类型,而将容量较大的或使用不太频繁存储类型,而将容量较大的或使用不太频繁的那些变量置于片外的那些变量置于片外RAM,即采用,即采用pdata或或xdata存储类存储类型。常量只能采用型。常量只能采用code存储类型。存储类型。变量存储类型定义举例:变量存储类型定义举例:(1)char data a1;/*字符变量字符变量a1被定义为被定义为data型,型,分配在片内分配在片内RAM低低128字节中字节中*/(2)float idata x,y;

49、/*浮点型变量浮点型变量x和和y被定义为被定义为idata型,定位在片内型,定位在片内RAM中,只能用间接寻址方式寻址中,只能用间接寻址方式寻址*/34(3 3)bit bit bdatabdata p; p;/ /* *位变量位变量p p被定义为被定义为bdatabdata型,定位型,定位在片内在片内RAMRAM中的位寻址区中的位寻址区* */ /(4 4)unsigned unsigned intint pdatapdata var1; var1; / /* *无符号整型变量无符号整型变量var1var1被定被定义为义为pdatapdata型,定位在片外型,定位在片外RAMRAM中,相当于

50、使用中,相当于使用 RiRi间接寻址间接寻址* */ /(5 5)unsigned char unsigned char xdataxdata a2 4; a2 4;/ /* *无符号字符型二维无符号字符型二维数组变量数组变量a24a24被定义为被定义为xdataxdata存储类型,定位在片外存储类型,定位在片外RAMRAM中,占据中,占据2 2 4=84=8个字节,相当于使用个字节,相当于使用DPTRDPTR间接寻址间接寻址* */ / 354数据存储模式数据存储模式如在变量定义时略去存储类型标识符,编译器会自动默认存储类如在变量定义时略去存储类型标识符,编译器会自动默认存储类型。默认的存储

51、类型进一步由型。默认的存储类型进一步由SMALL、COMPACT和和LARGE存储模式指令限制。例如,若声明存储模式指令限制。例如,若声明char var1,则在使用,则在使用SMALL存储模式下,存储模式下,var1被定位在被定位在data存储区,在使用存储区,在使用COMPACT模式下,模式下,var1被定位在被定位在idata存储区;在存储区;在LARGE模模式下,式下,var1被定位在被定位在xdata存储区中。存储区中。 在固定的存储器地址上进行变量的传递,是在固定的存储器地址上进行变量的传递,是C51标准特征之一。标准特征之一。在在SMALL模式下,参数传递是在片内数据存储区中完成

52、的。模式下,参数传递是在片内数据存储区中完成的。LARGE和和COMPACT模式允许参数在外部存储器中传递。模式允许参数在外部存储器中传递。C51也支持混合模式。例如,在也支持混合模式。例如,在LARGE模式下,生成的程序模式下,生成的程序36可以将一些函数放入可以将一些函数放入SMALL模式中,从而加快执行速度。模式中,从而加快执行速度。下面对存储模式作进一步的说明。下面对存储模式作进一步的说明。(1 1)SMALLSMALL模式。模式。本模式,所有变量都默认位于本模式,所有变量都默认位于5151单片机内单片机内部的数据存储器,这与使用部的数据存储器,这与使用datadata指定存储器类型的

53、方式一指定存储器类型的方式一样。本模式,变量访问的效率高,但所有数据对象和堆栈样。本模式,变量访问的效率高,但所有数据对象和堆栈必须使用内部必须使用内部RAMRAM。(2 2)COMPACTCOMPACT模式。模式。本模式,所有变量都默认在外部数据存本模式,所有变量都默认在外部数据存储器的储器的1 1页内,这与使用页内,这与使用pdatapdata指定存储器类型是一样的。指定存储器类型是一样的。该存储器类型适用于变量不超过该存储器类型适用于变量不超过256256字节的情况,此限制字节的情况,此限制是由寻址方式决定,相当用数据指针是由寻址方式决定,相当用数据指针 RiRi进行寻址。与进行寻址。与

54、SMALLSMALL模式相比,该存储模式的效率比较低,对变量访问模式相比,该存储模式的效率比较低,对变量访问的速度也慢一些,但比的速度也慢一些,但比LARGELARGE模式快。模式快。 37(3 3)LARGELARGE模式。模式。在在LARGELARGE模式中,所有变量都默认位于外部模式中,所有变量都默认位于外部数据存储器,相当于使用数据指针数据存储器,相当于使用数据指针DPTRDPTR进行寻址。通过数进行寻址。通过数据指针访问外部数据存储器的效率较低,特别是当变量为据指针访问外部数据存储器的效率较低,特别是当变量为2 2字节或更多字节时,该模式要比字节或更多字节时,该模式要比SMALLSM

55、ALL和和COMPACTCOMPACT产生更多的产生更多的代码。代码。3.3.2 C513.3.2 C51语言的特殊功能寄存器及位变量定义语言的特殊功能寄存器及位变量定义介绍介绍C51C51如何对特殊功能寄存器以及位变量进行定义并访问。如何对特殊功能寄存器以及位变量进行定义并访问。1 1特殊功能寄存器的特殊功能寄存器的C51C51定义定义C51C51语言允许使用关键字语言允许使用关键字sfrsfr、sbitsbit或直接引用编译器提供的头或直接引用编译器提供的头文件来对特殊功能寄存器(文件来对特殊功能寄存器(SFRSFR)进行访问,特殊功能寄存)进行访问,特殊功能寄存器在片内器在片内RAMRA

56、M的高的高128128字节,只能采用直接寻址方式。字节,只能采用直接寻址方式。 38(1) 使用关键字定义使用关键字定义sfr为了能直接访问特殊功能寄存器为了能直接访问特殊功能寄存器SFR,C51语言提供了一种语言提供了一种定义方法,即引入关键字定义方法,即引入关键字sfr,语法如下:,语法如下:sfr 特殊功能寄存器名字特殊功能寄存器名字=特殊功能寄存器地址;特殊功能寄存器地址;例如:例如:sfrIE=0 xA8;/*中断允许寄存器地址中断允许寄存器地址A8H*/sfrTCON=0 x88;/*定时器定时器/计数器控制寄存器地址计数器控制寄存器地址88H*/sfrSCON=0 x98;/*串

57、行口控制寄存器地址串行口控制寄存器地址98H*/例如要访问例如要访问16位位SFR,可使用关键字,可使用关键字sfr16。16位位SFR的低的低39字节地址必须作为字节地址必须作为“sfr16”的定义地址,例如:的定义地址,例如:sfr16 DPTR=0 x82 /*数据指针数据指针DPTR 的低的低8位地址为位地址为82H,高高8位地址为位地址为83H*/ (2) 通过头文件访问通过头文件访问SFR各种衍生型的各种衍生型的51单片机的特殊功能寄存器的数量与类型有时单片机的特殊功能寄存器的数量与类型有时是不相同的,对单片机特殊功能寄存器的访问可以通过头是不相同的,对单片机特殊功能寄存器的访问可

58、以通过头文件的访问来进行。文件的访问来进行。为了用户处理方便,为了用户处理方便,C51语言把语言把51单片机(或单片机(或52单片机)的单片机)的常用的特殊功能寄存器和其中的可寻址位进行了定义,放常用的特殊功能寄存器和其中的可寻址位进行了定义,放在一个在一个reg51.h(或(或reg52.h)的头文件中。当用户要使用)的头文件中。当用户要使用40时,只需在使用之前用一条预处理命令时,只需在使用之前用一条预处理命令#include把这个头文件包含到程序中,就可以使用特殊功能寄存器把这个头文件包含到程序中,就可以使用特殊功能寄存器名和其中的可寻址位名称了。用户可以通过文本编辑器对名和其中的可寻址

59、位名称了。用户可以通过文本编辑器对头文件进行增减。头文件进行增减。头文件引用举例如下:头文件引用举例如下:#include/*头文件头文件为为51型单片机的头文件型单片机的头文件* /void main(void)TL0=0 xF0;/*给定时器给定时器T0低字节低字节TL0设置时间常数,已在设置时间常数,已在reg51.h中定义中定义*/TH0=0 x3F;/*给给T0高字节高字节TH0设时间常数设时间常数*/TR0=1;/*启动定时器启动定时器0 */41(3) 特殊功能寄存器中的位定义特殊功能寄存器中的位定义对SFR中的可寻址位的访问,要使用关键字来定义可寻址位,共有3种方法。 sbit

60、 位名=特殊功能寄存器位置;例如:sfr PSW=0 xD0; /*定义PSW 寄存器的字节地址0 xD0H*/sbit CY= PSW7; /*定义CY位为PSW.7,地址为0 xD0*/sbit OV= PSW2; /*定义OV位为PSW.2,地址为0 xD2*/ sbit 位名=字节地址位置; 例如:sbit CY= 0 xD07;/* CY位地址为0 xD7*/sbit OV= 0 xD02;/* OV位地址为0 xD2*/42 sbit 位名=位地址; 这种方法将位的绝对地址赋给变量,位地址必须在0 x800 xFF之间。例如:sbit CY= 0 xD7;/* CY位地址为0 xD

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论