C语言编程基础图文.pptx
《C语言编程基础图文.pptx》由会员分享,可在线阅读,更多相关《C语言编程基础图文.pptx(156页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 编程 基础 图文
限制150内