C语言编程基础图文.pptx

上传人:莉*** 文档编号:87182526 上传时间:2023-04-16 格式:PPTX 页数:156 大小:1.01MB
返回 下载 相关 举报
C语言编程基础图文.pptx_第1页
第1页 / 共156页
C语言编程基础图文.pptx_第2页
第2页 / 共156页
点击查看更多>>
资源描述

《C语言编程基础图文.pptx》由会员分享,可在线阅读,更多相关《C语言编程基础图文.pptx(156页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、单片机应用系统日趋复杂,对程序的可读性、升级与维护以单片机应用系统日趋复杂,对程序的可读性、升级与维护以及模块化要求越来越高,对软件编程要求也越来越高,要及模块化要求越来越高,对软件编程要求也越来越高,要求编程人员在短时间内编写出执行效率高、运行可靠的程求编程人员在短时间内编写出执行效率高、运行可靠的程序代码。同时,也要方便多个编程人员来进行协同开发。序代码。同时,也要方便多个编程人员来进行协同开发。C51C51语言是近年来在语言是近年来在80518051单片机开发中,普遍使用的程序设单片机开发中,普遍使用的程序设计语言,能直接对计语言,能直接对80518051单片机硬件进行操作,既有高级语单

2、片机硬件进行操作,既有高级语言特点,又有汇编语言特点,因此在言特点,又有汇编语言特点,因此在80518051单片机程序设计单片机程序设计中,得到广泛使用。中,得到广泛使用。本章介绍本章介绍80518051单片机的单片机的C51C51语言,以及如何使用语言,以及如何使用C51C51语言集成语言集成化开发平台化开发平台Keil Vision3Keil Vision3,进行,进行C51C51程序设计与开发。程序设计与开发。1第1页/共156页3.1 C513.1 C51编程语言简介用于80518051单片机编程的C C语言,在标准C C基础上针对80518051硬件特点进行扩展,并向80518051

3、上移植,经多年努力,C51C51已成为公认的高效、简洁的80518051单片机的实用高级编程语言。与80518051汇编语言相比,C51C51语言在功能上、结构性、可读性、可维护性上有明显优势,易学易用。3.1.1 C513.1.1 C51语言与汇编语言的比较与80518051汇编语言相比,C51C51有如下优点。(1 1)可读性好。C51C51语言程序比汇编语言程序的可读性好,编程效率高,程序便于修改、维护以及升级。第2页/共156页(2 2)模块化开发与资源共享。用C51C51开发的程序模块可不经修改,直接被其他工程所用,使得开发者能够很好地利用已有的大量标准C C程序资源与丰富的库函数,

4、减少重复劳动,同时也有利于多个工程师进行协同开发。(3 3)可移植性好。为某种型号单片机开发的C C语言程序,只需把与硬件相关的头文件和编译链接的参数进行适当修改,就可方便地移植到其他型号的单片机上。例如,为80518051单片机编写的程序通过改写头文件以及少量的程序行,就可方便地移植到PICPIC单片机上。(4 4)生成的代码效率高。当前较好的C51C51语言编译系统编译出来的代码效率只比直接使用汇编语言低20%20%左右,如果使用优化编译选项,最高可达到90%90%左右。3第3页/共156页3.1.2 C513.1.2 C51语言与标准C C语言的比较C51C51语言与标准C C语言间有许

5、多相同地方,但也有自身特点。不同的嵌入式C C语言编译系统之所以与标准C C语言有不同的地方,主要是由于它们所针对的硬件系统不同。对于80518051单片机,目前广泛使用的是C51C51语言。C51C51语言基本语法与标准C C相同,是在标准C C的基础上进行适合80518051内核单片机硬件的扩展。深入理解C51C51语言对标准C C语言的扩展部分以及它们的不同之处,是掌握C51C51语言的关键之一。4第4页/共156页C51C51语言与标准C C语言一些差别如下。(1 1)库函数不同。标准C C中不适合于嵌入式控制器系统的库函数,被排除在C51C51语言之外,如字符屏幕和图形函数。有些库函

6、数必须针对80518051的硬件特点来做出相应的开发。例如,在标准C C中,库函数printfprintf和scanfscanf,常用于屏幕打印和接收字符,而在C51C51语言中,主要用于串行口数据的收发。(2 2)数据类型有一定区别。在C51C51中增加几种80518051单片机的数据类型,在标准C C的基础上又扩展了4 4种类型。例如,80518051单片机包含位操作空间和丰富的位操作指令,因此,C51C51语言与标准C C语言相比增加了位类型。5第5页/共156页 (3 3)C51C51语言变量存储模式与标准C C语言中变量存储模式数据不一样。标准C C最初是为通用计算机设计的,在通用计

7、算机中只有一个程序和数据统一寻址的内存空间,而C51C51语言中变量的存储模式与80518051单片机的各种存储器区紧密相关。(4 4)数据存储类型不同。80518051存储区可分为内部数据存储区、外部数据存储区以及程序存储区。内部数据存储区可分为3 3个不同的C51C51存储类型:datadata、idataidata和bdatabdata。外部数据存储区分为2 2个不同的C51C51存储类型:xdataxdata和pdatapdata。程序存储区只能读不能写,可能在80518051内部或者在外部,C51C51语言提供的codecode存储类型用来访问程序存储区。6第6页/共156页 (5

8、5)标准C C语言没有处理单片机中断的定义,而C51C51语言中有专门的中断函数。(6 6)C51C51语言与标准C C的输入/输出处理不一样。C51C51中输入/输出是通过80518051单片机的串口来完成的,输入/输出指令执行前必须对串行口初始化。(7 7)头文件不同。C51C51语言头文件必须把80518051单片机内部的外设硬件资源(如定时器、中断、I/OI/O等)相应的特殊功能寄存器写入到头文件内,而标准C C不用。(8 8)程序结构的差异。由于80518051单片机的硬件资源有限,它的编译系统不允许太多的程序嵌套。其次,标准C C语言所具备的递归特性不被C51C51语言支持。7第7

9、页/共156页但从数据运算操作、程序控制语句以及函数的使用上来说,C51C51与标准C C几乎没有什么明显差别。如果程序设计者具备了有关标准C C语言的编程基础,只要注意C51C51与标准C C不同之处,并熟悉80518051单片机的硬件结构,就能较快掌握C51C51编程。3.2 C513.2 C51语言程序设计基础本节在标准C C基础上,了解掌握C51C51的数据类型和存储类型、C51C51的基本运算与流程控制语句、C51C51语言构造数据类型、C51C51函数以及C51C51程序设计的其他一些问题,为C51C51的程序开发打下基础。8第8页/共156页3.2.1 C513.2.1 C51语

10、言中的数据类型与存储类型1 1数据类型 数据是单片机操作的对象,具有一定格式的数字或数值,数据的不同格式就称为数据类型。Keil C51 Keil C51支持的基本数据类型见表3-13-1。针对80518051的硬件特点,C51C51在标准C C基础上,扩展了4 4种数据类型(见表3-13-1中最后4 4行)。注意,扩展的4 4种数据类型,不能使用指针来对它们存取。9第9页/共156页第10页/共156页2 2C51C51的扩展数据类型 下面对扩展的4 4种数据类型说明。(1 1)位变量bitbit的值可以是1 1(truetrue),也可是0 0(falsefalse)。(2 2)特殊功能寄

11、存器sfrsfr。80518051单片机的特殊功能寄存器分布在片内数据存储区的地址单元80H80HFFHFFH之间,“sfrsfr”数据类型占用一个内存单元。利用它可访问80518051单片机内部的所有特殊功能寄存器。例如:sfr P1=0 x90sfr P1=0 x90这一语句定义了P1P1端口在片内的寄存器,在程序后续的语句中可以用“P1=0 xffP1=0 xff”,使P1P1的所有引脚输出为高电平的语句来操作特殊功能寄存器。11第11页/共156页(3 3)特殊功能寄存器sfr16sfr16。“sfr16sfr16”数据类型占用两个内存单元,用于操作占两个字节的特殊功能寄存器。例如:“

12、sfr16 DPTR=0 x82sfr16 DPTR=0 x82”语句定义了片内1616位数据指针寄存器DPTRDPTR,其低8 8位字节地址为82H82H,高8 8位字节地址为83H83H。在程序的后续语句中就可对DPTRDPTR进行操作。(4 4)特殊功能位sbitsbit。sbitsbit是指AT89S51AT89S51片内特殊功能寄存器的可寻址位。例如:sfrsfrPSW=0 xd0PSW=0 xd0;/定义PSWPSW寄存器地址为0 xd00 xd0sbitsbitsbit OV=PSW2sbit OV=PSW2;/定义OVOV位为PSW.2PSW.2符号“”前是特殊功能寄存器名字,

13、“”后的数字定义特殊功能寄存器可寻址位在寄存器中的位置,取值必须是0 07 7。第12页/共156页 注意,不要把bitbit与sbitsbit相混淆。bitbit定义普通的位变量,只能是二进制的0 0或1 1。sbitsbit是定义特殊功能寄存器的可寻址位,值是可以进行位寻址的特殊功能寄存器的某位的绝对地址,例如PSWPSW寄存器OVOV位的绝对地址0 xd20 xd2。3 3数据存储类型 在讨论C51C51数据类型时,须同时提及它的存储类型,以及它与80518051单片机存储器结构的关系,因为C51C51定义的任何数据类型必须以一定的方式,定位在80518051单片机的某一存储区中,否则没

14、有任何实际意义。13第13页/共156页 8051 8051有片内、片外数据存储区,还有程序存储区。片内的数据存储区是可读写的,80518051单片机的衍生系列最多可有256256字节的内部数据存储区(例如AT89S52AT89S52单片机),其中低128128字节可直接寻址,高128128字节(80H80HFFHFFH)只能间接寻址,从地址20H20H开始的1616字节可位寻址。内部数据存储区可分为3 3个不同的数据存储类型:datadata、idataidata和bdatabdata。访问片外数据存储区比访问片内数据存储区慢,因为访问片外数据存储区要通过对数据指针加载地址来间接寻址访问。C

15、51C51提供两种不同的数据存储类型xdataxdata和pdatapdata来访问片外数据存储区。14第14页/共156页程序存储区只能读不能写,可能在80518051单片机内部或者外部,或外部和内部都有,由80518051单片机硬件决定,C51C51提供了codecode存储类型来访问程序存储区。C51C51存储类型与80518051实际的存储空间的对应关系见表3-23-2。下面对表3-23-2各种存储区作以说明。(1 1)DATADATA区。寻址是最快的,应把常使用的变量放在该区,但该区存储空间有限,DATADATA区除了包含程序变量外,还包含了堆栈和寄存器组。DATADATA区声明中的

16、存储类型标识符为datadata,通常指片内RAM128RAM128字节的内部数据存储的变量,可直接寻址。15第15页/共156页16第16页/共156页声明举例:unsigned char data system_status=0;unsigned char data system_status=0;unsigned int data unit_id8;unsigned int data unit_id8;char data inp_string20char data inp_string20;标准变量和用户自声明变量都可存储在DATADATA区中,只要不超过DATADATA区的范围即可,由

17、于C51C51用默认的寄存器组来传递参数,这样DATADATA区至少失去8 8字节空间。另外,当内部堆栈溢出的时候,程序会莫名其妙地复位。这是因为80518051没有报错机制,堆栈溢出只能以这种方式表示,因此要留有较大的堆栈空间来防止堆栈溢出。(2 2)BDATABDATA区。DATADATA中的位寻址区,在该区中声明变量就可进行位寻址。BDATABDATA区声明中的存储类型标识符17第17页/共156页为bdatabdata,指的是片内RAMRAM可位寻址的1616字节存储区(字节地址为20H20H2FH2FH)中的128128个位。下面是在BDATABDATA区中声明的位变量和使用位变量的

18、例子:unsigned char bdata status_byte;unsigned char bdata status_byte;unsigned int bdata status_word;unsigned int bdata status_word;sbit stat_flag=status_byte4;sbit stat_flag=status_byte4;if(status_word15)if(status_word15)stat_flag=1;stat_flag=1;C51 C51编译器不允许在BDATABDATA区中声明floatfloat和doubledouble型变量。(3

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

20、char idata inp_string16char idata inp_string16;float idata out_value;float idata out_value;(4 4)PDATAPDATA区和XDATAXDATA区 位于片外存储区,PDATAPDATA区和XDATAXDATA区声明中的存储类型标识符分别为pdatapdata和xdataxdata。PDATAPDATA区只有256256字节,仅指定256256字节的外部数据存储区。但XDATAXDATA区最多可达64KB64KB,对应的xdataxdata存储类型标识符可指定外部数据区64KB64KB内的任何地址。19第

21、19页/共156页 对PDATAPDATA区的寻址要比对XDATAXDATA区寻址快,因为对PDATAPDATA区寻址,只需装入8 8位地址,而对XDATAXDATA区寻址要装入1616位地址,所以尽量把外部数据存储在PDATAPDATA区中。对PDATAPDATA区和XDATAXDATA区的声明举例如下:unsigned char xdata system_status=0;unsigned char xdata system_status=0;unsigned int pdata unit_id8;unsigned int pdata unit_id8;char xdata inp_str

22、ing16char xdata inp_string16;float pdata out_value;float pdata out_value;由于外部数据存储器与外部I/OI/O口是统一编址的,外部数据存储器地址段中除了包含数据存储器地址外,还包含外部I/OI/O口的地址。对外部数据存储器及外部I/OI/O口的寻址将在本章的绝对地址寻址中介绍。20第20页/共156页(5 5)程序存储区CODECODE。程序存储区CODECODE声明的标识符为codecode,储存的数据是不可改变的。在C51C51编译器中可以用存储区类型标识符codecode来访问程序存储区。声明举例如下:unsigne

23、d char code a unsigned char code a =0 x00,0 x01,0 x02,0 x03,0 x04,0 x05,0 x06,0 x07,0 x08;=0 x00,0 x01,0 x02,0 x03,0 x04,0 x05,0 x06,0 x07,0 x08;上面介绍了C51C51的数据存储类型,其大小和值域见表3-33-3。单片机访问片内RAMRAM比访问片外RAMRAM相对快一些,所以应尽量把频繁使用的变量置于片内RAMRAM。即采用datadata、bdatabdata或idataidata存储类型,而将容量较大的或使用不太频繁的那些变量21第21页/共15

24、6页置于片外RAMRAM,即采用pdatapdata或xdataxdata存储类型。常量只能采用codecode存储类型。22第22页/共156页变量存储类型定义举例:(1)chardataa1;/*字符变量字符变量a1被定义为被定义为data型,分配型,分配在在片内片内RAM低低128字节中字节中*/(2)floatidatax,y;/*浮点变量浮点变量x和和y被定义为被定义为idata型,型,定位在定位在片内片内RAM中,只能用间接寻址方中,只能用间接寻址方式寻址式寻址*/(3)bitbdatap;/*位变量位变量p被定义为被定义为bdata型,定位在片内型,定位在片内RAM中的位寻址区中

25、的位寻址区*/(4)unsignedintpdatavar1;/*无符号整型变量无符号整型变量var1被定义为被定义为pdata型型,定位在片外,定位在片外RAM中,相当于使用中,相当于使用Ri间接寻址间接寻址*/(5)unsignedcharxdataa24;/*无符号字符型二维数组无符号字符型二维数组变量变量a24被定义为被定义为xdata存储类型,定位在片外存储类型,定位在片外RAM中,占据中,占据2 4=8字节,相当于使用字节,相当于使用DPTR间接寻间接寻址址*/4 4数据存储模式如果在变量定义时略去存储类型标识符,编译器会自动默认存储类型。默认的存储类型进一步由SMALLSMALL

26、、COMPACTCOMPACT23第23页/共156页和LARGELARGE存储模式指令限制。例如,若声明char var1char var1,则在使用SMALLSMALL存储模式下,var1var1被定位在datadata存储区,在使用COMPACTCOMPACT模式下,var1var1被定位在idataidata存储区;在LARGELARGE模式下,var1var1被定位在xdataxdata存储区中。下面对存储模式作进一步说明。(1 1)SMALLSMALL模式。该模式下,所有变量都默认位于80518051单片机内部的数据存储器,与使用datadata指定存储器类型的方式一样。在此模式下

27、,变量访问的效率高,但是所有数据对象和堆栈必须使用内部RAMRAM。24第24页/共156页 (2 2)COMPACTCOMPACT模式。本模式下所有变量都默认在外部数据存储器的1 1页(256256字节)内,这与使用pdatapdata指定存储器类型是一样的。该存储器类型适用于变量不超过256256字节的情况,此限制是由寻址方式决定的,相当于使用数据指针RiRi寻址。与SMALLSMALL模式相比,该存储模式的效率比较低,对变量访问的速度也慢一些,但比LARGELARGE模式快。(3 3)LARGELARGE模式。本模式下所有变量都默认位于外部数据存储器,相当于用DPTRDPTR寻址。通过数

28、据指针访问外部数据存储器的效率较低,特别是当变量为2 2字节或更多字节时,该模式要比SMALLSMALL和COMPACTCOMPACT产生更多的代码。25第25页/共156页在固定的存储器地址上进行变量传递,是C51C51的标准特征之一。在SMALLSMALL模式下,参数传递是在片内数据存储区中完成的。LARGELARGE和COMPACTCOMPACT模式允许参数在外部存储器中传递。C51C51也支持混合模式。例如,在LARGELARGE模式下,生成的程序可将一些函数放入SMALLSMALL模式中,从而加快执行速度。3.2.2 C513.2.2 C51语言的特殊功能寄存器及位变量定义介绍C51

29、C51如何对特殊功能寄存器及位变量进行定义并访问。1 1特殊功能寄存器的C51C51定义C51C51语言允许通过使用关键字sfrsfr、sbitsbit或直接引用编译器提供的头文件来对特殊功能寄存器(SFRSFR)进行访问,第26页/共156页80518051的特殊功能寄存器分布在片内RAMRAM高128128字节中,只能采用直接寻址方式。(1 1)使用关键字定义sfrsfr。为能直接访问特殊功能寄存器SFRSFR,C51C51提供了一种定义方法,即引入关键字sfrsfr,语法如下:sfrsfr特殊功能寄存器名字=特殊功能寄存器地址;例如:sfrIE=0 xA8;/中断允许寄存器地址中断允许寄

30、存器地址A8HsfrTCON=0 x88;/定时器定时器/计数器控制寄计数器控制寄存器地址存器地址88HsfrSCON=0 x98;/串行口控制寄存器地址串行口控制寄存器地址98H在80518051中,要访问1616位SFRSFR,要用关键字sfr16sfr16。1616位SFRSFR的低字节地址须作为“sfr16sfr16”的定义地址,例如:27第27页/共156页sfr16 DPTR=0 x82sfr16 DPTR=0 x82/DPTR/DPTR 的低8 8位地址为82H82H,高8 8位地址为83H83H(2 2)通过头文件访问SFRSFR。各种衍生型的80518051单片机的特殊功能寄

31、存器的数量与类型有时是不相同的,对其访问可通过头文件的访问来进行。为用户处理方便,C51C51把80518051(或80528052单片机)常用的特殊功能寄存器和其中的可寻址位进行了定义,放在一个reg51.hreg51.h(或reg52.hreg52.h)的头文件中。当用户要使用时,只需在使用之前用一条预处理命令#include#include把这个头文件包含到程序中,就可使用特殊功能寄存器名和其中的可寻址位名称了。用户可对头文件进行增减。28第28页/共156页头文件引用举例如下:#include#include/包含包含80518051单片机的头文件单片机的头文件void main(vo

32、id)void main(void)TL0=0 xf0;TL0=0 xf0;/给给T0T0低字节低字节TL0TL0设置时间常数,已在设置时间常数,已在reg51.hreg51.h中定中定义义TH0=0 x3f;TH0=0 x3f;/给定时器给定时器T0T0高字节高字节TH0TH0设置时间常设置时间常数,已在数,已在 /reg51.h /reg51.h中定义中定义TR0=1;TR0=1;/启动定时器启动定时器0 0(3 3)特殊功能寄存器中的位定义。对SFRSFR中的可寻址位的访问,要使用关键字来定义可寻址位,共3 3种方法。第29页/共156页sbit位名位名=特殊功能寄存器特殊功能寄存器位置

33、;位置;例如:例如:sfrPSW=0 xd0;/定义定义PSW寄存器的字节寄存器的字节地址地址0 xd0sbitCY=PSW7;/定义定义CY位为位为PSW.7,地址为,地址为0 xd0sbitOV=PSW2;/定义定义OV位为位为PSW.2,地址为,地址为0 xd2sbit位名位名=字节地址字节地址位置;位置;例如:例如:sbitCY=0 xd07;/CY位地址为位地址为0 xd7sbitOV=0 xd02;/OV位地址为位地址为0 xd2sbit位名位名=位地址;位地址;将位的绝对地址赋给变量,位地址必须在将位的绝对地址赋给变量,位地址必须在0 x800 xff。例如:例如:sbitCY=

34、0 xd7;/CY位地址为位地址为0 xd7sbitOV=0 xd2;/OV位地址为位地址为0 xd230第30页/共156页【例】AT89S51AT89S51单片机片内P1P1口的各寻址位的定义如下:Sfr P1=0 x90Sfr P1=0 x90;sbit P1_7=P17;sbit P1_7=P17;sbit P1_6=P16;sbit P1_6=P16;sbit P1_5=P15;sbit P1_5=P15;sbit P1_4=P14;sbit P1_4=P14;sbit P1_3=P13;sbit P1_3=P13;sbit P1_2=P12;sbit P1_2=P12;sbit P

35、1_1=P11;sbit P1_1=P11;sbit P1_0=P10;sbit P1_0=P10;2 2位变量的C51C51定义 (1 1)由于80518051能进行位操作,C51C51扩展的“bitbit”数据类型用来定义位变量,这是与标准C C的不同之处。31第31页/共156页C51C51采用关键字“bitbit”来定义位变量,一般格式为:bitbit_name;例如:例如:bitov_flag;/将将ov_flag定义为位变量定义为位变量bitlock_pointer;/将将lock_pointer定义为位定义为位变量变量(2 2)函数可以包含类型为bitbit的参数,也可将其作为返

36、回值。C51C51程序函数可以包含类型为“bitbit”的参数,也可将其作为返回值。例如:bitfunc(bitb0,bitb1);/位变量位变量b0与与b1作为函作为函数数func的参数的参数return(b1);/位变量位变量b1作为作为return函函数的返回值数的返回值32第32页/共156页(3 3)位变量定义的限制。位变量不能用来定义指针和数组。例如:bit*ptr;/错误,不能用位变量来定错误,不能用位变量来定义指针义指针bitarray;/错误,不能用位变量来定义错误,不能用位变量来定义数组数组array 定义位变量时,允许定义存储类型,位变量都被放入一个位段,此段总是位于80

37、518051的片内RAMRAM中,因此其存储类型限制为DATADATA或IDATAIDATA,如果将位变量定义成其他类型,将会导致编译时出错。33第33页/共156页3.2.3 C513.2.3 C51语言的绝对地址访问如何对80518051片内RAMRAM、片外RAMRAM及I/OI/O空间进行访问,C51C51提供两种常用的访问绝对地址的方法。1 1绝对宏编译器提供了一组宏定义对codecode、datadata、pdatapdata和xdataxdata空间进行绝对寻址。程序中用“#include#include”来对absacc.habsacc.h中声明的宏来访问绝对地址,包括CBYT

38、ECBYTE、CWORDCWORD、DBYTEDBYTE、DWORDDWORD、XBYTEXBYTE、XWORDXWORD、PBYTEPBYTE、PWORDPWORD,具体使用参见absacc.habsacc.h头文件。其中:34第34页/共156页CBYTE以字节形式对以字节形式对code区寻址;区寻址;CWORD以字形式对以字形式对code区寻址;区寻址;DBYTE以字节形式对以字节形式对data区寻址;区寻址;DWORD以字形式对以字形式对data区寻址;区寻址;XBYTE以字节形式对以字节形式对xdata区寻址;区寻址;XWORD以字形式对以字形式对xdata区寻址;区寻址;PBYTE

39、以字节形式对以字节形式对pdata区寻址;区寻址;PWORD以字形式对以字形式对pdata区寻址。区寻址。第35页/共156页例如:#include#definePORTAXBYTE0 xFFC0/将将PORTA定义为外部定义为外部I/O口,地址为口,地址为0 xFFC0,长,长度度8位位#defineNRAMDBYTE0 x50/将将NRAM定义为片内定义为片内RAM,地址为,地址为0 x50,长度,长度8位位【例】片内RAMRAM、片外RAMRAM及I/OI/O定义的程序如下:#include#definePORTAXBYTE0 xffc0/将将PORTA定义为外部定义为外部I/O口,地址

40、为口,地址为0 xffc0#defineNRAMDBYTE0 x40/将将NRAM定义为片内定义为片内RAM,地址为,地址为0 x4036第36页/共156页main()PORTA=0 x3d;/将数据将数据3DH写入地址写入地址为为0 xffc0的外部的外部I/O端口端口PORTANRAM=0 x01;/将数据将数据01H写入片内写入片内RAM的的0 x40单元单元2 2 _at_ _at_ 关键字关键字 _at_ _at_ 可对指定的存储器空间的绝对地址访问,格式如下:存储器类型 数据类型说明符 变量名 _at_ _at_ 地址常数37第37页/共156页其中,存储器类型为C51C51能识

41、别的数据类型;数据类型为C51C51支持的数据类型;地址常数用于指定变量的绝对地址,必须位于有效的存储器空间之内;使用 _at_ _at_ 定义的变量必须为全局变量。第38页/共156页【例】使用关键字 _at_ _at_ 实现绝对地址的访问,程序如下:voidmain(void)dataunsignedchary1_at_0 x50;/在在data区定义字区定义字节变量节变量y1,/它的地址为它的地址为50Hxdataunsignedinty2_at_0 x4000;/在在xdata区定义字变区定义字变量量y2,地,地/址为址为4000Hy1=0 xff;y2=0 x1234;while(1

42、);【例】将片外RAM 2000HRAM 2000H开始的连续2020字节清0 0,程序如下:39第39页/共156页xdataunsignedcharbuffer20_at_0 x2000;voidmain(void)unsignedchari;for(i=0;i20;i+)bufferi=0如把片内RAM 40HRAM 40H单元开始的8 8个单元内容清0 0,程序如下:xdataunsignedcharbuffer8_at_0 x40;voidmain(void)40第40页/共156页unsignedcharj;for(j=0;j201020”为假,“26220)&(26)=0&1=0

43、。3 3关系运算符关系运算符是判断两个数之间的关系。说明如表3-73-7所示。44第44页/共156页45第45页/共156页4 4位运算位运算符及其说明见表3-83-8。46第46页/共156页在实际应用中,常想改变I/OI/O口中某一位的值,而不影响其他位,如果I/OI/O口可位寻址的,这个问题就很简单。但有时外扩的I/OI/O口只能进行字节操作,要想实现单独位控,就要采用位操作。【例】编写程序将扩展的某I/OI/O口PORTAPORTA(只能字节操作)的PORTA.5PORTA.5清0 0,PORTA.1PORTA.1置为1 1,程序如下:#define#define /定义片外I/OI

44、/O口变量PORTAPORTA要用该头文件#define PORTA XBYTE0 xffc0/#define PORTA XBYTE0 xffc0/定义一个片外I/OI/O口变量PORTAPORTAvoid main()void main()PORTA=(PORTA&0 xdf)0 x02;PORTA=(PORTA&0 xdf)0 x02;47第47页/共156页 程序中,第2 2行定义一个片外I/OI/O口变量PORTAPORTA,地址为片外数据存储区的0 xffc00 xffc0。在main()main()函数中,“PORTA=PORTA=(PORTA&(PORTA&0 xdf0 xdf

45、)0 x02)0 x02”的作用是先用运算符“&”将PORTA.5PORTA.5置成0 0,然后再用“0 x020 x02”运算将PORTA.1PORTA.1置为1 1。5 5指针和取地址运算符 指针是C51C51语言中一个十分重要的概念,指针变量用于存储某个变量的地址,C51C51用“*”和“&”运算符来提取变量的内容和变量的地址,见表3-93-9。48第48页/共156页提取变量的内容和变量的地址的一般形式分别为:提取变量的内容和变量的地址的一般形式分别为:目标变量目标变量=*指针变量指针变量/将指针变量所指的存储单元内容赋值给目将指针变量所指的存储单元内容赋值给目标变量标变量指针变量指针

46、变量=&目标变量目标变量/将目标变量的地址赋值给指针变量将目标变量的地址赋值给指针变量例如:例如:a=&b;/取取b变量的地址送至变量变量的地址送至变量ac=*b;/把以指针变量把以指针变量b为地址的单元内容为地址的单元内容送至变量送至变量c指针变量中只能存放地址(即指针型数据),不能将非指针类型的指针变量中只能存放地址(即指针型数据),不能将非指针类型的数据赋值给指针变量。例如:数据赋值给指针变量。例如:inti;/定义整型变量定义整型变量iint*b;/定义指向整数的指针变量定义指向整数的指针变量bb=&i;/将变量将变量i的地址赋给指针变量的地址赋给指针变量bb=i;/错,指针变量错,指

47、针变量b只能存放变量指针(变量地址),不能存只能存放变量指针(变量地址),不能存放变量放变量i的值的值49第49页/共156页3.2.5C51的分支与循环程序结构的分支与循环程序结构C51程序按结构可分为程序按结构可分为3类,即类,即顺序、分支和循环结构顺序、分支和循环结构。顺序结构是基本结构,程序自上而下,从顺序结构是基本结构,程序自上而下,从main()的函数的函数开始一直到程序结束,只有一条路可走,无其他路径可选,开始一直到程序结束,只有一条路可走,无其他路径可选,结构较简单和便于理解,这里仅介绍分支结构和循环结构。结构较简单和便于理解,这里仅介绍分支结构和循环结构。1分支控制语句分支控

48、制语句分支控制语句有:分支控制语句有:if语句语句和和switch语句语句。(1)if语句语句用来判定所给定的条件是否满足,根据判定结用来判定所给定的条件是否满足,根据判定结果决定执行两种操作之一。果决定执行两种操作之一。if语句的基本结构如下:语句的基本结构如下:if(表达式表达式)语句语句括号中的表达式成立时,程序执行大括号内的语句,否括号中的表达式成立时,程序执行大括号内的语句,否则则50第50页/共156页程序跳过大括号中的语句部分,而直接执行下面的其他语句。程序跳过大括号中的语句部分,而直接执行下面的其他语句。C51提供提供3种形式的种形式的if语句:语句:形式形式1if(表达式表达

49、式)语句语句例如:例如:if(xy)max=x;min=y;即如果即如果xy,则,则x赋给赋给max,y赋给赋给min。如果。如果xy不成立,不成立,则不执行大括号中的赋值运算。则不执行大括号中的赋值运算。形式形式2if(表达式表达式)语句语句1;else语句语句2;第51页/共156页例如:例如:if(xy)max=x;elsemin=y;本形式相当于双分支选择结构。本形式相当于双分支选择结构。形式形式3if(表达式1)语句1;else if(表达式2)语句2;else if(表达式3)语句3;else 语句n;52第52页/共156页例如:if(x100)y=1;else if(x50)y

50、=2;else if(x30)y=3;else if(x20)y=4;else y=5;本形式相当于串行多分支选择结构。在if语句中又含有一个或多个if语句,这称为if语句的嵌套。应当注意if与else的对应关系,else总是与它前面最近的一个if语句相对应。53第53页/共156页(2 2)switchswitch语句。ifif语句只有两个分支可选择,而switchswitch语句是多分支选择语句。switchswitch语句的一般形式如下:switch(表达式表达式1)case常量表达式常量表达式1:语句语句1;break;case常量表达式常量表达式2:语句语句2;break;case常

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > PPT文档

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁