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

下载本文档

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

文档简介

1、单片机第五章:C语言程序设计分解单片机-第五章:C语言程序设计分解5.1 C语言与语言与MCS-51 C C语言是一种通用的计算机程序设计语言,代码语言是一种通用的计算机程序设计语言,代码效率高,数据类型和运算符丰富,有良好的程序结效率高,数据类型和运算符丰富,有良好的程序结构,适用于各种应用系统的程序设计,是目前使用构,适用于各种应用系统的程序设计,是目前使用较广的单片机编程语言。较广的单片机编程语言。 本章重点介绍在单片机上使用本章重点介绍在单片机上使用MCS-51 CMCS-51 C语言的语言的特殊数据类型、存储模式、程序的结构、混合编特殊数据类型、存储模式、程序的结构、混合编程。程。5

2、.1.1 C语言程序开发过程语言程序开发过程 一般的一般的C C语言开发套件中,包括编译器、连接器和符号转语言开发套件中,包括编译器、连接器和符号转换程序。换程序。 编译器将源程序翻译为可重定位的目标代码文件编译器将源程序翻译为可重定位的目标代码文件( (也可产生也可产生等价的汇编语言程序等价的汇编语言程序) );连接器将目标代码文件连接为绝对;连接器将目标代码文件连接为绝对目标文件;符号转换程序可将绝对目标文件转换为目标文件;符号转换程序可将绝对目标文件转换为Intel Intel HEXHEX格式文件,编程到程序存储器中运行。格式文件,编程到程序存储器中运行。 若使用提供了集成开发环境若使

3、用提供了集成开发环境(Integrated Development (Integrated Development EnvironmentEnvironment,IDE)IDE)的套件,则编辑、编译、连接、符号的套件,则编辑、编译、连接、符号转换、甚至调试可在一个窗口中完成。如转换、甚至调试可在一个窗口中完成。如American American AutomationAutomation、AuocetAuocet、BSO/TASKINGBSO/TASKING、DUNFIELD DUNFIELD SHAREWARESHAREWARE、KEIL/FranklinKEIL/Franklin等。等。5

4、.1.2 C语言的特点语言的特点 C C语言是一种模块化、结构化程序设计语言,符合语言是一种模块化、结构化程序设计语言,符合ANSI ANSI C C标准,可以产生紧凑的目标码,具体优点:标准,可以产生紧凑的目标码,具体优点:(1) (1) 不必详细了解单片机的指令系统不必详细了解单片机的指令系统(2) (2) 仅要求对仅要求对MCS-51MCS-51存储器结构有初步了解存储器结构有初步了解(3) (3) 寄存器分配、不同存储器区域的寻址及数据类型等寄存器分配、不同存储器区域的寻址及数据类型等细节由编译程序管理细节由编译程序管理(4) (4) 程序具有规范的结构和固有的模块化思想程序具有规范的

5、结构和固有的模块化思想(5) (5) 运算符和关键字用接近于自然语言的方式表示运算符和关键字用接近于自然语言的方式表示(6) (6) 提供包含大量标准子程序的函数库,具有较强的数提供包含大量标准子程序的函数库,具有较强的数据处理能力据处理能力(7) (7) 在对执行效率要求较高的场合,可以嵌入汇编,也可在对执行效率要求较高的场合,可以嵌入汇编,也可以与汇编语言协同开发以与汇编语言协同开发5.1.3 单片机单片机C语言的移植语言的移植 C C语言在单片机中的应用移植面临的具体问题:语言在单片机中的应用移植面临的具体问题: (1) MCS-51 (1) MCS-51存储器的哈佛结构,加上内部有位寻

6、址空存储器的哈佛结构,加上内部有位寻址空间,对存储器变量的使用提出了挑战。间,对存储器变量的使用提出了挑战。 (2) (2) 内部的数据存储器和程序存储器空间相对太小,而外内部的数据存储器和程序存储器空间相对太小,而外部还可扩展存储容量,编译程序如何根据实际情况合理使用部还可扩展存储容量,编译程序如何根据实际情况合理使用这些空间这些空间 (3) (3) 内部各功能单元采用特殊功能寄存器集中管理,在内部各功能单元采用特殊功能寄存器集中管理,在C C语语言中如何实现寄存器访问言中如何实现寄存器访问 (4) MCS-51 (4) MCS-51单片机派生种类繁多,硬件配置不统一,单片机派生种类繁多,硬

7、件配置不统一,但是要求必须能够使用但是要求必须能够使用C C语言操控所有硬件资源语言操控所有硬件资源 (5) MCS-51 (5) MCS-51内部只有一个堆栈,且存储空间有限,传统的内部只有一个堆栈,且存储空间有限,传统的利用堆栈传递参数的方法难以奏效利用堆栈传递参数的方法难以奏效5.2 单片机单片机C语言的扩充语言的扩充 MCS-51 MCS-51单片机有着与通用单片机有着与通用CPUCPU截然不同的体系结构截然不同的体系结构、硬件资源和运算特性、硬件资源和运算特性 针对单片机独有的一些功能特点,绝大多数的针对单片机独有的一些功能特点,绝大多数的MCS-51MCS-51的的C C语言编译程

8、序对标准语言编译程序对标准C C语言进行了一些扩语言进行了一些扩充充 C语言运算符语言运算符算术运算符:算术运算符: +, -, +, -, * *, /, % , /, % 关系运算符:关系运算符: , =, , =, =, =, != 逻辑运算符:逻辑运算符: !, &, | !, &, | 赋值运算符:赋值运算符: * *=、/=、%=、+=、-=、=、&=、=、= 、+、- ( (位移动、异或、位或位移动、异或、位或) )强制运算符强制运算符强制转换表达式中的类型转换算术表达式中的运算转换赋值转换 输出转换 函数调用转换 C语言运算符语言运算符intintunsigned intuns

9、igned intlong intlong intdoubledoublefloatfloatchar, shortchar, short存储长度较短存储长度较短存储长度较长存储长度较长总趋势:总趋势:算术表达式中的类型转换算术表达式中的类型转换转换规则转换规则5.2.2 数据类型数据类型数据类型数据类型位数位数字节数字节数范围范围bitbit1 1 0 01 1signed charsigned char8 81 1-128-128+127+127unsigned charunsigned char8 81 10 0255255enumenum枚举变量枚举变量 8/168/161/21/2-

10、128-128+127 +127 或或 -32768-32768+32767+32767signed shortsigned short16162 2-32768-32768+32767+32767unsigned shortunsigned short16162 20 06553565535signedsigned intint16162 2-32768-32768+32767+32767unsignedunsigned intint16162 20 06553565535signedsigned longlong32324 4-2147483648-2147483648+21473647+

11、21473647unsigned longunsigned long32324 40 042949672954294967295float/doublefloat/double32/6432/644/84/8 1.175494E-381.175494E-38 3.402823E+383.402823E+38sbitsbit1 1 0 01 1sfrsfr8 81 10 0255255sfr16sfr1616162 20 065535655355.2.2 数据类型数据类型例:例:unsignedunsignedcharcharin_data;in_data;8 8位位unsigned longu

12、nsigned longlog_time;32log_time;32位位bitbitok_flag;ok_flag;1 1位位5.2.3 存储器类型存储器类型存储器类存储器类型型与硬件存储器空间的对应关系与硬件存储器空间的对应关系codecode程序存储器;使用程序存储器;使用MOVC A+DPTRMOVC A+DPTR指令访问指令访问datadata直接寻址的内部数据存储器;访问速度最快直接寻址的内部数据存储器;访问速度最快(128(128字节字节) )idataidata间接访问的内部数据存储器;可以访问所有的内间接访问的内部数据存储器;可以访问所有的内部存储器空间部存储器空间(256(2

13、56字节字节) )bdatabdata可位寻址的内部数据存储器;可以字节方式也可可位寻址的内部数据存储器;可以字节方式也可以位方式访问以位方式访问(16字节字节)xdataxdata外部数据存储器外部数据存储器(64KB),通过,通过MOVX DPTR指指令访问令访问pdatapdata外部数据存储器的一页外部数据存储器的一页(256字节字节),使用,使用MOVX Ri指令访问指令访问5.2.3 存储器类型存储器类型例例 指出以下变量的存储位置指出以下变量的存储位置char datachar datavar1var1; ;char codechar codetexttext = ENTER P

14、ARAMETER; = ENTER PARAMETER;unsigned long xdataunsigned long xdataarray100;array100;float idatafloat idatax, y, zx, y, z; ;unsigned int pdataunsigned int pdatadimensiondimension; ;unsigned char xdataunsigned char xdatavector1044;vector1044;char bdatachar bdata flagsflags; ;5.2.4 存储模式存储模式模式:模式: 所有的变量

15、默认存放于内部所有的变量默认存放于内部RAMRAM中,相当于定义时中,相当于定义时使用了使用了datadata类型类型 所有对象所有对象( (包括堆栈包括堆栈) )必须能够存入内部必须能够存入内部RAMRAM的的128128字节字节5.2.4 存储模式存储模式模式:模式: 所有变量默认存放于外部所有变量默认存放于外部RAMRAM的一页中,相当于定的一页中,相当于定义时使用了义时使用了pdatapdata类型类型 这种存储模式可以满足最多这种存储模式可以满足最多256256字节的变量字节的变量 对变量的访问必须使用间接寻址方式对变量的访问必须使用间接寻址方式 编译程序产生的机器码使用编译程序产生

16、的机器码使用R0R0和和R1R1作为变量的指作为变量的指令操作数令操作数5.2.4 存储模式存储模式模式:模式: 所有变量默认存放于外部所有变量默认存放于外部RAMRAM中,最多可以有中,最多可以有64KB64KB,相当于定义时使用了,相当于定义时使用了xdataxdata类型类型 数据指针数据指针DPTRDPTR用来寻址变量用来寻址变量 这种访问方式效率不高,特别是当变量长度超过这种访问方式效率不高,特别是当变量长度超过一个字节时一个字节时5.2.4 存储模式存储模式 现在常用的现在常用的C C编译程序通常允许使用混合模式编译程序通常允许使用混合模式 不管存储模式如何,把经常使用的变量强制存

17、放于不管存储模式如何,把经常使用的变量强制存放于内部内部RAMRAM。大块数据则存放于外部。大块数据则存放于外部RAMRAM,而将其指针,而将其指针存放于内部存放于内部RAMRAM中,可以使用存储器类型说明符指定中,可以使用存储器类型说明符指定5.2.5 硬件资源访问硬件资源访问1.1.特殊功能寄存器:特殊功能寄存器: 使用使用sfrsfr、sfr16sfr16和和sbitsbit数据类型访问特殊功能寄数据类型访问特殊功能寄存器存器 特殊功能寄存器中的位特殊功能寄存器中的位 使用使用sbitsbit类型可以定义可位寻址类型可以定义可位寻址SFRSFR中的位中的位 sfr sfrP0 = 0 x

18、80;P0 = 0 x80;地址地址 sfr sfrACC = 0 xE0;ACC = 0 xE0;实际地址实际地址 sbit sbitCY = 0 xD7;CY = 0 xD7;位地址位地址5.2.5 硬件资源访问硬件资源访问2.2.内部内部RAMRAM中的位寻址资源中的位寻址资源 定义一个变量时若指定了定义一个变量时若指定了bdatabdata存储器类型,存储器类型,C C编编译程序会在内部译程序会在内部RAMRAM的位寻址区为其分配存储空间的位寻址区为其分配存储空间 这个变量中的位也可以单独访问,但必须先行定这个变量中的位也可以单独访问,但必须先行定义义 unsigned char bd

19、ataunsigned char bdatadata8;data8;位寻址区变量位寻址区变量 sbit sbitlsb = data80lsb = data80;data8;data8的最低位的最低位5.2.5 硬件资源访问硬件资源访问3.3.指定绝对地址的变量指定绝对地址的变量 使用使用_at_at_满足这一要求,其格式如下。满足这一要求,其格式如下。 存储器类型存储器类型 变量类型变量类型 变量名变量名 _at_ _at_ 地址常地址常数数; ; xdata xdataunsigned char buff _at_ 0 x202X;unsigned char buff _at_ 0 x20

20、2X;5.2.5 硬件资源访问硬件资源访问4.4.存储器绝对地址的访问存储器绝对地址的访问 中包含了一些宏定义,使用这些宏可以显示使用存储器中包含了一些宏定义,使用这些宏可以显示使用存储器绝对地址,如绝对地址,如#define#defineCBYTECBYTE(unsigned char volatile (unsigned char volatile code code * *) 0) 0) CBYTE CBYTE代表程序存储器地址代表程序存储器地址0000H0000H的字节单元的字节单元 把每个存储区定义成一个字节或字数组,对指定地址的把每个存储区定义成一个字节或字数组,对指定地址的访问使

21、用数组元素引用的形式访问使用数组元素引用的形式5.2.6 指针指针1.1.基于存储器的指针基于存储器的指针 与源程序中存储器类型有关,编译时即可确定其与源程序中存储器类型有关,编译时即可确定其长度。这种指针的长度可以为长度。这种指针的长度可以为1 1个字节个字节(data (data * *、idata idata * *、pdata pdata * *) )或或2 2个字节个字节(code (code * *、xdata xdata * *) ) char chardatadata * *str;str;指向指向datadata字符的指针字符的指针 intintxdata xdata * *

22、numnum; 指向整形数据指向整形数据 longlongcodecode * *pow; pow; 指向长整形代码指向长整形代码5.2.6 指针指针 char chardatadata * *str;str;指向指向datadata字符的指针字符的指针 intintxdata xdata * *numnum; 指向整形数据指向整形数据 longlongcodecode * *pow; pow; 指向长整形代码指向长整形代码 上述三个指针变量长度分别为上述三个指针变量长度分别为1 1、2 2、2 2字节。指字节。指针变量自身所占用的存储位置还能定义针变量自身所占用的存储位置还能定义 charc

23、hardatadata * *xdataxdatastr;str; intintxdata xdata * *datadatanumnum; longlongcodecode * *idataidatapow; pow; 5.2.6 指针指针2.2.通用指针通用指针 与标准与标准C C语言指针的定义相同语言指针的定义相同 使用使用3 3个字节存储指针内容个字节存储指针内容( (地址值地址值) )。第一个字。第一个字节存放存储器类型,第二和第三节分别存放该指针节存放存储器类型,第二和第三节分别存放该指针所指对象地址的高字节和低字节所指对象地址的高字节和低字节5.2.6 指针指针2.2.通用指针通

24、用指针 一般指针包括一般指针包括3 3个字节:个字节:1 1个字节存储类型和个字节存储类型和2 2个字节偏移个字节偏移地址,即地址,即地址地址+0+1+2内容内容存储器类型存储器类型偏移地址高偏移地址高位字节位字节偏移地址低偏移地址低位字节位字节 其中,第一字节代表了指针的存储器类型,存储器类型其中,第一字节代表了指针的存储器类型,存储器类型编码如下:编码如下:存储器存储器类型类型idataxdatapdatadatacode值值123455.2.6 指针指针 char char* *strstr; ;指向字符的指针指向字符的指针 intint* *numnum; ;指向整形数据的指针指向整形

25、数据的指针 第第1 1字节放存储器类型,字节放存储器类型,2 2、3 3字节放该指针所指对字节放该指针所指对象地址的高、低字节。象地址的高、低字节。 xdata xdataintintx x ;x ;x位于外部位于外部RAMRAM中中 int int* *data data pxpx, , * *data data pypy; ; px = &x px = &x ; ;赋值语句,赋值语句,pxpx指向指向x x py = 0 x021234 ; py py = 0 x021234 ; py指向外部指向外部RAMRAM的的1234H1234H单元单元 * *px = 1000px = 1000

26、; ;单元内容赋值单元内容赋值10001000 * *py = -1py = -1 ; ;单元内容赋值单元内容赋值FFFFHFFFFH5.3 C语言程序结构语言程序结构 单片机单片机C C语言程序与标准语言程序与标准C C程序一样,具有固有的程序一样,具有固有的模块化思想模块化思想 各种功能由函数实现各种功能由函数实现 整体上就是一个函数逐级调用的树状结构整体上就是一个函数逐级调用的树状结构 程序的入口为程序的入口为mainmain函数,在每个函数内部可以使函数,在每个函数内部可以使用结构化程序设计技术的三种结构用结构化程序设计技术的三种结构5.3.1 函数函数1.1.函数定义函数定义 返回值

27、类型返回值类型 函数名称函数名称( (参数表参数表) small | ) small | compact | large reentrant interrupt n compact | large reentrant interrupt n using n using n 若省略返回值类型部分,默认为整型若省略返回值类型部分,默认为整型(int)(int) 可以指定该函数的存储模式,以取代默认值可以指定该函数的存储模式,以取代默认值 若使用了若使用了usingusing,编译程序将产生切换工作寄存器组的,编译程序将产生切换工作寄存器组的代码代码 对于有返回值的函数,不能使用对于有返回值的函数,

28、不能使用usingusing,因为返回值是通,因为返回值是通过寄存器传递的过寄存器传递的5.3.1 函数函数参数个数参数个数charchar或字节或字节指针指针intint或或2 2字节字节指针指针longlong或或floatfloat通用指针通用指针1 1R7R7R6R6、R7R7R4R4R7R7R1R1R3R32 2R7R7 R5R5R4R4、R5 R6R5 R6、R7R7R4R4R7R7R1R1R3R33 3R7 R5R7 R5 R3R3R2R2、R3R4R3R4、R5 R6R5 R6、R7R7R1R1R3R32.2.参数传递参数传递 参数用于向函数传递数据,作为函数的输入。参数用于向

29、函数传递数据,作为函数的输入。 传统传统C C语言中参数是通过堆栈传递的,单片机中是通过语言中参数是通过堆栈传递的,单片机中是通过存储器或寄存器传递的。存储器或寄存器传递的。 传递参数的寄存器分配传递参数的寄存器分配5.3.1 函数函数3.3.返回值返回值 总是通过寄存器送回的总是通过寄存器送回的返回值类型返回值类型寄存器寄存器描述描述bitbitCYCY标志标志 charchar,unsigned charunsigned char,或,或1 1字节字节指针指针R7R7 intint,unsigned intunsigned int,或,或2 2字节指针字节指针R6 & R7R6 & R7最

30、高有效位在最高有效位在R6R6中,最低有效位在中,最低有效位在R7R7中中longlong或或unsigned long unsigned long R4R4R7R7最高有效位在最高有效位在R4R4中,最低有效位在中,最低有效位在R7R7中中floatfloatR4R4R7R73232位位IEEEIEEE格式格式通用指针通用指针R1R1R3R3存储器类型在存储器类型在R3R3中,最高有效位在中,最高有效位在R2R2中中,最低有效位在,最低有效位在R1R1中中5.3.1 函数函数4.4.内部函数和外部函数内部函数和外部函数 如果一个函数只能在其定义的文件中被调用,称之为内部函如果一个函数只能在其

31、定义的文件中被调用,称之为内部函数数 定义内部函数时,需用定义内部函数时,需用staticstatic存储类说明符。存储类说明符。 内部函数也称作静态函数内部函数也称作静态函数 定义内部函数可以使它只局限于所在的文件,当在不同文定义内部函数可以使它只局限于所在的文件,当在不同文件中有同名的函数时互不干扰件中有同名的函数时互不干扰 允许在其他文件中调用的函数为外部函数,可以使用允许在其他文件中调用的函数为外部函数,可以使用externextern存储类说明符指明。函数定义时,默认为外部函数。存储类说明符指明。函数定义时,默认为外部函数。5.3.1 函数函数5.5.可重入函数可重入函数 C C编译

32、程序通常将函数的局部变量分配在存储器的固定位编译程序通常将函数的局部变量分配在存储器的固定位置置 如果正在执行该函数时发生了中断,而中断服务程序中如果正在执行该函数时发生了中断,而中断服务程序中也调用该函数,先前的局部变量值便会被破坏。也调用该函数,先前的局部变量值便会被破坏。 类似的情况在实现函数递归调用时也会发生类似的情况在实现函数递归调用时也会发生 定义为可重入函数后,编译程序产生能够保护局部变量的定义为可重入函数后,编译程序产生能够保护局部变量的代码代码 reentrant reentrant5.3.1 函数函数6.6.中断处理函数中断处理函数 中断服务程序,是中断服务程序,是CPUC

33、PU响应中断后要执行的一段程序,在响应中断后要执行的一段程序,在C C语言中组织成一个函数的形式语言中组织成一个函数的形式 编写中断处理函数时,程序员仅需关心中断类型号和编写中断处理函数时,程序员仅需关心中断类型号和寄存器组的选择,编译程序会自动产生中断向量和返回寄存器组的选择,编译程序会自动产生中断向量和返回地址的入栈及出栈代码地址的入栈及出栈代码 interrupt interrupt using using5.3.1 函数函数函数函数 一些常用的只进行简单处理的函数,一些常用的只进行简单处理的函数,LCALLLCALL或或ACALLACALL的执行代价太高的执行代价太高 intrinsi

34、c intrinsic函数是一类用汇编语言代码实现的短小函数是一类用汇编语言代码实现的短小函数,若有对函数,若有对intrinsicintrinsic函数的调用,编译程序将函数的调用,编译程序将会直接用被调用函数代码替换函数调用语句会直接用被调用函数代码替换函数调用语句5.3.2 流程控制流程控制1.1.分支分支 if if语句语句 switch-case switch-case结构结构2.2.循环循环 goto goto语句语句 while while结构结构 dowhile dowhile结构结构 for for结构结构 break break和和continuecontinue语句语句5.3.3 输入与输出输入与输出 一些一些C C开发环境提供了流式输入开发环境提供了流式输入/ /输出函数,可以实现通输出函数,可以实现通过串行口或用户自定义过串行口或用户自定义I/OI/O接口的输入接口的输入/ /输出操作,例如输出操作,例如getcharget

温馨提示

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

评论

0/150

提交评论