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

下载本文档

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

文档简介

1、第第4章章C51C51语言编程基础语言编程基础 2内容概要内容概要 本章在已掌握标准本章在已掌握标准C C语言前提下语言前提下,初步介绍如何如何使用使用C51C51来编写来编写89C5189C51单片机的应用程序单片机的应用程序。 C51C51是在标准是在标准C C的基础上,根据单片机存储器硬件的基础上,根据单片机存储器硬件结构及内部资源,扩展了相应的数据类型和变量,结构及内部资源,扩展了相应的数据类型和变量,而C51在语法规定、程序结构与设计方法上,都与标准在语法规定、程序结构与设计方法上,都与标准C C相同。相同。 本章重点介绍本章重点介绍C51C51对标准对标准C C所扩展的部分所扩展的

2、部分,并通过一些例程例程来介绍C51的程序设计思想。3单片机入门主要掌握以下知识和应用单片机入门主要掌握以下知识和应用 最小系统能够运行起来的必要条件。 1.电源 2.晶振3.复位电路 对单片机任意IO口的随意操作 1.输出控制电平高低 2.输入检测电平高低。 定时器:重点掌握最常用的方式2 中断:外部中断、定时器中断、串口中断 串口通信:单片机之间、单片机与计算机间4 目前51系列单片机编程的C语言都采用Keil C51(简称C51),C51是在是在标准标准C C语言语言基础上发展起来的。基础上发展起来的。C51C51编程语编程语言与标准言与标准C C语言语言相同,也有自身特点。相同,也有自

3、身特点。 软硬件结合!软硬件结合!(编程过程要始终考虑硬件系统。)(编程过程要始终考虑硬件系统。) C语言是美国国家标准协会(ANSI)制定的编程语言标准,1987年ANSI公布87 ANSI C87 ANSI C,即标准C语言。Keil C51Keil C51语语言言是在是在ANSI CANSI C的基础上针对的基础上针对5151单片机的硬件特点进行的单片机的硬件特点进行的扩展,扩展,并向51单片机上移植。 经过多年努力,C51语言已经成为公认的高效、简洁而又贴近51单片机硬件的实用高级编程语言。4.1 4.1 编程语言编程语言Keil C51Keil C51简介简介5 C 语言具有结构化和

4、模块化特点,便于阅读和维护。 C 语言可移植性好,很多微控制器都支持C 编译器。功能化的代码能够很方便的从一个工程移植到另一个工程,从而减少了开发时间。提供的库函数包含许多标准子程序,具有较强的数据处理能力。使用使用C C语言的优点语言的优点6使用使用C C语言的优点语言的优点 C 语言编写的程序比汇编语言编写的程序更符合人们的思考习惯,寄存器分配,不同存储器的寻址及数据类型等细节交由编译器管理,开发者可以更专心的考虑算法,而不是考虑一些细节问题。这样可以减少编程出错的机率,从而提高开发效率,减少调试的时间。 C 语言和微控制器是相对独立的,开发者不必知道处理器的具体内部结构和处理过程。当用新

5、型的微控制器开发程序时,可以很快上手,减少学习时间和程序开发时间。7C51C51与标准与标准C C的主要区别的主要区别:深入理解深入理解以及以及,是掌握,是掌握C51C51语言的语言的之一。之一。n(1 1)头文件的差异)头文件的差异 51系列单片机厂家有多个,它们的差异在于内部资差异在于内部资源如定时器、中断、源如定时器、中断、I/OI/O等数量以及功能的不同等数量以及功能的不同,而对使用者来说,只需要将相应的功能寄存器的头文件加载在程序内,就可实现所具有的功能。因此,Keil C51Keil C51系列的头文件系列的头文件集中体现了各系列芯片的不同资源及功能。(REG52.hREG52.h

6、) (2 2)数据类型的不同)数据类型的不同 电脑CPU是32位或64位,运算能力强,内存大,大量使用float型与long int型变量。单片机一般为8位或16位,运算能力较弱,以char型为主,int型为辅。 51系列单片机包含位操作空间和丰富的位操作指令,与 ANSI C 相比又扩展了4种类型,以便能够灵活地进行操作。8(3 3)数据存储类型的不同)数据存储类型的不同。C语言最初是为通用计算机设计的,在通用计算机中只有一个程序和数据统一寻址的内存空间。而而5151系列单片机系列单片机有片内、有片内、外程序存储器,还有片内、外数据存储器。外程序存储器,还有片内、外数据存储器。标准标准C C

7、并没有提供这部分存储并没有提供这部分存储器的地址范围的定义。器的地址范围的定义。此外,对于AT89S51单片机中大量的特殊功能寄存器也没有定义。(4 4)标准)标准C C语言语言没有没有处理处理单片机中断单片机中断的定义的定义。而而C51C51中定义了专门的中断函数。中定义了专门的中断函数。(5 5)Keil C51与标准C的库函数库函数有较大的不同。 1 1)部分库函数不适合于单片机系统,被排除在)部分库函数不适合于单片机系统,被排除在C51C51语言之外,如语言之外,如图形函图形函 数数。2 2)有些库函数继续使用,但针对单片机硬件特点做出相应的开发。)有些库函数继续使用,但针对单片机硬件

8、特点做出相应的开发。 例如库函数例如库函数printfprintf和和scanfscanf。(在标准。(在标准C C中用于打印和接收字符,在中用于打印和接收字符,在C51C51中用于中用于)。)。9(6 6)有差异有差异 由于由于5151单片机硬件资源有限,它的编译单片机硬件资源有限,它的编译系统不允许太多的程序嵌套。其次,标准系统不允许太多的程序嵌套。其次,标准C C所具备的递归特性所具备的递归特性不被不被C51C51语言支持。语言支持。 (7 7)目标代码)目标代码 电脑生成.exe格式,编译完成后直接在电脑上运行,单片机编译生成.bin代码文件,需要烧写到单片机中并结合外围电路执行。(8

9、 8)仿真调试)仿真调试 单片机的C程序在电脑上进行编译,然后需通过仿真器连接后进行仿真调试,近年来随着电路仿真软件的不断完善,也可通过proteus等软件直接在电脑上进行仿真调试。10 但是从数据运算操作、程序控制语句以及函数但是从数据运算操作、程序控制语句以及函数的使用上来说,的使用上来说,Keil C51Keil C51与标准与标准C C几乎没有什么明显几乎没有什么明显的差别。的差别。如果程序设计者具备了有关标准C的编程基础,只要注意Keil C51与标准C的不同之处,并熟悉AT89S51单片机的硬件结构,就能够较快地掌握Keil C51的编程。关键字-编程语言保留的,它们具有固定名称和

10、含义。在程序编写中不允许用户自己定义的标识符与关键字相同!C51中的关键字除了有ANSI(美国国家标准协会)C标准的32个关键字外,还根据51单片机的特点扩展了相关的关键字。掌握不同之处从关键字开始!关键字关键字用途用途说明说明bitbit位标量声明声明一个位标量或位类型的函数声明一个位标量或位类型的函数sbitsbit位标量声明声明一个可位寻址变量声明一个可位寻址变量sfrsfr特殊功能寄存器声明声明一个特殊功能寄存器声明一个特殊功能寄存器sfr16sfr16特殊功能寄存器声明声明一个声明一个1616位的特殊功能寄存器位的特殊功能寄存器datadata存储器类型说明直接寻址的内部数据存储器直

11、接寻址的内部数据存储器bdatabdata存储器类型说明可位寻址的内部数据存储器可位寻址的内部数据存储器idataidata存储器类型说明间接寻址的内部数据存储器间接寻址的内部数据存储器pdatapdata存储器类型说明分页寻址的外部数据存储器分页寻址的外部数据存储器xdataxdata存储器类型说明外部数据存储器外部数据存储器codecode存储器类型说明程序存储器程序存储器interruptinterrupt中断函数说明定义一个中断函数定义一个中断函数reentrantreentrant再入函数说明定义一个再入函数定义一个再入函数usingusing寄存器组选择选择单片机的工作寄存器组选择

12、单片机的工作寄存器组_at_at_绝对地址说明为非位变量指定存储空间绝对地址为非位变量指定存储空间绝对地址smallsmall存储模式选择参数及局部变量放入可直接寻址的内部参数及局部变量放入可直接寻址的内部RAMRAMcompactcompact存储模式选择参数及局部变量放入分页外部数据存储区参数及局部变量放入分页外部数据存储区largelarge存储模式选择参数及局部变量放入分页外部数据存储区参数及局部变量放入分页外部数据存储区C51C51新增加的关键字新增加的关键字13:由源代码文件生成目标文件由源代码文件生成目标文件:包含了编译器、链接器等开发工具的组合包包含了编译器、链接器等开发工具的

13、组合包 将项目管理、源代码编辑和程序编译、链接、调试等各种工具组合在一个将项目管理、源代码编辑和程序编译、链接、调试等各种工具组合在一个功能强大的环境中,具有良好人机界面。功能强大的环境中,具有良好人机界面。8051单片机所使用的单片机所使用的C语言编译器简称为语言编译器简称为 Cx51例如包含例如包含Cx51、Ax51、BL51、LIB51、OH51、RTX51等等KEIL C51 4.2 Keil C514.2 Keil C51的开发工具的开发工具14Cx51.exe15C C语言结构特点语言结构特点 一个C程序由一个或多个函数组成,其中必须有一个用main命名的主函数。 每个函数由头部和

14、函数体两部分组成。 每个C语句以“;”结尾。 C程序的书写格式比较自由。 可以在程序的任何位置用/*.*/对C程序中的任何部分作注释。 可以在行末用/追加注释。16(一个或若干个)(一个或若干个)n 程序的入口程序的入口 函数名固定,且与书写的位置无关函数名固定,且与书写的位置无关n 有且仅有一个有且仅有一个n 库函数或用户自定义的函数库函数或用户自定义的函数n 可以有若干个可以有若干个C51程序大体上是若干函数的集合17单片机控制单片机控制LEDLED(电路图)(电路图)XTAL218XTAL119ALE30EA31PSEN29RST9P0.0/AD039P0.1/AD138P0.2/AD2

15、37P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.0/T21P1.1/T2EX2P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD10P3.1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C52C122pFC222pFC310uFX1CRYSTALD1LED-RE

16、DR1220R210k18我的第一个程序(单片机控制我的第一个程序(单片机控制LEDLED点亮)点亮)#include sbit LED = P10;void main( )/主程序 LED = 0;/点亮LED while(1);19单片机控制单片机控制LEDLED闪烁(程序)闪烁(程序)#include #define uchar unsigned char#define uint unsigned intsbit LED = P10;void delay(uint x)/延时程序 uchar i; while(x-) for(i = 0;i 120; i+); void main()/主

17、程序 while(1) LED = LED; /LED灯闪烁 delay(400); 20KEILKEIL与与PROTEUSPROTEUS快速入门快速入门 Keil C51Keil C51是美国是美国Keil SoftwareKeil Software公司出品的公司出品的5151系列兼容单系列兼容单片机片机C C语言软件开发系统,与汇编相比,语言软件开发系统,与汇编相比,C C语言在功能上、结语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。构性、可读性、可维护性上有明显的优势,因而易学易用。用过汇编语言后再使用用过汇编语言后再使用C C来开发,体会更加深刻。来开发,体会更加

18、深刻。 Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。 21 1、建立一个新工程 单击Project菜单,在弹出的下拉菜单中选中New Project选项,如图3所示。图3 新建工程文件KEIL C51KEIL C51快速入门快速入门22 2、然后选择你要保存的路径,输入工程文件的名字, 如图4所示,然后点击保存。图4 新建工程文件的保存路径KEIL C51KEIL C51

19、快速入门快速入门23 3、这时会弹出一个对话框,要求你选择单片机的型号,你可以根据你使用的单片机来选择,keil c51几乎支持所有的51内核的单片机, 如图所示,选择89C51之后,右边栏是对这个单片机的基本的说明,然后点击确定。图5 选择单片机的型号KEIL C51KEIL C51快速入门快速入门244、完成上一步骤后,屏幕如图6所示。图6 完成新建工程文件KEIL C51KEIL C51快速入门快速入门25 下面可以编写程序。 5、在图2-7中,单击“File”菜单,再在下拉菜单中单击“New”选项。新建文件后屏幕如图8所示。图7 新建文档图8 完成 新建文档KEIL C51KEIL C

20、51快速入门快速入门26 此时光标在编辑窗口里闪烁,这时可以键入应用程序了,建议首先保存该空白的文件,单击菜单上的“File”,在下拉菜单中选中“Save As”选项单击,屏幕如下图所示,在“文件名”栏右侧的编辑框中,键入欲使用的文件名,用C语言编写扩展名为(.c)如果用汇编语言编写扩展名必须为(.asm)。然后,单击“保存”按钮。 如图8所示。图8 保存新建文档KEIL C51KEIL C51快速入门快速入门27 6、回到编辑界面后,单击“Target 1”前面的“”号,然后在“Source Group 1”上单击右键,弹出菜单9。图9 打开添加文档界面KEIL C51KEIL C51快速入

21、门快速入门28 然后单击“Add File to Group Source Group 1”,屏幕如图10所示。 图10 添加文档KEIL C51KEIL C51快速入门快速入门29选中main.c,然后单击“Add ”屏幕如下图所示。 注意到“Source Group 1”文件夹中多了一个子项“main.c”子项的多少与所增加的源程序的多少相同。 7、现在便可输入程序了,输入完毕进行调试便可运行。 图10 完成添加文档KEIL C51KEIL C51快速入门快速入门30Proteus Proteus 快速入门快速入门 Proteus软件和我们手头的其他电路设计仿真软件最大的不同即它的功能不是

22、单一的。它的强大的元件库可以和任何电路设计软件相媲美;它的电路仿真功能可以和Multisim相媲美,且独特的单片机仿真功能是Multisim及其他任何仿真软件都不具备的;它的PCB电路制版功能可以和Protel相媲美。它的功能不但强大,而且每种功能都毫不逊于Protel,是学习电子设计难得的一个工具软件。31 ISIS智能原理图输入系统,系统设计与仿真的基本平台。 ARES 高级PCB布线编辑软件。 在Proteus中,从原理图设计、单片机编程、系统仿真到PCB设计一气呵成,真正实现了从概念到产品的完整设计。Proteus 从原理图设计到PCB设计,再到电路板完成的流程如图所示。32 数据 数

23、据类型、数据结构、存储类型 运算 算术运算、关系运算、逻辑运算、位操作 控制 顺序结构、选择结构、循环结构、函数4.3 C514.3 C51语言程序设计基础语言程序设计基础 C51 C51语言程序设计的三大要素语言程序设计的三大要素334.3.1 C514.3.1 C51数据类型与存储类型数据类型与存储类型 常量与变量 常量:程序运行中值不能改变的量称为常量,常量存在于ROM中。 变量:变量代表存贮器中的一个或多个存储单元,用来存放数据,一般来讲这些值在程序运行中可以改变(只读变量除外) 变量名命名规则:变量名只能由半角的字母、数字、下划线组成,且第一个字符不能是数字。 变量存在的类型称为变量

24、存在的类型称为数据类型数据类型。34C51C51数据类型与标准数据类型与标准C C数据类型的最大不同之处:数据类型的最大不同之处:位型位型。位型(位型(bit)字符型(字符型(char)整型(整型(int)长整型(长整型(long)浮点型(浮点型(float)双精度浮点型(双精度浮点型(double)数组类型(数组类型(array)结构体类型(结构体类型(struct)共用体(共用体(union)枚举(枚举(enum)基本类型基本类型构造类型构造类型指针类型指针类型空类型空类型数据类型数据类型 数据类型数据类型35C51C51数据类型数据类型数据类型C51专用长度取值范围signed char

25、单字节-128 to +127unsigned char单字节0 to 255signed int2字节-32768 to +32767unsigned int2字节0 to 65535signed long4字节-2147483648 to +214746483647unsigned long4字节0 to 4294967295float4字节1.175494E-38 to 3.402823E+38double8字节1.175494E-308*13字节对象的地址36数据类型C51专用长度取值范围bit专用1位0 或 1sbit专用1位0 或 1sfr专用1字节0 255sfr16专用2字节0

26、 65535C51C51数据类型数据类型3738C C语言的变量定义与赋值语言的变量定义与赋值 定义一个变量 先定义,后使用。例如:Int a; char b; 变量赋初值,C允许在定义变量的同时给变量赋初值。 例如: char c = a; int a = 7; int a,b,c=9; /定义a、b、c为整型变量,对c赋初值。 int a = 3,b = 3,c = 3; 错误:int a=b=c=3;39 定义定义变量类型变量类型应考虑如下问题:应考虑如下问题:程序运行时该变量可能的取值范围,是否有负值,绝对值有多大,以及相应需要的存储空间大小。在够用的情况下,尽量选择8位即一个字节的c

27、har型,特别是unsiged char。对于51系列这样的定点机而言,浮点类型变量将明显增加运算时间和程序长度,如果可以的话,尽量使用灵活巧妙的算法来避免浮点变量的引入。40C51C51的扩展数据类型的扩展数据类型(1 1)位变量)位变量bitbitbit的值可以是1(true), 也可以是0(false)。使用关键字使用关键字bitbit例如:例如:bit lockbit lock;/ /* *将将locklock定义为位变量定义为位变量* */ /bit direntionbit dirention;/ /* *将将directiondirection定义为位变量定义为位变量* */ /

28、4142C51C51的扩展数据类型的扩展数据类型(2 2)特殊功能寄存器)特殊功能寄存器sfrsfr AT89S51特殊功能寄存器在片内RAM区的80HFFH之间,“sfrsfr” 数据类型数据类型占用一个内存单元。利用它可访问AT89S51内部的所有特殊功能寄存器。 例如:例如:sfr P1=0 x90sfr P1=0 x90这一语句定义P1口在片内的寄存器,在后面语句中可用“P1=0 xff”(使P1的所有引脚输出为高电平)之类的语句来操作特殊功能寄存器。 标准SFR在reg51.h、reg52.h 等头文件中已经被定义,只要用文件包含做出申明即可使用。43(3 3)特殊功能寄存器)特殊功

29、能寄存器sfr16sfr16 “sfr16sfr16”数据类型数据类型占用两个内存单元。sfr16和sfr一样用于操作特殊功能寄存器。所不同的是它用于操作占两个字节的特殊功能寄存器。 例如:例如: sfr16 DPTR=0 x82sfr16 DPTR=0 x82语句定义了片内16位数据指针寄存器DPTR,其低8位字节地址为82H。在后面的语句中可以对DPTR进行操作。44(4 4)特殊功能位)特殊功能位 sbitsbitsbitsbit 是指AT89C51片内特殊功能寄存器的可寻址位。例如:例如: sfr PSW=0 xd0sfr PSW=0 xd0 ;/ /* *定义定义PSWPSW寄存器地

30、址为寄存器地址为0 xd00 xd0* */ /sbit PSW 2 = 0 xd2sbit PSW 2 = 0 xd2;/ /* *定义定义OVOV位为位为PSW.2PSW.2* */ /符号“”前面是特殊功能寄存器的名字,“”的后面数字定义特殊功能寄存器可寻址位在寄存器中的位置,取值必须是07。注意,不要把注意,不要把bitbit与与sbitsbit混淆。混淆。bit用来定义普通的位变量,值只能是二进制的0或1。而sbit定义的是特殊功能位。45#include sbit D3 = P22;void main() D3 = 0 ; /点亮LED while(1) /循环,挂起 ; _ _

31、_ 引用含有引用含有SFRSFR符号定义的头文件符号定义的头文件 定义符号定义符号D3D3为为P2P2口的第口的第2 2位位 D3D3可以换为其他自定义符号,作可以换为其他自定义符号,作用相同,如:用相同,如: sbit P2_2 = P22;sbit P2_2 = P22; 点亮发光二极管的功能语句点亮发光二极管的功能语句 while(1)while(1)无限循环,用于程序的无限循环,用于程序的反复执行或者程序挂起,很重要!反复执行或者程序挂起,很重要! 使用使用tabtab或者空格,使程序结构或者空格,使程序结构清晰,便于阅读清晰,便于阅读 适当加入注释,使编程思路清晰,适当加入注释,使编

32、程思路清晰,便于阅读和后期的修改便于阅读和后期的修改q sbit的使用46 89S51 89S51单片机的数据存储类型单片机的数据存储类型 8051系列微处理器采用了哈佛结构,即程序存储器和数据存储器是分离的。8051系列微处理器提供了三种不同类型的存储区域(memory areas): 程序存储区(program memory) 内部数据存储区(internal data memory) 外部数据存储区(external data memory) 这三种存储区域均从地址0开始编址,通过采用不同的寻址指令来解决地址重叠的问题。 47存储类型存储类型说明说明直接寻址的片内数据存储器(128B),

33、访问速度最快(00H-7FH)可位寻址的片内数据存储器(16B),允许位和字节混合访问(20H-2FH)间接访问的片内数据存储器(256B),全部片内RAM空间(00H-FFH)分页访问的片外数据存储器(256B) 00H-FFH片外数据存储器(64KB),访问速度相对比较慢 0000H-FFFFH程序存储器(64KB) 0000H-FFFFHn C51数据的存储类型数据的存储类型 在讨论在讨论C51的数据类型的时候,必须理解数据的的数据类型的时候,必须理解数据的存储类型存储类型和它与和它与8051单片机单片机存储器结构存储器结构的关系的关系.48C51C51存储类型存储类型存储器类型存储区域

34、大小对应的汇编语句(了解)描述code程序存储区64KBMOVC A,A+DPTR用来说明常量data直接寻址的内部数据存储区128BMOV XX,#ADDR访问速度快idata间接寻址的内部数据区256BMOV XX,Rn可访问整个内部数据区域bdata位寻址的内部数据存储区16B可使用位寻址或字节寻址来访问这一区域xdata外部数据存储或64KBMOVX A,DPTR使用DPTR来访问外部数据存储器49存储区域的划分存储区域的划分50(1 1)内部数据存储区()内部数据存储区(internal data memoryinternal data memory) 内部数据存储区(interna

35、l data memory),共256个字节。这部分主要是作为程序的数据段。 前128 字节,称为DATA 区。该区可采用直接寻址方式来访问。DATA区也以用R0 和R1间接寻址访问。 后128个字节,即从地址80H 开始的内部数据存储区,用做特殊功能寄存器区(special function register memory),简称SFR。这些特殊功能寄存器用来控制计时器,计数器,串行I/O,I/O端口和外设的工作。只能直接寻址 注意:特殊功能寄存器并未占用特殊功能寄存器区的所有地址单元,即特殊功能寄存器是离散分布。51内部数据存储区的DATA区又可以细分为三个子段:四个工作寄存器组,每个寄存

36、器组包含8个寄存器,四个寄存器组共32 个字节。由PSW 的RS1 和RS0选择四组寄存器的任意一组作为当前工作寄存器组。位寻址段BDATA, 包括16 个字节,共128 位,每一位都可单独寻址。也可以按字节进行寻址。一般数据存储器,仅能按字节寻址,共80个字节。内部数据存储区(内部数据存储区(internal data memoryinternal data memory)52(2 2)外部数据存储区()外部数据存储区(external data memoryexternal data memory) 也称为XDATA 区。XDATA区和CODE 区一样也采用16 位地址寻址,即寻址空间可达

37、64KB。 该区通常包括一些通用数据存储器或者一些需要通过总线接口访问的外围器件。 访问外部数据区比访问内部数据区要慢,因为访问外部数据区时,必须先将要访问单元的16位地址装载到数据指针寄存器DPTR中,然后才能通过DPTR采用间接访问方式来访问该单元。53 C51使用两种修饰符来表示外部数据区:xdata , pdata xdata :说明外部数据空间的所有64KB的地址空间。 pdata :指向外部数据空间中的大小为一页(256字节)的数据存储空间。 注意:某些新型的51芯片有更大的XRAM(如16M的XRAM),一般用far类型来描述这些区域。可以分别用 far 和const far 来

38、访问位于扩充RAM空间中的变量和扩充ROM空间中的常量。 某些单片机芯片提供了片内的XRAM空间,这种空间也使用和传统的外部数据空间相同的指令来访问外部数据存储区(外部数据存储区(external data memoryexternal data memory)54 说明:某些系列的单片机(如8052) 有额外的128 字节的内部RAM, 同样位于从80H 开始的内部数据存储地址空间中,称为IDATA区。IDATA 区的地址和SFR的地址是重叠的,必须使用不同的寻址方式的指令来解决地址重叠问题。SFR区只能通过直接寻址来访问, IDATA 区只能通过间接寻址来访问。内部数据存储区(内部数据存储

39、区(internal data memoryinternal data memory)55(3 3)程序存储区()程序存储区(CODECODE) 程序存储区,也称为CODE 区,常用来存放可执行代码。代码区的地址位数为16 位,即寻址空间可达64K。 一般情况,程序存储区是只读的,除了保存可执行代码,还可用于保存各种常量值,查找表等固定的数据结构。如:unsigned char code test=“hello!”;56存储器类型的变量声明举例存储器类型的变量声明举例char data var1;char code text = ENTER PARAMETER:;unsigned long x

40、data array100; float idata x,y,z;unsigned int pdata dimension;unsigned char xdata vector1044;说明:说明:声明变量时声明变量时存储区修饰符和数存储区修饰符和数据类型修饰符的位据类型修饰符的位置可以互换,即置可以互换,即char data x; 和和 data char x; 是完是完全等效的。不过从全等效的。不过从兼容性考虑,建议兼容性考虑,建议使用前一种格式。使用前一种格式。57变量类型修饰符总结变量类型修饰符总结 data: 速度最快,可以读或写操作,只有128字节,可以省略,89C51单片机默认的

41、变量存储位置就是128字节的片内数据存储区。 idata: 速度较快,可以读或写操作,只有128字节,注意只存在于尾缀为52以上的单片机中,当data数据不够可用idata。 xdata: 速度较慢,可以读或写操作,最多有64k字节(取决于外接的SRAM芯片容量),一般用于解决内部SRAM不够用同时对变量访问不需要非常快的应用场合。 code: 速度最慢,只读,最多有64K字节(取决于内部ROM与外部ROM容量之和)。一般用于存储大量的只读数据(如图形液晶的数据,文本数据等)58 定义数据的存储类型通常遵循如下原则:定义数据的存储类型通常遵循如下原则:只要条件满足,尽量选择内部直接寻址的存储类

42、型data,然后选择idata即内部间接寻址。对于那些经常使用的变量要使用内部寻址。在内在内部数据存储器数量有限或不能满足要求的情况下才使用外部部数据存储器数量有限或不能满足要求的情况下才使用外部数据存储器。数据存储器。选择外部数据存储器可先选择pdatapdata类型,最后最后选用选用xdataxdata类型类型。 需指出,扩展片外存储器,原理上虽很简单,但在实际开发中,很多时候,会带来不必要的麻烦,如可能降低系统稳定性、增加成本、拉长开发和调试周期等,推荐充分利用片内推荐充分利用片内存储空间。存储空间。59另外,通常的单片机应用都是面对小型的控制,代码比较短,对于程序存储区的大小要求很低,

43、常常是片内RAM很紧张而片内Flash ROM很富裕,因此如果实时性要求不高,可考虑可考虑使用使用宏宏,以及将一些子函数的常量数据做成数据表,放置在程序存储区,当程序运行时,进入子函数动态调用下载至RAM即可,退出子函数后立即释放该内存空间。60定义变量时如果省略定义变量时如果省略“存储器类型存储器类型”选项,则按编译时使用选项,则按编译时使用的存储器模式的存储器模式来使用默认的存储来使用默认的存储器类型。器类型。默认存储类型为默认存储类型为data,访问速度最快,容量小,访问速度最快,容量小默认存储类型为默认存储类型为pdata默认存储类型为默认存储类型为xdata,访问效率最低,代码长,访

44、问效率最低,代码长,容量大容量大 数据存储模式数据存储模式61存储模式(存储模式(memory modelsmemory models) 如果在变量声明时未声明变量的存储器类型,则该变量的存储器类型,由程序的存储模式来决定。 小模式(small model):默认data区 紧凑模式(compact model):默认pdata区 大模式(large model):默认xdata区 注意:除非应用在特殊的场合,否则SMALL存储模式可以提供最快和最有效的代码。 624.3.2 C514.3.2 C51语言的特殊功能寄存器及位变量定义语言的特殊功能寄存器及位变量定义 特殊功能器的定义 (1)使用

45、关键字定义sfr sfr IE = 0 xA8; (2)通过头文件访问SFR #include #include (3)特殊功能寄存器中的位定义 sbit CY = PSW7; sbit CY = 0 xD07; sbit CY = 0 xD7;63 位变量的C51定义 (1)位变量的C51定义 (2)函数可以包含类型为bit的参数,也可将其作为返回值。 (3)位变量不能定义指针和数组。644.3.3 C514.3.3 C51语言的绝对地址访问语言的绝对地址访问65绝对宏绝对宏以字节形式对以字节形式对code区寻址;区寻址;以字形式对以字形式对code区寻址区寻址;以字节形式对以字节形式对da

46、ta区寻址区寻址;以字形式对以字形式对data区寻址;区寻址;以字节形式对以字节形式对xdata区寻址区寻址;以字形式对以字形式对xdata区寻址区寻址;以字节形式对以字节形式对pdata区寻址区寻址;以字形式对以字形式对pdata区寻址。区寻址。【例例】片内RAM、片外RAM及I/O的定义的程序如下:#include /*先声明,再使用先声明,再使用XBYTE和和DBYTE#define PORTA XBYTE0 xFFC0 /*将PORTA定义为外部I/O口,地址为0 xFFC0*/#define NRAM DBYTE0 x40 /*将NRAM定义为片内RAM,地址为0 x40*/ mai

47、n( ) PORTA=0 x3D; /*数据3DH写入地址0 xFFC0的外部I/O端口PORTA */ NRAM=0 x01; /*将数据01H写入片内RAM的40H单元*/ 6667【例例】使用关键字_at_实现绝对地址的访问,程序如下:void main(void) data unsigned char y1_at_0 x50; /*在data 区定义字节变量y1,它的地址为50H*/ xdata unsigned int y2_at_0 x4000; /*在xdata区定义字变量y2,地址为4000H*/ y1=0 xff; y1=0 x1234; while(1); 6869 C51

48、的基本运算与标准C类似,主要包括:算数运算;关系运算;逻辑运算;位运算;赋值运算及其表达式。 4.3.4 C514.3.4 C51的数据运算的数据运算70符号说明+加法运算-减法运算*乘法运算/除法运算%取模运算+自增1-自减1算术运算符及其说明算术运算符及其说明71 对于“/ /”和“% %”往往会有疑问。这两个符号两个符号都涉及除法运算,但“/”运算是取商,而“%” 运算为取余数。例如例如“5/35/3”的结果(商)的结果(商)为1,而“5%35%3”的结果的结果为2(余数)。 自增和自减运算符是使变量自动加1或减1,自增和自减运算符放在变量前和变量之后是不同的。+i+i,-i-i:在使用

49、:在使用i i之前,先使之前,先使i i值加(减)值加(减)1 1。i+i+,i-i-:在使用:在使用i i之后,再使之后,再使i i值加(减)值加(减)1 1。72 例如:例如:若i=4,则执行x=+i时,先使i加1,再引用结果,即x=5,运算结果为i=5,x=5。再如:再如:若i=4,则执行x=i+时,先引用i值,即x=4,再使i加1,运算结果为i=5,x=4。73符号说明&逻辑与逻辑或!逻辑非74符号说明大于=大于或等于=小于或等于=等于!=不等于75 位运算是指进行二进制位的运算,在单片机编程中,常需要处理二进制位的问题。 例如:例如: 将寄存器的某一位或某几位置1、清0与取反

50、;将一个存储单元中各二进制位左移或右移N位,两个数按位相加等等。 C语言中提供位运算的功能,更加贴近单片机硬件,与其他高级语言相比,具有很大的优越性。76符号含义&按位与|按位或按位异或按位取反。一元运算符右移操作。右边移出的位舍去,左边移入的位对无符号数补0;对有符号数补符号位77 左移运算符() 用来将一个数的各二进位全部左移若干位,左高位溢出,右低位补0。 如b=a2;a=a2;a=2; a=15,左移2位等于多少? 高位左移后溢出,舍弃掉。在该数左移时被溢出舍弃的高位不包含1时,左移1位相当于该数乘以2. 152=? 143) 用来将一个数的各二进位全部右移若干位,左高位补0,

51、右低位溢出。 如b=a2;a=a2;a=2; a=15,左移2位等于多少? 低位右移后溢出,舍弃掉。 152=? 142=?79 按位异或运算符() 异或运算符的规则是参加运算的两个二进制位相同为0(假),相异为1(真)。即 00=0;01=1;10=1;11=0; 例如:0 x2D0 x0F=0 x22,将十六进制数0 x2D与十六进制数0 x0F进行按位异或运算,高四位保持不变,低四位全部翻转。通过按位运算可以实现对变量的某一位或某几位取反操作。80取反运算符() 是一个单目运算符,用来对一个二进制数按位取反,即将0变1,1变0。例如48。 取反运算符常与移位运算符及按为与、按位或、按位异

52、或运算符结合使用以实现对某一位或某几位清0、置1、取反的操作。81按位与运算符(&) 参加运算的两个数据,按二进制位进行与运算。按位或运算符(|) 参与按位或运算的二进制位中只要有一个为1,该位的结果为1 。 82编程实例编程实例( (流水灯编程演示)流水灯编程演示) 实现8位LED从左到右循环 实现8位LED左右来回循环L1L2L3L4L5L6L7L8L8L1L2L3L4L5L6L7XTAL218XTAL119ALE30EA31PSEN29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD63

53、3P0.7/AD732P1.0/T21P1.1/T2EX2P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD10P3.1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C52C122pFC222pFC310uFX1CRYSTALR910kR1220R3220R4220R5220R6220R2220R7220R8220D1LE

54、D-REDD2LED-BLUED3LED-REDD4LED-BLUED5LED-REDD6LED-BLUED7LED-REDD8LED-BLUE83如何实现循环移位?如何实现循环移位?C51库函数intrins.h函数原型 #include unsigned char _crol_(unsigned char c,unsigned char b);功能:将c向左循环移位b位函数原型 unsigned char _cror_(unsigned char c,unsigned char b);功能:将c向右循环移位b位用库函数实现上述流水灯用库函数实现上述流水灯例如: P0 = _cror_(P0

55、,3);/将P0带位循环右移3位 84 例:unsigned char x=0 x55 ; unsigned char y=0 x37 ; unsigned char z; z=x&y ; 则z= z=x|y ; 则z= z=xy ; 则z= z=x; 则z= z=x1;则z=位运算符举例位运算符举例85位运算编程小窍门(将某一位置位运算编程小窍门(将某一位置1 1、置、置0 0、取反)、取反)将某一位置1(相应位与1进行按位或运算) 例:P0 | = (1 n); /将P0的第n位置1,其它位不变将某一位置0 (相应位与0按位进行与运算) 例:P0 & = (1 n); /将

56、P0的第n位置0,其它位不变将某一位取反(相应位与1进行按位异或运算) 例:P0 = ( 1 n ) 86按位与的用途按位与的用途某一位或某几位清零而其它位保持原值如 原有数在P0寄存器中,为01011010,现要将其第一位清0,其它位保持不变。 则可与11111101进行按位与。 即 P0 = P0 & 0 xFD; 或 P0 &= 0 xFD 也可写成 P0 &= (11);P0 & = (1 n); /将P0的第n位置0,其它位不变87按位与的用途按位与的用途取一个数中的某些指定位例:取单片机P0口的P0.2位状态(1或0)可这样操作: if(P0 &am

57、p;(12) ; else.;88按位异或的用途按位异或的用途将某一位或某几位取反(相应位与1进行按位异或运算) 例:P0 = ( 1 n )按位或的用途将某一位或某几位置1(相应位与1进行按位或运算) 例:P0 | = (1 n); /将P0的第n位置1,其它位不变。89赋值、指针和取值运算符赋值、指针和取值运算符符号说明=赋值*指向运算符&取地址90复合赋值运算符 十种:, , , , ,。按优先级顺序结合运算。 例如: a+=b 等价于a=(a+b) x*=a+b 等价于x=(x*(a+b) a&=b 等价于a=(a&b) a=4 等价于a=(a4) 算术运算符、

58、逻辑运算符、关系运算算术运算符、逻辑运算符、关系运算符、赋值运算符的优先级符、赋值运算符的优先级赋值运算符的优先级按照从右到左;其余都是从左到右。算术运算符、逻辑运算符、关系运算算术运算符、逻辑运算符、关系运算符、赋值运算符的优先级符、赋值运算符的优先级 【例例】 编写程序将扩展的某编写程序将扩展的某I/O口口PORTA()的)的PORTA.4清清0 ,PORTA.0置为置为1,程序如下:,程序如下: #define #define PORTA XBYTE0 xFFC0 void main( ) PORTA= ?; 94 计算机程序是由若干条有序的语句组成的。在程序执行过程中一般有以下几种情况

59、: 在程序执行过程中,程序按语句的顺序逐条执行,这称为顺序结构。 在程序执行过程中,根据特定的条件选择执行某些语句,即程序执行的顺序根据条件来选择,这称为选择结构。 在程序执行过程中,根据某个条件是否成立重复执行一段程序,直到该条件不成立为止,即程序的执行顺序在某处循环,这称为循环结构。 程序是由顺序、选择、循环这三种结构构成的复杂组合。 4.3.5 C514.3.5 C51程序设计的三种基本结构程序设计的三种基本结构95 C语言的语句用来向计算机系统发出操作指令,C语言中语句是以分号为结束标志的。 C语言中语句可分为以下几类: 控制语句:控制程序运行的语句。 空语句:只有一个分号的语句,称为

60、空语句,它不进行任何操作。 表达式语句:表达式后面加上分号就构成一个表达式语句。函数调用语句也是表达式语句,由函数调用加分号构成。 复合语句:可以把多个语句用括起来,就成为复合语句,多用于选择或循环结构中。 注释语句:在C51中,由/*、*/符号对包含的内容以及双斜杠/后面的内容均表示注释语句。编程人员使用注释语句来解释程序的功能,标注修改时间等。96语句功能ifelse条件语句for()循环语句while()循环语句dowhile()循环语句continue结束本次循环语句break中止执行switch语句或循环语句switchcase多分支选择语句goto转向语句return从函数返回语句97 顺序结构顺序结构是从前往后依次执行语句。从整体上看所有程序都是顺序结构,只不过中间某些部

温馨提示

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

评论

0/150

提交评论