第3章 单片机的C语言程序设计_第1页
第3章 单片机的C语言程序设计_第2页
第3章 单片机的C语言程序设计_第3页
第3章 单片机的C语言程序设计_第4页
第3章 单片机的C语言程序设计_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

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

文档简介

3单片机的C语言程序设计教学目的熟悉C51的程序结构掌握C51的数据类型、存储类型及函数等概念了解C51与标准C的不同之处熟悉C51的开发工具KeilC512本章内容C51的程序结构数据类型、存储类型及存储模式运算符、函数及程序流程控制C51的构造数据类型C51实例分析及混合编程KeilC51简介33.1C51的程序结构与汇编语言相比,C51在功能、结构性、可读性、可维护性及可移植性上有明显的优势。C51程序结构与一般C语言没有差别。C51的特点:

1.C51在吸取了汇编语言精华的基础上又有所改进

2.C51继承和发扬了高级语言的长处

3.C51的可移植性好

4.生成的代码质量高,在代码效率方面可以和汇编语言相媲美

C51的程序结构3.1C51的程序结构

5C51程序的结构一个C51程序大体上是一个函数定义的集合,在这个集合中仅有一个名为main的函数(主函数)。

函数定义由类型、函数名、参数表和函数体四部分组成。函数的一般格式如下:

类型函数名(参数表)

参数说明;

{

数据说明部分;

执行语句部分;

}C51的程序结构3.1C51的程序结构

6编写C51 程序时应注意以下几点:1.一个C51程序总是从main函数开始执行的,而不论main函数在整个程序中的位置如何。2.C语言程序的书写格式十分自由。一条语句可以写成一行,也可以写成几行,还可以在一行内写多条语句。但每条语句都必须以分号“;”作为结束符。3.C语言对大小字母敏感,C语言编译器编译程序时对同一个字母的大小写作为不同的变量来处理。4.可以用/*……*/对C程序中的任何部分作注释。程序加上必要的注释,可增加程序的可读性。C51的程序结构3.1C51的程序结构

73.2数据类型、存储类型及存储模式数据类型常量和变量C51的存储类型及存储模式特殊功能寄存器、并行接口及位变量的定义数据类型

可分为基本数据类型和构造数据类型。构造数据类型由基本数据类型构造而成。C51的数据类型分类如下所示:

数据类型、存储类型及存储模式3.2数据类型、存储类型及存储模式

9C51编译器能识别的数据类型数据类型长度大小unsignedchar1B0~255char1B-128~+127unsignedint2B0~65535int2B-32768~+32767unsignedlong4B0~4294967295long4B-2147483648~+2147483647float4B1.175494E-38~3.402823E+38*1B~3B对象的地址bit位0或1sfr1B0~255sfr162B0~65535sbit位0或110常量和变量

C语言中的数据有常量、变量之分。

常量——在程序运行的过程中,其值不能改变的量称为常量。C语言支持4种常量:整数常量、浮点数常量、枚举量常量、字符常量。

变量——在程序执行过程中,其值能不断变化的量。使用一个变量之前必须进行定义,用一个标识符作为变量名并指出它的数据类型和存储类型,以便编译系统为它分配相应的存储单元。

数据类型、存储类型及存储模式3.2数据类型、存储类型及存储模式

11

存储种类是指变量在程序执行过程中的作用范围。变量的存储种类有四种,分别为:自动(auto)外部(extern)静态(static)寄存器(register)C51中变量定义的格式如下:

[存储种类]数据类型[存储器类型]变量名表其中,存储种类和存储器类型是可选项。例如:staticchardatavar;12C51的存储类型及存储模式51系列单片机的存储器采用哈佛结构。即其程序存储器和数据存储器分开,并有各自的寻址机构和寻址方式。以AT89C52为例,其具体结构如图3.1所示。

数据类型、存储类型及存储模式3.2数据类型、存储类型及存储模式

13

AT89C52单片机在物理上有四个存储空间:1.片内程序存储器空间8KB2.片外程序存储器空间64KB3.片内数据存储器空间256B4.片外数据存储器空间64KBAT89C52单片机在逻辑上有三个存储空间:1.片内、片外程序存储器空间64KB2.片内数据存储器空间256B3.片外数据存储器空间64KB数据类型、存储类型及存储模式3.2数据类型、存储类型及存储模式

14C51的存储类型及存储模式

C51在定义变量、常量时,将通过不同的存储类型将它们定位在不同的存储区中。存储类型与AT89C52单片机实际存储空间的对应关系如表所列。数据类型、存储类型及存储模式3.2数据类型、存储类型及存储模式

15存储器类型描述data直接寻址的片内数据存储器低128B,访问速度最快bdata可位寻址的片内数据存储器(地址20H~2FH共16B)允许位和字节混合访问idata间接寻址片内数据存储器256B。允许访问片内全部地址pdata分页寻址片外数据存储器256B,使用指令MOVX@Rn访问,需要2个指令周期xdata寻址片外数据存储器64KB,使用指令MOVX@DPTR访问code寻址程序存储器区64KB,使用指令MOVC@A+DPTR访问16存储模式

C51编译器允许采用三种存储模式:小编译模式SMALL、紧凑编译模式COMPACT、大编译模式LARGE。

一个变量的存储器模式确定了未声明存储器类型的变量在内存中的地址空间。在SMALL模式下,该变量在80C51单片机的内部RAM中;在COMPACT和LARGE模式下,该变量在80C51单片机的外部RAM中。

建议在编写源程序时,把存储模式设定为SMALL,再在程序中把xdata、pdata和idata等类型变量进行专门声明。17特殊功能寄存器的定义

AT89C52单片机中除了程序计数器PC和4组通用寄存器组(R0R7)之外,其他所有寄存器均称为特殊功能寄存器(SFR),它们分散在片内RAM区的高128B中,它们只能采用直接寻址方式访问。

为了能直接访问这些SFR,C51扩充了类型说明符sfr、sfr16、sbit。利用它们可在C语言源程序中直接对AT89C52单片机的特殊功能寄存器进行定义。

定义方法如下:

sfr特殊功能寄存器名=地址常数

sfr16特殊功能寄存器名=地址常数例如:sfrP0=0x80;sfr16DPTR=0x82;//即DPTR低8位地址为0x82,高8位为0x83

数据类型、存储类型及存储模式3.2数据类型、存储类型及存储模式

18并行接口的定义

AT89C52单片机内部有4个8位并行口,即SFR中的P0-P3。这些内部并行口既可进行字节寻址,也可进行位寻址。

除了内部4个并行口之外,AT89C52单片机还可以在片外扩展硬件I/O口,这些I/O口大多只能进行字节寻址。

AT89C52单片机没有专用的I/O指令,它的口地址是和数据存储器统一编址的。即把一个口看作是数据存储器的一个单元。程序采用访问数据存储器的指令来访问I/O口。数据类型、存储类型及存储模式3.2数据类型、存储类型及存储模式

19位变量的定义

1.定义位变量的语法如下:

bitcheck_bit;/*将变量check_bit定义为位变量*/2.函数可包含类型为bit的参数,也可将其作为返回值。3.可位寻址对象的定义和访问(分两步)例如:bdatachartemp;//先把temp定义为char类型sbittemp3=temp^3;//再把temp3为temp的第3位数据类型、存储类型及存储模式3.2数据类型、存储类型及存储模式

203.3运算符、函数及程序流程控制C51的运算符C51的函数C51的流程控制语句C51的运算符1.C51的赋值运算符和算术运算符(+、-、*、/、%)2.C51的关系运算符(>、<、>=、<=、==、!=)3.C51逻辑运算符(||、&&、!)4.C51位操作运算符(~、|、&、︿、<<

、>>

)5.自增减运算6.复合运算符(10种)运算符、函数及程序流程控制3.3运算符、函数及程序流程控制

22C51的函数函数是C语言中的一种基本模块,一个C语言程序就是由若干个模块化的函数所构成的。

1.函数的分类从用户使用角度划分,函数分为标准库函数和用户自定义函数。用户自定义函数是指用户根据任务自己编写的函数。从函数定义的形式上可划分为三种形式:无参数函数、有参数函数和空函数。运算符、函数及程序流程控制3.3运算符、函数及程序流程控制

23C51的函数

2.函数的定义无参数函数的定义

返回值类型函数名()

{函数体语句}有参数函数的定义

返回值类型函数名(形式参数列表)

形式参数类型说明

{函数体语句}空函数的定义

返回值类型函数名()

{}运算符、函数及程序流程控制3.3运算符、函数及程序流程控制

24C51的函数

3.函数的参数和返回值形式参数和实际参数

形参:定义函数时,位于函数名后面圆括号中的变量名称为“形式参数”。

实参:调用函数时,主调用函数名后面括号中的表达式称为“实际参数”。参数的返回值

通过函数调用使主调用函数获得一个确定的值,这就是函数的返回值。函数的返回值是通过return语句获得的。运算符、函数及程序流程控制3.3运算符、函数及程序流程控制

25C51的函数

4.函数的调用调用的形式为:函数名(实际参数表列);

函数的调用方式有三种:

1.函数调用语句:即把被调用函数名作为调用函数的一个语句,如func()

2.被调用函数作为表达式的运算对象:如x=2*func(a,b)

3.被调用函数作为另一个函数的实际参数:如x=min(a,func(a,b));

运算符、函数及程序流程控制3.3运算符、函数及程序流程控制

26C51的函数

5.对被调用函数的说明

在调用一个函数之前,应对该函数的类型进行说明,即“先说明,后调用”。被调用函数必须是已经存在的函数(库函数或用户自定义函数)。6.函数变量的存储方式函数变量按其有效作用范围可划分为局部变量和全局变量。变量按其存储方式可分为四种存储种类,分别是自动变量(auto)、外部变量(extern)、静态变量(static)和寄存器变量(register),这些存储种类与变量的关系为:内部变量可定义为自动变量、静态变量或寄存器变量,外部变量可定义为全局变量或静态变量。运算符、函数及程序流程控制3.3运算符、函数及程序流程控制

27C51的流程控制语句C语言有三种基本结构:顺序结构、选择结构与循环结构。运算符、函数及程序流程控制3.3运算符、函数及程序流程控制

顺序结构流程图

28C51的流程控制语句运算符、函数及程序流程控制3.3运算符、函数及程序流程控制

选择结构流程图

其中选择结构又派生出串行多分支结构和并行多分支结构,29C51的流程控制语句运算符、函数及程序流程控制3.3运算符、函数及程序流程控制

循环结构流程图

循环结构又分为“while”型循环结构和“dowhile”型循环结构。30C51的流程控制语句1.选择语句if

C语言提供了3种形式的if语句:

(1)if(条件表达式){语句;}

(2)if(条件表达式){语句1;}

else{语句2;}

(3)if(条件表达式1){语句1;}

elseif(条件表达式2){语句2;}

elseif(条件表达式3){语句3;}

elseif(条件表达式m){语句m;}

else{语句n;}

运算符、函数及程序流程控制3.3运算符、函数及程序流程控制

31C51的流程控制语句2.switch/case语句

该语句形式如下:

switch(表达式)

{

case常量表达式1:{语句1;}break;case常量表达式2:{语句2;}break;

……

case常量表达式n:{语句n;}break;

default:{语句n+1;}

}运算符、函数及程序流程控制3.3运算符、函数及程序流程控制

32C51的流程控制语句3.循环语句while语句

一般形式为:

while(条件表达式)

{

语句;/*循环体*/

}dowhile语句

一般形式如下:

do{

语句;/*循环体*/

}

while(条件表达式);运算符、函数及程序流程控制3.3运算符、函数及程序流程控制

33C51的流程控制语句3.循环语句

for语句

一般形式如下:

for([初值设定表达式];[循环条件表达式];[更新表达式])

{

语句;/*循环体*/

}运算符、函数及程序流程控制3.3运算符、函数及程序流程控制

343.4C51的构造数据类型数组结构联合枚举指针数组一维数组一维数组的定义方式

类型说明符数组名[整型表达式]初始化intarry[10]={1,1,1,1,2,2,2,3,4,5}二维数组二维数组的定义方式

类型说明符数组名[常量表达式][常量表达式]二维数组的初始化intarry[2][2]={1,2,3,4}C51的构造数据类型3.4C51的构造数据类型36结构结构的定义结构是结构是一种数据类型,通常定义结构数据类型后再用它去定义相关变量。定义结构类型的方法如下:

struct结构名

{结构成员说明};

结构成员说明的格式为:

类型标识符成员名;用结构类型去定义变量的方法有三种:先定义结构类型再定义类型为该结构的变量定义结构类型的同时,定义该结构的变量直接定义结构类型变量结构变量的引用

引用的方式为:结构变量名.成员名

C51的构造数据类型3.4C51的构造数据类型37联合又称为共用体。它也是C语言中的一种构造数据类型。在一个联合中可以包含多个不同类型的数据元素。其定义格式为:

union联合类型名

{

类型说明符变量名;

};

联合与结构的区别在于:联合所包含的各个成员只能分时共享同一存储空间。定义联合类型变量的方法类似于定义结构变量,同样有三种。

引用联合成员的一般格式为:

联合变量名.联合元素或:联合变量名->联合元素C51的构造数据类型3.4C51的构造数据类型38枚举

枚举数据类型是一个有名字的某些整数型常量的集合。这些整数型常量是该类型变量可取的所有的合法值。枚举定义应当列出该类型变量的可取值。

定义枚举类型变量的一般格式为:

enum枚举名{枚举值表列}变量表列;enumweekday{1,2,3,4,5,6,7}x1,x2;C51的构造数据类型3.4C51的构造数据类型39指针指针是C语言的一个重要概念,也是特色之一。使用指针可以有效地表示复杂的数据结构,直接处理内存地址,而且可以更有效地使用数组。

指针的概念变量的指针就是变量的地址

指针变量的定义

指针变量定义的一般形式如下:

类型标示符*指针变量名指针变量的引用

通过举例说明。应注意的是:“*”在指针变量定义时和在指针运算时所代表的含义是不同的。C51的指针类型C51的构造数据类型3.4C51的构造数据类型40指针C51的指针类型C51编译器支持“基于存储器”的指针和“一般”指针两种类型。基于存储器的指针:在编译时一般被“行内”编码,无须库调用。即指针所指的对象所在的存储空间由定义时C源代码中的存储类型决定。该指针只占用1-2个字节。一般指针:包含3个字节。其中2个字节偏移量(即指针的地址)和1个字节存储器类型。为了表示这种指针必须用长整数来定义存储类型。C51的构造数据类型3.4C51的构造数据类型41指针基于存储器的指针该指针不但指出了指针本身的存储类型(缺省时由编译时的存储模式决定),而且还明确的指出了指针所指向的对象变量的存储类型(不能缺省)。基于存储器的指针长度短,速度快,但因为它所指的对象变量有确定的存储器空间,所以这类指针缺乏兼容性。一般指针

定义指针时若未明确指明指针所指对象变量的存储类型,则该指针为一般指针。定义一般指针的方法与标准C语言相同。C51的构造数据类型3.4C51的构造数据类型42指针

对比一般指针和基于存储器的指针,可得出以下结论:基于存储器的指针长度短,运行速度快。而一般指针由于其所指对象变量的存储器空间位置只有在运行期间才能确定,编译器在编译期间无法优化存储方式,必须生成一般代码以保证能对任意空间的对象进行存取,所以一般指针所产生的代码运行速度较慢。一般指针可用于存取任何变量而不必考虑变量在AT89

温馨提示

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

评论

0/150

提交评论