单片机课件 单片机的C语言编程.ppt

上传人:asd****56 文档编号:87328620 上传时间:2023-04-16 格式:PPT 页数:92 大小:1.01MB
返回 下载 相关 举报
单片机课件 单片机的C语言编程.ppt_第1页
第1页 / 共92页
单片机课件 单片机的C语言编程.ppt_第2页
第2页 / 共92页
点击查看更多>>
资源描述

《单片机课件 单片机的C语言编程.ppt》由会员分享,可在线阅读,更多相关《单片机课件 单片机的C语言编程.ppt(92页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、第第10章章单片机的单片机的C语言编程语言编程 单片机原理、接口及应用单片机原理、接口及应用单片机原理、接口及应用单片机原理、接口及应用第第10章章单片机的单片机的C语言编程语言编程 内内 容容 提提 要要 C51程序结构程序结构C51的数据类型的数据类型数据的存贮类型和存贮模式数据的存贮类型和存贮模式C51对对SFR、可寻址位、存储器和、可寻址位、存储器和I/O口的定义口的定义C51的运算符的运算符函函数数 C语言编程实例语言编程实例 单片机资源的单片机资源的C语言编程实例语言编程实例汇编语言和汇编语言和C语言的混合编程语言的混合编程C语言函数库的管理与使用语言函数库的管理与使用小结小结 第

2、第10章章单片机的单片机的C语言编程语言编程 5151系列单片机支持三种高级语言,即系列单片机支持三种高级语言,即PL/MPL/M,C C和和BASICBASIC。80528052单片机内固化有解释单片机内固化有解释BASICBASIC语言语言 ,BASICBASIC语言适用于简单编程而对编程效率运行速度要求不高语言适用于简单编程而对编程效率运行速度要求不高的场合;的场合;PL/MPL/M是一种结构化的语言,很象是一种结构化的语言,很象PASCALPASCAL,PL/M PL/M 编译器好象汇编器一样产生紧凑的机器代码,可编译器好象汇编器一样产生紧凑的机器代码,可以说是高级汇编语言,但它不支持

3、复杂的算术运算,以说是高级汇编语言,但它不支持复杂的算术运算,无丰富库函数支持,学习无丰富库函数支持,学习PL/MPL/M无异于学习一种新的语无异于学习一种新的语言。言。C C语言是一种通用的程序设计语言,其代码率高,语言是一种通用的程序设计语言,其代码率高,数据类型及运算符丰富,并具有良好的程序结构,适数据类型及运算符丰富,并具有良好的程序结构,适用于各种应用的程序设计,是目前使用较广的单片机用于各种应用的程序设计,是目前使用较广的单片机编程语言。编程语言。第第10章章单片机的单片机的C语言编程语言编程 单片机的单片机的C C语言采用语言采用C51C51编译器编译器(简称简称C51)C51)

4、。由。由C51C51产生的目标代码短、运行速度高、所需存储空间小、产生的目标代码短、运行速度高、所需存储空间小、符合符合C C语言的语言的ANSIANSI标准,生成的代码遵循标准,生成的代码遵循IntelIntel目标文目标文件格式,而且可与件格式,而且可与A51A51汇编语言或汇编语言或PL/M51PL/M51语言目标代码语言目标代码混和使用。混和使用。第第10章章单片机的单片机的C语言编程语言编程 应用应用C51C51编程具有以下优点编程具有以下优点:(1 1)C51C51管管理理内内部部寄寄存存器器和和存存贮贮器器的的分分配配,编编程程时时,无无需考虑不同存储器的寻址和数据类型等细节问题

5、;需考虑不同存储器的寻址和数据类型等细节问题;()程程序序由由若若干干函函数数组组成成,具具有有良良好好的的模模块块化化结结构构;()有有丰丰富富的的子子程程序序库库可可直直接接引引用用,从从而而大大大大减减少少用用户户编程的工作量。编程的工作量。()()C C语言和汇编语言可以交叉使用语言和汇编语言可以交叉使用.汇编语言程序代码汇编语言程序代码短、运行速度快、但复杂运算编程耗时。如果用汇编语言短、运行速度快、但复杂运算编程耗时。如果用汇编语言编写与硬件有关的部分程序,用编写与硬件有关的部分程序,用C C语言编写与硬件无关的运语言编写与硬件无关的运算部分程序,充分发挥两种语言的长处,可以提高开

6、发效算部分程序,充分发挥两种语言的长处,可以提高开发效率。率。第第10章章单片机的单片机的C语言编程语言编程 10.1C51程序结构程序结构 同标准同标准C C一样,一样,C51C51的程序由一个个函数组成,这里的的程序由一个个函数组成,这里的函数和其他语言的函数和其他语言的“子程序子程序”或或“过程过程”具有相同的意义。具有相同的意义。其中必须有一个主函数其中必须有一个主函数main()main(),程序的执行从程序的执行从main()main()函数函数开始,调用其开始,调用其 他函数后返回主函数他函数后返回主函数main()main(),最后在主函数最后在主函数中结束整个程序而不管函数的

7、排列顺序如何。中结束整个程序而不管函数的排列顺序如何。第第10章章单片机的单片机的C语言编程语言编程 C语言程序的组成结构如下所示语言程序的组成结构如下所示:全全局局变变量量说说明明/*可可被被各各函函数数引引用用*/main()/*主函数主函数*/局局部部变变量量说说明明/*只只在在本本函函数数引引用用*/执行语句执行语句(包括函数调用语句包括函数调用语句)fun1(形式参数表形式参数表)/*函数函数1*/形式参数说明形式参数说明局部变量说明局部变量说明执执行行语语句句(包包括括调调用用其其他他函函数数语句语句)funn(形形式式参参数数表表)/*函函数数n*/形式参数说明形式参数说明局部变

8、量说明局部变量说明执行语句执行语句第第10章章单片机的单片机的C语言编程语言编程 C语言的语句规则语言的语句规则:1.每每个个变变量量必必须须先先说说明明后后引引用用,变变量量名名英英文文大大小小写写是是有有差差别别的。的。2.C语语言言程程序序一一行行可可以以书书写写多多条条语语句句,但但每每个个语语句句必必须须以以“;”结尾,一个语句也可以多行书写为好。结尾,一个语句也可以多行书写为好。3.C语言的注释用语言的注释用/*/表示。表示。4.“”花括号必须成对,位置随意,可在紧挨函数名后,也花括号必须成对,位置随意,可在紧挨函数名后,也可另起一行,多个花括号可以同行书写,也可逐行书写,为可另起

9、一行,多个花括号可以同行书写,也可逐行书写,为层次分明,增加可读性,同一层的层次分明,增加可读性,同一层的“”花括号对齐,采用花括号对齐,采用逐层缩进方式书写。逐层缩进方式书写。第第10章章单片机的单片机的C语言编程语言编程 10.2C51的数据类型的数据类型C51的数据有常量和变量之分。的数据有常量和变量之分。常常量量在在程程序序运运行行中中其其值值不不变变的的量量,可可以以为为字字符符,十十进进制制数数或或十十六进制数六进制数(用用0 x表示表示)。常常量量分分为为数数值值型型常常量量和和符符号号型型常常量量,如如果果是是符符号号型型常常量量,需需用用宏宏定定义义指指令令(#define)

10、对对其其进进行行定定义义(相相当当于于汇汇编编的的“EQU”伪指令伪指令)如:如:#definePI3.1415那么程序中只要出现那么程序中只要出现PI的地方,编译程序都译为的地方,编译程序都译为3.1415。变量变量在程序运行中其值可以改变的量。在程序运行中其值可以改变的量。一个变量由变量名和变量值构成,变量名即是存贮单元地址一个变量由变量名和变量值构成,变量名即是存贮单元地址的符号表示,而变量的值就是该单元存放的内容。定义一个变的符号表示,而变量的值就是该单元存放的内容。定义一个变量,编译系统就会自动为它安排一个存贮单元,具体的地址值量,编译系统就会自动为它安排一个存贮单元,具体的地址值用

11、户不必在意。用户不必在意。第第10章章单片机的单片机的C语言编程语言编程 10.2.1C51变量的数据类型变量的数据类型无论哪种数据都是存放在存贮单元中的,每一个数无论哪种数据都是存放在存贮单元中的,每一个数据究竟要占用几个单元据究竟要占用几个单元(即数据的长度即数据的长度)都要提供给编译都要提供给编译系统,正如汇编语言中存放数据的单元要用系统,正如汇编语言中存放数据的单元要用DB或或DW伪伪指令进行定义一样,编译系统以此为根据预留存贮单元,指令进行定义一样,编译系统以此为根据预留存贮单元,这就是定义数据类型的意义这就是定义数据类型的意义.C51编译器支持数据类型见编译器支持数据类型见表表10

12、.1。第第10章章单片机的单片机的C语言编程语言编程 表表10-1C51的数据类型的数据类型第第10章章单片机的单片机的C语言编程语言编程 对表对表10.1作如下说明:作如下说明:1.字字符符型型(char)、整整型型(int)和和长长整整型型(long)均均有有符符号号型型(signed)和和无无符符号号型型(unsigned)两两种种,如如果果不不是是必必须须,尽尽可可能能选选择择unsigned型型,这这将将会会使使编编译译器器省省却却符符号号位的检测,使生成的程序代码比位的检测,使生成的程序代码比signed类型短得多。类型短得多。2.程程序序编编译译时时,C51编编译译器器会会自自动

13、动进进行行类类型型转转换换,例例如如将将一一个个位位变变量量赋赋值值给给一一个个整整型型变变量量时时,位位型型值值自自动动转转换换为为整整型型值值;当当运运算算符符两两边边为为不不同同类类型型的的数数据据时时,编编译译器器先先将将低低级级的的数数据据类类型型转转换换为为较较高高级级的的数数据据类类型型,运运算后,运算结果为高级数据类型。算后,运算结果为高级数据类型。3.51单片机内部数据存贮器的可寻址位单片机内部数据存贮器的可寻址位(20H2FH)定定义为义为bit型,而特殊功能寄存器的可寻址位型,而特殊功能寄存器的可寻址位(即地址为即地址为X0H和和X8H的的SFR的各位的各位)只能定义为只

14、能定义为sbit类型。类型。第第10章章单片机的单片机的C语言编程语言编程 10.2.2关于指针型数据关于指针型数据(1)关于指针型变量关于指针型变量在汇编语言程序中,要取存贮单元在汇编语言程序中,要取存贮单元m的内容可用直接寻址方式,也可用寄存的内容可用直接寻址方式,也可用寄存器间接寻址方式器间接寻址方式,如果用,如果用R1寄存器指示寄存器指示m的地址,用的地址,用R1取取m单元的内容。单元的内容。相对应的在相对应的在C语言中用变量名表示取变量的值语言中用变量名表示取变量的值(相当于直接寻址相当于直接寻址),也可用,也可用另一个变量另一个变量(如如P)存放存放m的地址,的地址,P就相当于就相

15、当于R1寄存器寄存器。用。用*P取得取得m单元单元的内容的内容(相当于汇编的间接寻址方式相当于汇编的间接寻址方式)这里这里P即为指针型变量。下面表格表即为指针型变量。下面表格表示两种语言将示两种语言将m单元的内容送单元的内容送n单元的对照语句。单元的对照语句。注:注:上表省略了汇编语言程序中对符号地址上表省略了汇编语言程序中对符号地址n和和m用用EQU伪指令进行具体地伪指令进行具体地址定义的址定义的语句以及语句以及C语言对变量语言对变量n、m和指针变量和指针变量P进行类型定义的语句,实进行类型定义的语句,实际程序设计中,此步是不可际程序设计中,此步是不可缺少的。表中缺少的。表中&为取地址运算符

16、,为取地址运算符,*为取内容运算为取内容运算符。符。表表1O-2 1O-2 汇编语言和汇编语言和C语言的对照语言的对照第第10章章单片机的单片机的C语言编程语言编程 (2)指针型数据的类型指针型数据的类型由由于于C51是是结结合合51单单片片机机硬硬件件的的,51单单片片机机的的不不同同存存贮贮空空间间,有有不不同同的的地地址址范范围围,即即使使对对于于同同一一外外部部数数据据存存贮贮器器,又又有有用用Ri分分页页寻寻址址(Ri为为八八位位)和和用用DPTR寻寻址址(DPTR为为十十六六位位)两两种种寻寻址址方方式式,而而指指针针本本身身也也是是一一个个变变量量,有有它它存存放放的的存存贮贮区

17、区和和数数据据长长度度。因因此此,在在指指针针类类型型的的定定义义中中要要说说明明:被被指指的的变变量量的的数数据据类类型型和和存存贮贮类类型型;指指针针变变量量本本身身的的数数据据类类型型(占占几几个个字字节节)和和存贮类型存贮类型(即指针本身存放在什么存贮区即指针本身存放在什么存贮区)。例如类型定义为例如类型定义为data或或idata,表示指针指示内部数据存贮器;而表示指针指示内部数据存贮器;而pdata表示指针指向外部数据存贮器,用表示指针指向外部数据存贮器,用Ri间址。以上均为八位地址;而类型间址。以上均为八位地址;而类型code/xdata表示指针指向外部程序存贮器或外部数据存贮器

18、指针,本身表示指针指向外部程序存贮器或外部数据存贮器指针,本身(即即被指被指示地址示地址)应为十六位长度。如果想使指针能适用于指向任何存贮空间,应为十六位长度。如果想使指针能适用于指向任何存贮空间,则可以定义指针为通用型,此时指针长度为则可以定义指针为通用型,此时指针长度为3字节,第一字节表示存贮器字节,第一字节表示存贮器类型编码,第二、三字节分别表示所指类型编码,第二、三字节分别表示所指地址的高位和低位。第一字节表地址的高位和低位。第一字节表示的存贮器类型编码见表示的存贮器类型编码见表10-3:表表10-3通用型指针的存贮类型编码通用型指针的存贮类型编码第第10章章单片机的单片机的C语言编程

19、语言编程 10.3数据的存贮类型和存贮模式数据的存贮类型和存贮模式10.3.1数据的存贮类型数据的存贮类型 C51是面向是面向8XX51系列单片机及硬件控制系统的开发语系列单片机及硬件控制系统的开发语言,它定义的任何变量必须以一定的存贮类型的方式定位言,它定义的任何变量必须以一定的存贮类型的方式定位在在8XX51的某一存贮区中,否则便没有意义。因此在定义的某一存贮区中,否则便没有意义。因此在定义变量类型时,还必须定义它的存贮类型,变量类型时,还必须定义它的存贮类型,C51的变量的存贮的变量的存贮类型如表类型如表10-4所示:所示:第第10章章单片机的单片机的C语言编程语言编程 表表10-4C5

20、1的变量的存贮类型的变量的存贮类型 访问内部数据存贮器访问内部数据存贮器(idata)比访问外部数据存贮器比访问外部数据存贮器(xdata)相对要快一些,因此,可将经常使用的变量置于内部相对要快一些,因此,可将经常使用的变量置于内部数据存贮器中,而将较大及很少使用的数据变量置于外部数数据存贮器中,而将较大及很少使用的数据变量置于外部数据存贮器中。例如定义变量据存贮器中。例如定义变量x语句:语句:datacharx(等价于等价于chardatax)。如果用户不对变量的存贮类型定义,则编译器承认如果用户不对变量的存贮类型定义,则编译器承认默认存贮类型,默认的存贮类型由编译控制命令的存贮的模默认存贮

21、类型,默认的存贮类型由编译控制命令的存贮的模式部分决定。式部分决定。第第10章章单片机的单片机的C语言编程语言编程 10.3.2存贮器模式存贮器模式存贮器模式决定了变量的默认存贮器类型、参数传递区和无明确存贮区类存贮器模式决定了变量的默认存贮器类型、参数传递区和无明确存贮区类型的说明。型的说明。C51的存贮器模式有的存贮器模式有SMALL、LARGE和和COMPACT(见表见表10-5)。)。在固定的存贮器地址进行变量参数传递是在固定的存贮器地址进行变量参数传递是C51的一个标准特征,在的一个标准特征,在SMALL模式下参数传递是在内部数据存贮区中完成的。模式下参数传递是在内部数据存贮区中完成

22、的。LARGE和和COMPACT模式允许参数在外部存贮器中传递。模式允许参数在外部存贮器中传递。C51同时也支持混同时也支持混合模式,合模式,例如在例如在LARGE模式下生成的程序可将一些函数分页放入模式下生成的程序可将一些函数分页放入SMALL模式中从模式中从而加快执行速度。而加快执行速度。例如设例如设C语言源程序为语言源程序为PROR.C,若使程序中的变量类型和参数传递区限定若使程序中的变量类型和参数传递区限定在在外部数据存贮区外部数据存贮区,有两种方法:,有两种方法:方法方法1:用:用C51对对PROR.C进行编译时,使用命令进行编译时,使用命令C51PROR.CCOMPACT。方法方法

23、2:在程序的第一句加预处理命令:在程序的第一句加预处理命令#pragmacompact 表表10-5存贮器模式存贮器模式第第10章章单片机的单片机的C语言编程语言编程 10.3.3变量说明举例变量说明举例datacharvar;/*字符变量字符变量var定位在片内数据存贮区定位在片内数据存贮区*/charcodeMSG=PARAMETER:;/*字字符符数数组组MSG定定位位在在程程序序存存贮区贮区*/unsignedlongxdataarray100;/*无无符符号号长长型型数数组组定定位位在在片片外外RAM区,区,每元素占每元素占4bytes*/floatidatax,y,z;/*实实型型

24、变变量量x,y,z,定定位位在在片片内内用用间间址址访访问问的的内内部部RAM区区*/bitlock;/*位变量位变量Lock定位在片内定位在片内RAM可位寻址区可位寻址区*/unsignedintpdatasion;/*无无符符号号整整型型变变量量sion定定位位在在分分页页的的外外部部RAM*/unsignedcharxdatavector1044/*无无符符号号字字符符型型三三维维数数组组,定定位在片外位在片外RAM区区*/sfrP0=0 x80;/*定义定义P0口,地址为口,地址为80H*/charbdataflags;/*字字符符变变量量flags定定位位在在可可位位寻寻址址内内部部

25、RAM区区*/sbitflag0=flags0;/*定义定义flag0为为flags.0*/第第10章章单片机的单片机的C语言编程语言编程 如果在变量说明时略去存贮器类型标志符,编译器会自动选择默认的如果在变量说明时略去存贮器类型标志符,编译器会自动选择默认的存贮器类型。默认的存贮器类型由控制指令存贮器类型。默认的存贮器类型由控制指令SMALL、COMPACT和和LARGE限制。例如如果声明限制。例如如果声明charvar,则默认的存贮器模式为则默认的存贮器模式为SMALL,var放在放在data存贮区;如果使用存贮区;如果使用COMPACT模式,模式,var放入放入idata存贮区存贮区;在

26、使用在使用LARGE模式的情况下,模式的情况下,var被放入外部数据存贮区被放入外部数据存贮区(xdata存贮区存贮区)。10.3.4指针变量说明举例指针变量说明举例longxdata*px;/*指针指针px指向指向long型型xdata区区(每个数据占四个单元,每个数据占四个单元,指针自身在默认存贮器指针自身在默认存贮器(如不指定编译模式在如不指定编译模式在data区区),指针长度为,指针长度为2个字个字节节*/charxdata*datapd;/*指指针针pd指指向向字字符符型型xdata区区,自自身身在在data区区,长长度度2字字节节*/datacharxdata*pd;/*与上例等效

27、与上例等效*/dataint*pn;(和和int*datapn及及intr*pn等等效效)/*定定义义一一个个类类型型为为int型型的的通通用型指针,用型指针,指针自身在指针自身在data区长度为区长度为3字节字节*/第第10章章单片机的单片机的C语言编程语言编程 在上例的指针声明中包含如下几个内容:在上例的指针声明中包含如下几个内容:1)1)指针变量名指针变量名(如如px)前面冠以前面冠以“*”,表示表示px为指针型变量,此处为指针型变量,此处*不不带取内容之意。带取内容之意。2)指针指向的存贮类型,即指向哪个存贮区,它决定了指针本身的长度指针指向的存贮类型,即指向哪个存贮区,它决定了指针本

28、身的长度(见表见表10.1)。存贮类型声明的位置在数据类型和指针名。存贮类型声明的位置在数据类型和指针名(如如*px)之间,如之间,如无次项声明,则此指针型变量为通用型。无次项声明,则此指针型变量为通用型。3)3)指针指向的存贮区的数据类型,即被指向的存贮区以多少个单元作指针指向的存贮区的数据类型,即被指向的存贮区以多少个单元作一个数据单位,当程序通过指针对该区操作时,将按此规定的单元个数一个数据单位,当程序通过指针对该区操作时,将按此规定的单元个数的内容作为一个数据操作。的内容作为一个数据操作。4)指针变量自身的存贮类型,即指针处于什么区与自身的长度无关,该指针变量自身的存贮类型,即指针处于

29、什么区与自身的长度无关,该声明可位于声明语句的开头,也可在声明可位于声明语句的开头,也可在“*”和变量名之间。此项由编译和变量名之间。此项由编译模式放在默认区,如无规定编译模式,通常在模式放在默认区,如无规定编译模式,通常在data区。区。第第10章章单片机的单片机的C语言编程语言编程 10.4C51对对SFR、可寻址位、存储器和可寻址位、存储器和I/O口的定义口的定义10.4.1特殊功能寄存器特殊功能寄存器SFR定义定义 C51提供了一种自主形式的定义方式,使用特定关键字提供了一种自主形式的定义方式,使用特定关键字sfr如如sfrSCON=0 x98;/*串行通信控制寄存器地址串行通信控制寄

30、存器地址98H*/sfrTMOD=0 x89;/*定时器模式控制寄存器地址定时器模式控制寄存器地址89H*/sfrACC=0 xe0;/*A累加器地址累加器地址E0H*/sfrP1=0 x90;/*P1端口地址端口地址90H*/定义了以后,程序中就可以直接引用寄存器名。定义了以后,程序中就可以直接引用寄存器名。C51也建立了一个头文件也建立了一个头文件reg51.h(增强型为增强型为reg52.h),在该在该文件中对所有的特殊功能寄存器的进行了文件中对所有的特殊功能寄存器的进行了sfr定义,定义,对特殊对特殊功能寄存器的有位名称的可寻址位进行了功能寄存器的有位名称的可寻址位进行了sbit定义,

31、因此,定义,因此,只要用包含语句只要用包含语句#include,就可以直接引用特殊就可以直接引用特殊功能寄存器名,或直接引用位名称。功能寄存器名,或直接引用位名称。要特别注意要特别注意:在引用:在引用时特殊功能寄存器或者位名称必须大写。时特殊功能寄存器或者位名称必须大写。第第10章章单片机的单片机的C语言编程语言编程 10.4.2 10.4.2 对位变量的定义对位变量的定义C51对位变量的定义有三种方法:对位变量的定义有三种方法:1.将变量用将变量用bit类型的定义符定义为类型的定义符定义为bit类型类型:如如bitmn;mn为为位位变变量量,其其值值只只能能是是“0”或或“1”,其其位位地地

32、址址C51自自行行安排在可位寻址区的安排在可位寻址区的bdata区。区。2.采用字节寻址变量采用字节寻址变量.位的方法位的方法:如如bdataintibase;/*ibase定义为整型变量定义为整型变量*/sbitmybit=ibase15;/*mybit定义为定义为ibase的的D15位位*/这里位是运算符这里位是运算符“”相当于汇编中的相当于汇编中的“”,其后的最,其后的最大取值依赖于该位所在的字节寻址变量的定义类型,如定义大取值依赖于该位所在的字节寻址变量的定义类型,如定义为为char最大值只能为最大值只能为7。第第10章章单片机的单片机的C语言编程语言编程 3.对特殊功能寄存器的位的定

33、义对特殊功能寄存器的位的定义方法方法1:使用头文件及:使用头文件及sbit定义符;多用于无位名的可寻址位。定义符;多用于无位名的可寻址位。例如例如#includesbitP1-1=P11;/*P1-1为为P1口的第口的第1位位*/sbitac=ACC7;/*ac定义为累加器定义为累加器A的第的第7位位*/方法方法2:使用头文件:使用头文件reg51.h,再直接用位名称。再直接用位名称。例如例如#includeRS1=1;RS0=0;方法方法3:用字节地址位表示:用字节地址位表示例如例如sbitOV=0 xD02;方法方法4:用寄存器名:用寄存器名.位定义位定义例如例如sfrPSW=0 xd0;

34、/*定义定义PSW地址为地址为d0H*/sbitCY=PSW7;/*CY为为PSW7*/第第10章章单片机的单片机的C语言编程语言编程 10.4.3C51对存贮器和外接对存贮器和外接I/O口的绝对地址访问口的绝对地址访问1.对存贮器的绝对地址访问对存贮器的绝对地址访问利用绝对地址访问的头文件利用绝对地址访问的头文件absacc.h可对不同的存贮区进行访问。可对不同的存贮区进行访问。该头文件的函数有:该头文件的函数有:CBYTE(访问访问code区字符型区字符型)DBYTE(访问访问data区字符型区字符型)PBYTE(访问访问pdata或或I/O区字符型区字符型)XBYTE(访问访问xdata

35、或或I/O区字符型区字符型)还有还有CWORD、DWORD、PWORD和和XWORD四个函数,它四个函数,它们的访问区域同上,只是访问的类型为们的访问区域同上,只是访问的类型为int型。型。例例10-110-1#include#include#define com XBYTE#define com XBYTE0 x07ff0 x07ff 那么后面程序那么后面程序comcom变量出现的地方,就是对地址为变量出现的地方,就是对地址为07ffH07ffH的外部的外部RAMRAM或或I/OI/O口进行访问。口进行访问。第第10章章单片机的单片机的C语言编程语言编程 例例10-2XWORD0=0 x99

36、88;即将即将9988H(int类型类型)送入外部送入外部RAM的的0号和号和1号单元。号单元。使用中要注意使用中要注意:absacc.h一定要包含进程序,一定要包含进程序,XBYTE必须大写。必须大写。2.对外部对外部I/O口的访问口的访问由于单片机的由于单片机的I/O口和外部口和外部RAM统一编址,因此对统一编址,因此对I/O口口地址的访问可用地址的访问可用XBYTE(MOVXDPTR)或或PBYTE(MOVXRi)进行。进行。例例10-3XBYTE0Xefff=0 x10;将将10H输出到地址为输出到地址为EFFFH端口端口 第第10章章单片机的单片机的C语言编程语言编程 10.5C51

37、的运算符的运算符1赋值运算符:赋值运算符:将将“”的右边的值赋值给左边的变量的右边的值赋值给左边的变量.2.C51的算术运算符的算术运算符:(加加或或正正号号);(减减或或负负号号);*(乘乘号号);/(除除号号);%(求求余余)优先级为:先乘除,后加减,先括号内,再括号外优先级为:先乘除,后加减,先括号内,再括号外3.C51的关系运算符有六种:的关系运算符有六种:(小小于于);(大大于于);=(小小于于等等于于);=(大大于于等等于于);=(相等相等);!=(不相等不相等)优先级:前四个高,后二个优先级:前四个高,后二个“=”和和“!=”级别低。级别低。第第10章章单片机的单片机的C语言编程

38、语言编程 4C51的逻辑运算符有三种的逻辑运算符有三种:&(逻辑与逻辑与);|(逻辑或逻辑或);!(逻辑非逻辑非);逻逻辑辑表表达达式式和和关关系系表表达达式式的的值值相相同同,以以0代代表表假假,以以1代代表表真。真。以上三种运算的优先级见图以上三种运算的优先级见图10.1。5C51的按位操作的运算符有六种:的按位操作的运算符有六种:&(按位与按位与);(按位或按位或);(按位异或按位异或);(位取反位取反);(位右移位右移)(注:补零移位注:补零移位)例例1.a=0 xf0H;表达式表达式a=a值为值为0FH例例2.a=0 xea;表达式表达式a2值为值为A8H,即,即a值左移两位,值左移

39、两位,移位后空白位补移位后空白位补0。6.自增、自减运算符自增、自减运算符:+i,-i(在使用在使用i之前,先使之前,先使i值加值加1,减减1)i+,i-(在使用在使用i之后,再使之后,再使i值加值加1.,减减1)例设例设i原值为原值为5j=+i则则j值为值为6,i值也为值也为6j=i+则则j值为值为5,i值为值为6|非算术运算关系运算&和|=赋值运算图图10-1运算符的优先级运算符的优先级第第10章章单片机的单片机的C语言编程语言编程 7复合赋值运算符复合赋值运算符:+=;=;*=;/=;%=;=;&=;=;|=。例:例:a+=b相当于相当于a=a+b。a=7.相当于相当于a=a7.。8.对

40、指针操作的运算符对指针操作的运算符:&取地址运算取地址运算*间址运算符间址运算符例例a=&b;取;取b变量的地址送变量变量的地址送变量ac=*b;将以将以b的内容为地址的单元的内容送的内容为地址的单元的内容送c这里要注意:这里要注意:“&”与与按按位位与与运运算算符符的的差差别别,如如果果“&”为为“与与”,&的的两两边边必必须为变量或常量;须为变量或常量;“*”与与指指针针定定义义时时指指针针前前的的“*”的的差差别别。如如char*pt,这这里里的的“*”只表示只表示pt为指针变量,为指针变量,不代表间址取内容的运算。不代表间址取内容的运算。第第10章章单片机的单片机的C语言编程语言编程

41、10.6 10.6 函函 数数C C语言程序由函数组成,下面介绍函数的要点。语言程序由函数组成,下面介绍函数的要点。10.6.1 10.6.1 函数的分类及定义函数的分类及定义 从用户使用角度划分,函数分为从用户使用角度划分,函数分为库函数库函数和和用户自定义函数用户自定义函数。库函数库函数是编译系统为用户设计的一系列标准函数是编译系统为用户设计的一系列标准函数(见本书见本书附录二附录二),用户只需调用,而无需自己去编写这些复杂的函数,用户只需调用,而无需自己去编写这些复杂的函数,如前面所用到的头文件如前面所用到的头文件reg51.hreg51.h、absacc.habsacc.h等,有的头文

42、件中等,有的头文件中包括一系列函数,要使用其中的函数必须先使用包括一系列函数,要使用其中的函数必须先使用#include#include包包含语句,然后才能调用。含语句,然后才能调用。用户自定义函数用户自定义函数是用户根据任务编写的函数是用户根据任务编写的函数从参数形式上函数分为从参数形式上函数分为无参函数无参函数和和有参函数有参函数。有参函数有参函数即是在在调用时,调用函数用实际参数代替形即是在在调用时,调用函数用实际参数代替形式参数,调用完返回结果给调用函数。式参数,调用完返回结果给调用函数。第第10章章单片机的单片机的C语言编程语言编程 10.6.2 10.6.2 函数的定义函数的定义函

43、数以函数以“”开始,以开始,以“”结束。结束。无参函数的定义:无参函数的定义:返回值类型返回值类型 函数名函数名()()函数体语句函数体语句 如果函数没有返回值,可以将返回值类型设为如果函数没有返回值,可以将返回值类型设为voidvoid。有参函数的定义:有参函数的定义:返回值类型返回值类型 函数名函数名(形式参数表列形式参数表列)形式参数类型说明形式参数类型说明 函数体语句函数体语句return(return(返回形参名返回形参名)也可以这样定义也可以这样定义返回值类型返回值类型 函数名函数名(类型说明类型说明 形式参数表列形式参数表列)函数体语句函数体语句 return(return(返回

44、参形名返回参形名)其中形式参数表列的各项要用其中形式参数表列的各项要用“,”隔开,通过隔开,通过returnreturn语句将需返回的值返语句将需返回的值返回给调用函数回给调用函数。第第10章章单片机的单片机的C语言编程语言编程 10.6.3 10.6.3 函数的调用函数的调用函数调用的形式为:函数名函数调用的形式为:函数名(实际参数表列实际参数表列);实实参参和和形形参参的的数数目目相相等等类类型型一一致致,对对于于无无参参函函数数当当然然不不存存在在实际参数表列。实际参数表列。函数的调用方式有三种函数的调用方式有三种:函函数数调调用用语语句句:即即把把被被调调函函数数名名作作为为调调用用函

45、函数数的的一一个个语语句句;如如fun1()fun1()。被调函数作为表达式的运算对象被调函数作为表达式的运算对象,如如 result=2*get(a,b)result=2*get(a,b)此时此时getget函数中的函数中的a,ba,b应为实参,其以返回值参予式中的运算。应为实参,其以返回值参予式中的运算。被调函数作为另一个数的实际参数被调函数作为另一个数的实际参数 如如 m=max(a,get(a,b)m=max(a,get(a,b);函函数数get(a,b)get(a,b)作作为为函函数数max()max()的的一一个个实际参数。实际参数。第第10章章单片机的单片机的C语言编程语言编程

46、10.6.410.6.4对被调函数的说明对被调函数的说明 如如果果被被调调函函数数出出现现在在主主调调函函数数之之后后,在在主主调调函函数数前前应应对对被被调调函函数数作作以以说说明明,形式为:形式为:返回值类型返回值类型 被调函数名被调函数名(形参表列形参表列);如如果果被被调调函函数数出出现现在在主主调调函函数数之之前前,可可以以不不对对被被调调函函数数说说明明。下下面面以以一一个个简单例子来说明简单例子来说明intint fun1(a,b)fun1(a,b)intint a,b;a,b;intint c;c;c=a+b;c=a+b;return(c);return(c);main()ma

47、in()intint d,0u=3,v=2;d,0u=3,v=2;d=2*fun(u,v);d=2*fun(u,v);上例被调函数在主调函数前,不用说明。上例被调函数在主调函数前,不用说明。第第10章章单片机的单片机的C语言编程语言编程 intint fun1(a,b);fun1(a,b);main()main()intint d,u=3,v=2;d,u=3,v=2;d=2*fun1(u,v)d=2*fun1(u,v);intint fun1(a,b)fun1(a,b);intint a,b;a,b;intint c c;c=a+b;c=a+b;return(c);return(c);上例中被

48、调函数在主调函数后上例中被调函数在主调函数后,在前面对被调函数进行说明。在前面对被调函数进行说明。第第10章章单片机的单片机的C语言编程语言编程 10.7 C10.7 C语言编程实例语言编程实例为为了了使使C C语语言言的的编编程程方方法法和和汇汇编编语语言言的的编编程程方方法法有有一一个个对比,本节采用对比,本节采用3.13.1节的例题。节的例题。由由于于C51C51编编译译器器是是针针对对单单片片机机的的,因因此此ANSI ANSI C C中中的的scanfscanf和和printfprintf等等对对PCPC电电脑脑的的键键盘盘和和监监视视器器的的输输入入、输输出出语语句句无无效效。运运

49、算算的的数数据据可可以以通通过过变变量量置置入入或或取取出出,这这时时C51C51会会自自动动安安排排使使用用的的存存贮贮单单元元。当当然然也也可可以以用用户户自自行行通通过过具具体体的的内内存存地地址址置置入入数数据据或或从从特特定定地地址址取取出出数数据据,这这就就少少不不了了要要会会观观察察具具体体地地址址的的内内容容或或改改变变该该地地址址的的内内容容,C C语语言言的的编编程程上上机机调调试试见见本教材的实验部分。本教材的实验部分。下面通过一个例子说明下面通过一个例子说明C C语言程序编译后生成的机器代语言程序编译后生成的机器代码及对应的反汇编程序,从中引出一码及对应的反汇编程序,从

50、中引出一 些道理。些道理。第第10章章单片机的单片机的C语言编程语言编程 10.7.1 10.7.1 顺序程序的设计顺序程序的设计例例10105 5 完成完成19805245031980524503的编程的编程分分析析:两两个个乘乘数数比比较较大大,其其积积更更大大,采采用用unsigned unsigned longlong类类型型,设设乘乘积积存存放放在外部数据存贮器在外部数据存贮器0 0号开始的单元。程序如下:号开始的单元。程序如下:main()main()unsigned unsigned long long xdataxdata *p;*p;/*/*设设定定指指针针p p指指向向类类

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

当前位置:首页 > 技术资料 > 其他杂项

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

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com