单片机原理及应用教程(C语言版)-第4章 单片机C语言及程序设计课件_第1页
单片机原理及应用教程(C语言版)-第4章 单片机C语言及程序设计课件_第2页
单片机原理及应用教程(C语言版)-第4章 单片机C语言及程序设计课件_第3页
单片机原理及应用教程(C语言版)-第4章 单片机C语言及程序设计课件_第4页
单片机原理及应用教程(C语言版)-第4章 单片机C语言及程序设计课件_第5页
已阅读5页,还剩139页未读 继续免费阅读

下载本文档

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

文档简介

1、单片机原理及应用教程单片机原理及应用教程 (C语言版)语言版)第第4章章 单片机单片机C语言及程序设计语言及程序设计主主 编:编:周国运周国运中国水利水电出版社中国水利水电出版社第第4章章 MCS-51单片机单片机C语言语言及程序设计及程序设计4.1 单片机单片机C语言概述语言概述4.2 C51数据类型及存储数据类型及存储4.3 C51一般变量的定义一般变量的定义4.4 C51特殊功能寄存器特殊功能寄存器的定义的定义4.5 C51位变量的定义位变量的定义4.6 C51指针与结构指针与结构体的定义体的定义4.7 C51的输入的输入/输出输出4.8 C51函数的定义函数的定义4.9 C51与汇编语

2、言与汇编语言混合编程混合编程主要内容主要内容第第4章章 单片机单片机C语言及程序设计语言及程序设计本章主要讨论本章主要讨论C51变量的定义和函数的定义。变量的定义和函数的定义。本章内容的安排,认为读者已经学习过本章内容的安排,认为读者已经学习过C语言,语言,具有具有C语言的基本知识,因此,本章内容完全是结语言的基本知识,因此,本章内容完全是结合单片机来讲解,也就是补充合单片机来讲解,也就是补充C语言在单片机方面语言在单片机方面的概念、数据定义和函数定义等。的概念、数据定义和函数定义等。通过本章学习,使读者能够比较顺利地编写通过本章学习,使读者能够比较顺利地编写C51程序。程序。 4.1 C51

3、概述概述主要内容主要内容4.1.1 C语言编程的优势语言编程的优势4.1.2 C51与与ANSI C的区别的区别4.1.3 C51扩展的关键字扩展的关键字4.1 C51概述概述学习单片机学习单片机C语言的必要性语言的必要性随着单片机性能的不断提高,随着单片机性能的不断提高,C语言编译调试语言编译调试工具的不断完善,以及现在对单片机产品辅助功能工具的不断完善,以及现在对单片机产品辅助功能的要求、对开发周期不断缩短的要求,使得的要求、对开发周期不断缩短的要求,使得越来越越来越多的单片机编程人员转向使用多的单片机编程人员转向使用C语言语言,因此有必要,因此有必要在单片机课程中讲授在单片机课程中讲授“

4、单片机单片机C语言语言”。 “C51”概念:概念:为了与为了与ANSI C区别,区别,把把“单片单片机机C语言语言”称为称为“C51”,也称为,也称为“Keil C”。 4.1.1 C语言编程的优势语言编程的优势在编程方面,使用在编程方面,使用C51较汇编语言有诸多优势:较汇编语言有诸多优势:1)编程容易)编程容易 2)容易实现复杂的数值计算)容易实现复杂的数值计算3)容易阅读与交流)容易阅读与交流4)容易调试与维护)容易调试与维护5)容易实现模块化开发)容易实现模块化开发 6)程序可移植性好)程序可移植性好 4.1.2 C51与与ANSI C的区别的区别C51与与ANSI C的区别是因为的区

5、别是因为CPU、存储器和外、存储器和外部设备的不同,以及不使用操作系统等引起的。部设备的不同,以及不使用操作系统等引起的。C51是是MCS-51单片机的单片机的ANSI C,单片机与,单片机与PC机的差异,主要由机的差异,主要由C51编译器(如编译器(如Keil C)处理,)处理,一些库函数的差异,也由编译器的开发着做了修改一些库函数的差异,也由编译器的开发着做了修改.因此,我们使用因此,我们使用C51编程,如基本语法、数据编程,如基本语法、数据结构、程序结构、程序组织等各个方面,与使用结构、程序结构、程序组织等各个方面,与使用ANSI C的感觉基本上是一样的。的感觉基本上是一样的。但是,但是

6、,C51与与ANSI C之间是有差异的,从单片之间是有差异的,从单片机应用编程的角度来看,主要有以下几个方面机应用编程的角度来看,主要有以下几个方面 。 4.1.2 C语言与语言与ANSI 的区别的区别1)变量)变量(一般变量)(一般变量)的定义问题的定义问题如字符型、整型、浮点型、各种数组、各种结如字符型、整型、浮点型、各种数组、各种结构体等。构体等。因单片机有因单片机有4个存储空间、个存储空间、7个存储区,个存储区,在定义在定义时,必须要指明变量存放的存储器空间、具体的区时,必须要指明变量存放的存储器空间、具体的区域域。2)特殊功能寄存器的使用问题)特殊功能寄存器的使用问题这是这是ANSI

7、 C中所没有的。中所没有的。在在C51中增加了两种中增加了两种“特殊功能寄存器数据类型特殊功能寄存器数据类型”,使用之前,像一般,使用之前,像一般变量一样,需要先定义再使用变量一样,需要先定义再使用。 4.1.2 C语言与语言与ANSI 的区别的区别3)位变量的定义问题)位变量的定义问题这也是这也是ANSI C中所没有的,中所没有的,在在C51增加了两种增加了两种“位数据类型位数据类型”。见见4.5节。节。4)指针的定义问题)指针的定义问题指针的定义和变量一样,与指针的定义和变量一样,与ANSI C的差异是由的差异是由复杂的存储器引发,复杂的存储器引发,主要是指针指向的是哪个存储主要是指针指向

8、的是哪个存储器空间、哪个存储区域器空间、哪个存储区域。见。见4.6节。节。5)函数、中断服务函数的定义问题)函数、中断服务函数的定义问题在在C51的函数定义中,的函数定义中,增加了多个函数属性以增加了多个函数属性以解决单片机的要求。如中断函数、函数重入、解决单片机的要求。如中断函数、函数重入、 切切换工作寄存器组等。换工作寄存器组等。见见4.8节。节。 4.1.2 C语言与语言与ANSI 的区别的区别6混合编程问题混合编程问题一般一般PC机程序很少混合编程,但在单片机中常机程序很少混合编程,但在单片机中常混合编程。见混合编程。见4.9节。节。7库函数的差异问题库函数的差异问题由于由于PC机与单

9、片机的差异,相对于机与单片机的差异,相对于ANSI C的的库函数来说,库函数来说,C51的库函数减少了一部分的库函数减少了一部分(如显示、(如显示、键盘、磁盘,文件系统等),键盘、磁盘,文件系统等),增加了一部分增加了一部分(如循(如循环移位、绝对地址访问等),环移位、绝对地址访问等),修改了一部分修改了一部分(如(如I/O函数等)。函数等)。 4.1.3 C51扩充的关键字扩充的关键字由于单片机在结构及编程上的特殊要求,由于单片机在结构及编程上的特殊要求,C51有自己的特殊关键字,称之为有自己的特殊关键字,称之为C51扩充的关键字扩充的关键字,下面给出常用的下面给出常用的C51扩充的关键字。

10、扩充的关键字。_at_bdatabit codedataidata interruptpdatareentrant sbitsfrsfr16usingvolatilexdata这些关键字在后面会陆续接触到,此处不作详这些关键字在后面会陆续接触到,此处不作详细讲解。细讲解。 4.2 C51数据类型及存储数据类型及存储主要内容主要内容4.2.1 C51的数据类型的数据类型4.2.2 C51数据的存储数据的存储4.2.1 C51的数据类型的数据类型表表4-1 C51数据类型、长度和数值范围数据类型、长度和数值范围数据类型数据类型表示方法表示方法长长 度度数数 值值 范范 围围基基本本类类型型无符号字

11、符型无符号字符型 unsigned char 1字节字节 0255有符号字符型有符号字符型 signed char1字节字节 - -128127无符号整型无符号整型unsigned int2字节字节 065535有符号整型有符号整型signed int2字节字节 - -3276832767无符号长整型无符号长整型 unsigned long 4字节字节 04294967295有符号长整型有符号长整型 signed long4字节字节 - -21474836482147483647浮点型浮点型float4字节字节 1.1755E- -383.40E+38扩扩充充类类型型特殊功能特殊功能寄存器寄存

12、器sfrsfr161字节字节2字节字节0255065535位类型位类型bit、sbit1位位0或或14.2.1 C51的数据类型的数据类型bit、sbit数据类型转换与运算数据类型转换与运算1)bit、sbit到到char类型转换类型转换可以做强制类型转换。可以做强制类型转换。如:如:unsigned char d=5, d0=4, d1, d2, d3;bitbb=1;d=d+(char)bb)*8;/d=132)bit、sbit类型与类型与char类型可直接作逻辑运算类型可直接作逻辑运算如:如: d1=d0&bb;/d1=4d2=d0|bb;/d2=5d3=d0bb; /d3=5. 异或操

13、作异或操作注意:注意:bit、sbit类型与类型与char类型不能直接作算数运算类型不能直接作算数运算4.2.2 C51数据的存储数据的存储MCS-51单片机只有单片机只有bit和和unsigned char两种数两种数据类型支持机器指令据类型支持机器指令,而其它类型的数据都需要转,而其它类型的数据都需要转换成换成bit或或unsigned char型进行存储。型进行存储。为了减少单片机的存储空间和提高运行速度,为了减少单片机的存储空间和提高运行速度,要尽可能地使用要尽可能地使用unsigned char型数据。型数据。 一、位变量的存储一、位变量的存储bit和和sbit型位变量,直接存于型位

14、变量,直接存于RAM的位寻址空的位寻址空间,包括低间,包括低128位和特殊功能寄存器位。位和特殊功能寄存器位。 4.2.2 C51数据的存储数据的存储二、字符变量的存储二、字符变量的存储字符变量字符变量(char):无论是无论是unsigned char数据数据还是还是signed char数据,均为数据,均为1个字节,能够被直接个字节,能够被直接存储在存储在RAM中,可以存储在中,可以存储在00 x7f区域,也可以区域,也可以存储在存储在0 x800 xff区域,与变量的定义有关。区域,与变量的定义有关。unsigned char数:数:可直接被可直接被MSC-51接受接受signed ch

15、ar数据:数据:用补码表示。用补码表示。需要需要额外的操额外的操作来作来测试、处理符号位测试、处理符号位,使用的是两种库函数,代,使用的是两种库函数,代码量大,运算速度降低。码量大,运算速度降低。4.2.2 C51数据的存储数据的存储三、整型变量的存储三、整型变量的存储整型变量整型变量(int):不管是不管是unsigned int数据还是数据还是signed int数数据,均为据,均为2个字节,其个字节,其存储方法是存储方法是高位字节保存在低地址高位字节保存在低地址(在前(在前面),面),低位字节保存在高地址低位字节保存在高地址(在后面)(在后面) 。例如,例如,整型变量的值为整型变量的值为

16、0 x1234,在内存中的存,在内存中的存放如右图所示。放如右图所示。signed int数据用补码表示。数据用补码表示。地址地址低低高高:1234:4.2.2 C51数据的存储数据的存储四、长四、长整型变量的存储整型变量的存储长整型变量(长整型变量(long)为)为4个字节,个字节,其存储方法与整型数据一样,是其存储方法与整型数据一样,是最最高位字节保存的地址最低高位字节保存的地址最低(在最前(在最前面),面),最低位字节保存的地址最高最低位字节保存的地址最高(在最后面)。(在最后面)。如长整型变量的值为如长整型变量的值为0 x12345678,在内存中的,在内存中的存放方法如右图所示。不管

17、是存放方法如右图所示。不管是unsigned long数据数据还是还是signed long数据。数据。地址地址低低高高:12345678:4.2.2 C51数据的存储数据的存储五、浮点五、浮点型变量的存储型变量的存储浮点型变量浮点型变量(fload)占)占4个字节,个字节,用指数方式用指数方式表示表示,其具体格式与编译器有关。,其具体格式与编译器有关。对于对于Keil C,采用的是,采用的是IEEE-754标准标准,具有,具有24位精度,尾数的最高位始终为位精度,尾数的最高位始终为1,因而不保存。,因而不保存。具体分布为:具体分布为:1位符号位,位符号位,8位阶码位,位阶码位,23位尾位尾数

18、,如下表所示。数,如下表所示。 字节地址字节地址偏移量偏移量0123浮点数浮点数内容内容SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM符号和阶码符号和阶码 尾数高位尾数高位尾数低位尾数低位4.2.2 C51数据的存储数据的存储符号位符号位S:1表示负数,表示负数,0表示正数。表示正数。阶码:阶码:用移码表示。如,实际阶码用移码表示。如,实际阶码- -126用用1表示,实际阶码表示,实际阶码0用用127表示,表示,即实际阶即实际阶码数加上码数加上127得到阶码的表达数得到阶码的表达数。阶码数值范围:阶码数值范围:- -126+128阶码表达为:阶码表达为: 12554.2.2

19、C51数据的存储数据的存储例如浮点数例如浮点数- -12.5符号位为符号位为1,12.5的二进制数为的二进制数为1100.1=1.1001E+0011,阶码数值为阶码数值为3+127=130=10000010B,尾数为尾数为1001。因此得:。因此得:地址地址低低高高:C1480000: 11000001010010000000000000000000= 0 xC1480000尾数部分尾数部分符符号号位位阶码部分阶码部分4.3 C51一般变量的定义一般变量的定义主要内容主要内容4.3.1 C51变量的定义变量的定义4.3.2 C51变量的存储类型变量的存储类型4.3.3 C51变量的存储区变量

20、的存储区4.3.4 C51变量定义举例变量定义举例4.3.5 C51变量的存储模式变量的存储模式4.3.6 C51变量的绝对定位变量的绝对定位4.3.7 C51设备变量的定义设备变量的定义4.3.1 C51变量的定义格式变量的定义格式C51变量定义的一般格式为:变量定义的一般格式为:存储类型存储类型 数据类型数据类型 存储区存储区变量名变量名1=初值初值 ,变量名变量名2=初值初值 ,或或存储类型存储类型 存储区存储区 数据类型数据类型 变量名变量名1=初值初值 ,变量名变量名2=初值初值 ,可见变量可见变量(非位变量)(非位变量)的定义由的定义由4部分组成部分组成,即在变量定义时,指定变量的

21、即在变量定义时,指定变量的4种属性。种属性。数据类型:数据类型:在前面的在前面的4.2中已经叙述过,对于变中已经叙述过,对于变量名也无须多说,量名也无须多说,下面主要解释下面主要解释“存储类型存储类型”和和“存储区存储区”等概念等概念。 4.3.2 C51变量的存储类型变量的存储类型存储类型这个属性我们仍沿用存储类型这个属性我们仍沿用ANSI C的说法的说法,尽量不改变原来的含义。尽量不改变原来的含义。按照按照ANSI C,C语言的变量有语言的变量有4种存储类型种存储类型:动态存储(动态存储(auto)静态存储(静态存储(static)全局存储(全局存储(extern)寄存器存储(寄存器存储(

22、register) 4.3.2 C51变量的存储类型变量的存储类型一、动态存储一、动态存储动态(存储)变量:动态(存储)变量:用用auto定义的为动态变量,定义的为动态变量,也叫自动变量也叫自动变量。作用范围:作用范围:在定义它的函数内或复合语句内部在定义它的函数内或复合语句内部当定义它的函数或复合语句执行时,当定义它的函数或复合语句执行时,C51才为才为变量分配存储空间,结束时所占用的存储空间释放。变量分配存储空间,结束时所占用的存储空间释放。定义变量时,定义变量时,auto可以省略可以省略,或者说如果省略,或者说如果省略了存储类型项,则认为是动态变量。了存储类型项,则认为是动态变量。动态变

23、量一般动态变量一般分配使用寄存器或堆栈分配使用寄存器或堆栈。 4.3.2 C51变量的存储类型变量的存储类型二、静态存储二、静态存储静态(存储)变量:静态(存储)变量:用用static定义的为静态变量定义的为静态变量。分为内部静态和外部静态变量。分为内部静态和外部静态变量。内部静态变量:内部静态变量:在函数体内定义的为内部静态在函数体内定义的为内部静态变量变量。在函数内可以任意使用和修改,函数运在函数内可以任意使用和修改,函数运行结束后会一直存在,但在函数外不可见,即在函行结束后会一直存在,但在函数外不可见,即在函数体外得到保护。数体外得到保护。外部静态变量:外部静态变量:在函数体外部定义的为

24、外部静在函数体外部定义的为外部静态变量态变量。在定义的文件内可以任意使用和修改,外。在定义的文件内可以任意使用和修改,外部静态变量会一直存在,但在文件外不可见,即在部静态变量会一直存在,但在文件外不可见,即在文件外得到保护。文件外得到保护。 4.3.2 C51变量的存储类型变量的存储类型三、外部存储三、外部存储外部(存储)变量:外部(存储)变量:用用extern声明声明的变量为外的变量为外部变量部变量,是在其它文件定义过的全局变量。,是在其它文件定义过的全局变量。 用用extern声明后,便可以在所声明的文件中使用。声明后,便可以在所声明的文件中使用。需要注意的是:需要注意的是:在定义变量时,

25、即便是全局变在定义变量时,即便是全局变量,也不能使用量,也不能使用extern修饰修饰。 4.3.2 C51变量的存储类型变量的存储类型四、寄存器存储四、寄存器存储寄存器(存储)变量:寄存器(存储)变量:用用register定义的变量为定义的变量为寄存器变量寄存器变量。寄存器变量存放在寄存器变量存放在CPU的寄存器中的寄存器中,这种变量,这种变量处理速度快,但数目少。处理速度快,但数目少。C51中的寄存器变量:中的寄存器变量: C51的编译器在编译时,的编译器在编译时,能够自动识别程序中使用能够自动识别程序中使用频率高的变量频率高的变量,并将其,并将其安安排为寄存器变量排为寄存器变量,用户不用

26、专门声明。,用户不用专门声明。 4.3.3 C51变量的存储区变量的存储区变量的存储区属性是单片机扩展的概念变量的存储区属性是单片机扩展的概念,非,非常重要,常重要,它涉及到它涉及到7个新的关键字个新的关键字。MCS-51单片机有四个存储空间单片机有四个存储空间,分成三类,分成三类,它们是片内数据存储空间、片外数据存储空间和它们是片内数据存储空间、片外数据存储空间和程序存储空间。程序存储空间。 MCS-51单片机有更多的存储区域:单片机有更多的存储区域:由于片内由于片内数据存储器和片外数据存储器又分成不同的区域,数据存储器和片外数据存储器又分成不同的区域,所以所以单片机的变量有更多的存储区域单

27、片机的变量有更多的存储区域。在定义变量时,必须明确指出将其存放在哪在定义变量时,必须明确指出将其存放在哪个区域个区域。4.3.3 C51变量的存储区域变量的存储区域表表4-2 C51存储区属性与存储空间的对应关系存储区属性与存储空间的对应关系关键字关键字对应的存储空间及范围对应的存储空间及范围data片内片内RAM,直接寻址,低,直接寻址,低128字节字节bdata片内片内RAM,位寻址区,位寻址区0 x200 x2f,可字节访问,可字节访问idata片内片内RAM,间接寻址,间接寻址,256字节,与字节,与 Ri 对应对应pdata片外片外RAM,分页寻址的,分页寻址的256字节字节(P2不

28、变不变), P2改变可寻址改变可寻址64KB全空间,与全空间,与MOVX Ri 对应对应xdata片外片外RAM,64KB全空间全空间codeROM空间,空间,64KB全空间全空间sfr区区特殊功能寄存器区,地址特殊功能寄存器区,地址0 x800 xff,128字节,直接字节,直接寻址。不能够定义一般数据类型的变量寻址。不能够定义一般数据类型的变量 4.3.3 C51变量的存储区域变量的存储区域图图4-6 MCS-51单片机存储区分布示意图单片机存储区分布示意图 64KB片外片外RAM80H00H7FH特殊功能特殊功能寄存器区寄存器区sfr区区bdata区区idata区区data区区256B片

29、内片内RAMpdata区区256Bxdata区区64KBFlash ROMcode区区FFH0000HFFFF00FFH0100H128B位寻址区位寻址区16B, 128位位4.3.4 C51变量定义举例变量定义举例1)定义存储在)定义存储在data区域区域的的动态动态的的unsigned char时、分、秒变量:时、分、秒变量:auto unsigned char data hou=0, min=0, sec=0;2)定义存储在)定义存储在data区域区域的的静态静态的的unsigned char扫描码变量:扫描码变量: static unsigned char data scan=0 xf

30、e;3)定义存储在定义存储在data区域区域的的静态静态unsigned int变量变量dd static unsigned int data dd;4)定义存储在)定义存储在bdata区域区域的的动态动态的的unsigned char标识操作的变量:标识操作的变量: auto unsigned char bdata operate, operate1;/定义标识操作的可位寻址的变量定义标识操作的可位寻址的变量4.3.4 C51变量定义举例变量定义举例5)定义存储在)定义存储在idata区域区域的的动态动态的的unsigned char 、长度为长度为20的的临时临时数组数组temp:auto

31、 unsigned char idata temp20; 6)定义在)定义在pdata区域区域的的动态动态的有符号的有符号int、长度长度为为30的数组的数组send_data:int pdata send_data30; /存放发送数据存放发送数据4.3.4 C51变量定义举例变量定义举例7)定义存储在)定义存储在xdata区域区域的的动态动态的的unsigned int、长度为长度为50的数组的数组receiv_buf: unsigned int xdata receiv_buf50; /定义存放接受数据的数组定义存放接受数据的数组8)定义存储在)定义存储在code区域区域的的unsign

32、ed char、长度、长度为为10的数组的数组dis_code :unsigned char code dis_code = 0 x3f, 0 x06, 0 x5b, 0 x4f, 0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f;/定义共阴极数码管段码数组定义共阴极数码管段码数组4.3.5 C51变量的存储模式变量的存储模式存储模式:存储模式:如果在定义变量时缺省了存储区属如果在定义变量时缺省了存储区属性,则编译器会自动选择默认的存储区域,性,则编译器会自动选择默认的存储区域,也就是也就是存储模式存储模式。变量的存储模式决定于程序(或函数)的编译变量的存储模式决定于程序

33、(或函数)的编译模式模式。编译模式分为三种:编译模式分为三种:小模式(小模式(small)、紧凑模)、紧凑模式(式(compact)和大模式()和大模式(large)。编译模式由编)。编译模式由编译控制命令决定。译控制命令决定。存储模式(编译模式)决定了变量的默认存储存储模式(编译模式)决定了变量的默认存储区域和参数的传递方法区域和参数的传递方法。 4.3.5 C51变量的存储模式变量的存储模式一、一、small模式模式在在small模式下,变量的默认存储区域是模式下,变量的默认存储区域是“data”、“idata”,即未指出存储区域的变量保存,即未指出存储区域的变量保存到片内数据存储器中,并

34、且到片内数据存储器中,并且堆栈也安排在该区域中堆栈也安排在该区域中。small模式的特点:模式的特点:存储容量小,但速度快。存储容量小,但速度快。在在small模式下参数的传递:模式下参数的传递:通过寄存器、堆栈通过寄存器、堆栈或片内数据存储区完成的。或片内数据存储区完成的。 4.3.5 C51变量的存储模式变量的存储模式二、二、compact模式模式在在compact模式下,变量的默认存储区域是模式下,变量的默认存储区域是“pdata”,即未指出存储区域的变量保存到片外数,即未指出存储区域的变量保存到片外数据存储器的一页中,最大变量数为据存储器的一页中,最大变量数为256字节,并且字节,并且

35、堆栈也安排在该区域中堆栈也安排在该区域中。compact模式的特点:模式的特点:是存储容量较是存储容量较small模式模式大,速度较大,速度较small模式稍慢,但比模式稍慢,但比large模式要快。模式要快。在在compact模式下参数的传递:模式下参数的传递:通过片外数据通过片外数据区的一个固定页完成的。区的一个固定页完成的。 4.3.5 C51变量的存储模式变量的存储模式三、三、large模式模式在在large模式下,变量的默认存储区域是模式下,变量的默认存储区域是“xdata”,即未指出存储区域的变量保存到片外数,即未指出存储区域的变量保存到片外数据存储器,最大变量数可达据存储器,最大

36、变量数可达64KB,并且,并且堆栈也安堆栈也安排在该区域中排在该区域中。large模式的特点:模式的特点:存储容量大,速度慢。存储容量大,速度慢。large模式下参数的传递方式:模式下参数的传递方式:参数的传递也是参数的传递也是通过片外数据存储器完成的。通过片外数据存储器完成的。 4.3.5 C51变量的存储模式变量的存储模式C51支持混合模式:支持混合模式:即可以对函数设置编译模即可以对函数设置编译模式,所以在式,所以在large模式下,可以对某些函数设置为模式下,可以对某些函数设置为compact模式或模式或small模式,从而提高运行速度。模式,从而提高运行速度。默认编译模式:默认编译模

37、式:如果文件或函数未指明编译模如果文件或函数未指明编译模式,则编译器按式,则编译器按small模式处理模式处理。编译模式控制命令:编译模式控制命令: “#pragma small(或或compact、large)”应放在文件的开始。应放在文件的开始。 4.3.6 C51变量的绝对定位变量的绝对定位C51有三种方式可以对变量有三种方式可以对变量(I/O端口)端口)绝对定绝对定位:位:绝对定位关键字绝对定位关键字_at_ 、指针、库函数的绝对定、指针、库函数的绝对定位宏。位宏。对于后两种方式,在后面指针一节介绍。对于后两种方式,在后面指针一节介绍。C51扩展的关键字扩展的关键字_at_专门用于对变

38、量作绝对定专门用于对变量作绝对定位位,_at_使用在变量的定义中,其格式为:使用在变量的定义中,其格式为:存储类型存储类型 数据类型数据类型 存储区存储区 变量名变量名1 _at_ 地址常数地址常数,变量名,变量名2 4.3.6 C51变量的绝对定位变量的绝对定位_ _at_ _的使用方法举例的使用方法举例1)定义存储在)定义存储在idata区域区域中的中的 unsigned char数数组组cc,且,且绝对定位在绝对定位在0 x98地址处:地址处:unsignedchar idata cc10 _at_ 0 x98; 2)定义端口在)定义端口在xdata区域区域、地址为地址为0 x7fff的

39、的 unsigned char设备变量设备变量ADC0809:unsignedchar xdata ADC0809 _at_ 0 x7fff;3)定义端口在)定义端口在xdata区域区域、地址为地址为0 xbfff的的 unsigned char设备变量设备变量printer_port:unsigned char xdata printer_port _at_ 0 xbfff; 4.3.6 C51变量的绝对定位变量的绝对定位对变量绝对定位的几点说明:对变量绝对定位的几点说明:1)绝对地址变量)绝对地址变量在定义时不能初始化在定义时不能初始化,因此不,因此不能对能对code型变量绝对定位。型变量

40、绝对定位。2)绝对地址变量)绝对地址变量只能够是全局变量只能够是全局变量,不能在函,不能在函数中对变量绝对定位。数中对变量绝对定位。3)一次可以定义多个绝对定位的变量一次可以定义多个绝对定位的变量 4)绝对地址变量主要用于定义在)绝对地址变量主要用于定义在xdata 区域的区域的设备变量设备变量,一般情况下不对变量作绝对定位。,一般情况下不对变量作绝对定位。5)位变量不能使用)位变量不能使用_at_绝对定位绝对定位。如:某实验板上数码管显示器的段数据端口地如:某实验板上数码管显示器的段数据端口地址为址为“0 xfeff”;位控制字的端口地址为;位控制字的端口地址为“0 xfdff” 。4.3.

41、7 设备变量的概念设备变量的概念 C语言的输入语言的输入/输出,都是通过定义在输出,都是通过定义在I/O口的变口的变量(字符型、位型)实现的。通过这些变量,将设量(字符型、位型)实现的。通过这些变量,将设备的数据、状态传递给单片机,单片机对数据、状备的数据、状态传递给单片机,单片机对数据、状态信息进行分析,再对设备做出相应控制。态信息进行分析,再对设备做出相应控制。这样的变量与设备相关联,为设备型变量这样的变量与设备相关联,为设备型变量,与,与一般数据型变量有很大的区别,一般数据型变量访一般数据型变量有很大的区别,一般数据型变量访问的是存储器,不会对外部设备产生影响。问的是存储器,不会对外部设

42、备产生影响。在设备型变量中,以三总线方式连接的设备型在设备型变量中,以三总线方式连接的设备型变量最复杂,初学者对其定义及操作过程往往感到变量最复杂,初学者对其定义及操作过程往往感到不好理解而出错。为了加强对这类变量的理解,我不好理解而出错。为了加强对这类变量的理解,我们将其称为们将其称为“设备变量设备变量”。因此,。因此,“设备变量设备变量”的的定义为定义为“以三总线方式连接的设备对应的变量为设以三总线方式连接的设备对应的变量为设备变量备变量”。 4.3.7 C51设备设备变量的概念变量的概念对设备变量的几点说明:对设备变量的几点说明: 设备变量是通过设备端口获得数据和赋值的设备变量是通过设备

43、端口获得数据和赋值的变量,变量,与一般数据型变量不同。与一般数据型变量不同。 设备变量是无符号字符型变量设备变量是无符号字符型变量(因总线数据(因总线数据是是8位、从设备的读取一般是无符号数)。位、从设备的读取一般是无符号数)。 设备变量有确定的端口地址设备变量有确定的端口地址(公式(公式4-2中的中的地址常数,其值决定于电路中地址常数,其值决定于电路中P0、P2口与设备的口与设备的连接),连接),通过总线读写操作对设备进行数据输入通过总线读写操作对设备进行数据输入/输出。输出。 对设备变量赋值,是单片机对设备写数据,对设备变量赋值,是单片机对设备写数据,单片机是输出;把设备变量的值赋给其它变

44、量,是单片机是输出;把设备变量的值赋给其它变量,是单片机从设备读取数据,单片机是输入。单片机从设备读取数据,单片机是输入。 一个设备可以有多个意义不同的设备变量一个设备可以有多个意义不同的设备变量,其数量决定于设备的特性(与设备的端口对应,见其数量决定于设备的特性(与设备的端口对应,见8.1节)。节)。 设备变量的定义使用设备变量的定义使用“绝对定位绝对定位”方式较好方式较好。4.4 C51特殊功能寄存器的定义特殊功能寄存器的定义主要内容主要内容4.4.1 8位特殊功能寄存器的定义位特殊功能寄存器的定义4.4.2 16位特殊功能寄存器的定义位特殊功能寄存器的定义4.4.1 8位特殊功能寄存器的

45、定义位特殊功能寄存器的定义特殊功能寄存器也是一种数据类型特殊功能寄存器也是一种数据类型8位特殊功能寄存器定义的一般格式为:位特殊功能寄存器定义的一般格式为:sfr特殊功能寄存器名特殊功能寄存器名 地址常数地址常数地址常数范围:地址常数范围:0 x800 xff。特殊功能寄存器定义例子(可以参见特殊功能寄存器定义例子(可以参见reg51.h、reg52.h等文件):等文件):sfrP0=0 x80;/定义定义P0寄存器寄存器sfrP1=0 x90;/定义定义P1寄存器寄存器sfrPSW=0 xd0;/定义定义PSWsfrIE=0 xa8;/定义定义IE 4.4.2 16位特殊功能寄存器的定义位特

46、殊功能寄存器的定义16位特殊功能寄存器定义的一般格式为:位特殊功能寄存器定义的一般格式为:sfr16 特殊功能寄存器名特殊功能寄存器名 地址常数地址常数地址常数范围:地址常数范围:0 x800 xff。例如(可以参见例如(可以参见reg51.h、reg52.h等文件):等文件):sfr16 DPTR=0 x82; /含含DPL和和DPHsfr16 T2=0 xcc; /含含TL2和和TH2sfr16 RCAP2=0 xca; /含含RCAP2L和和RCAP2H,/ 0 xca为为RCAP2L的地址的地址4.4.2 16位特殊功能寄存器的定义位特殊功能寄存器的定义几点说明:几点说明:1)定义特殊

47、功能寄存器中的地址必须在)定义特殊功能寄存器中的地址必须在0 x800 xff范围内。范围内。2)定义特殊功能寄存器,必须放在函数外面)定义特殊功能寄存器,必须放在函数外面作为全局变量。作为全局变量。3)用)用sfr或或sfr16每次只能定义一个特殊功能寄每次只能定义一个特殊功能寄存器。存器。4)用)用sfr或或sfr16定义的是绝对定位的变量定义的是绝对定位的变量(因(因为名字是与确定地址对应的),具有特定的意义,为名字是与确定地址对应的),具有特定的意义,在应用时不能像一般变量那样随便使用在应用时不能像一般变量那样随便使用。 4.5 C51位变量的定义位变量的定义主要内容主要内容4.5.1

48、 bit型位变量的定义型位变量的定义4.5.2 sbit型位变量的定义型位变量的定义4.5.1 bit型位变量的定义型位变量的定义常说的位变量指的就是常说的位变量指的就是bit型位变量,一般位型位变量,一般位变量变量。C51的的bit型位变量定义的一般格式为:型位变量定义的一般格式为:存储类型存储类型 bit 位变量名位变量名1=初值初值 ,位变量名,位变量名2=初值初值 ,bit位变量被保存在位变量被保存在RAM中的位寻址区域中的位寻址区域(字(字节地址为节地址为0 x200 x2f,16字节)。字节)。例如:例如:bitflag_run,receive_bit=0;static bitse

49、nd_bit; 4.5.1 bit型位变量的定义型位变量的定义两点说明:两点说明:1)位变量)位变量不能定义指针不能定义指针,不能定义数组不能定义数组;2) bit型位变量与其它变量一样,型位变量与其它变量一样,可以作为可以作为函数的形参函数的形参,也可以作为,也可以作为函数的返回值函数的返回值,即函数,即函数的类型可以是位型的。的类型可以是位型的。4.5.2 sbit型位变量的定义型位变量的定义对于能够对于能够按位寻址按位寻址的特殊功能寄存器、定义的特殊功能寄存器、定义在在位寻址区域的变量位寻址区域的变量(字节型、整型、长整型)(字节型、整型、长整型),可以对其各位用可以对其各位用sbit定

50、义位变量,定义位变量,称为特殊位变称为特殊位变量。量。为了明确起见,分开讨论为了明确起见,分开讨论按位寻址的特殊功按位寻址的特殊功能寄存器中位变量的定义,和定义在位寻址区域能寄存器中位变量的定义,和定义在位寻址区域变量中位变量的定义。变量中位变量的定义。4.5.2 sbit型位变量的定义型位变量的定义一、特殊功能寄存器中位变量定义一、特殊功能寄存器中位变量定义能够按位寻址的能够按位寻址的特殊功能寄存器中位变量定义特殊功能寄存器中位变量定义的一般格式为:的一般格式为:sbit位变量名位变量名 位地址表达式位地址表达式这里的位地址表达式有三种形式:这里的位地址表达式有三种形式:直接位地址直接位地址

51、特殊功能寄存器名带位号特殊功能寄存器名带位号字节地址带位号字节地址带位号4.5.2 sbit型位变量的定义型位变量的定义1、用直接位地址定义位变量、用直接位地址定义位变量位变量的定义格式为:位变量的定义格式为:sbit位变量名位变量名 位地址常数位地址常数位地址常数范围为位地址常数范围为0 x800 xff,实际是定义特,实际是定义特殊功能寄存器的位殊功能寄存器的位。例如:。例如:sbitP0_0=0 x80;/定义定义P0口的第口的第0位位sbitP1_2=0 x92; /定义定义P1口的第口的第2位位sbitRS0=0 xd3; /定义定义PSW的第的第3位位sbitET0=0 xa9;

52、/定义定义IE的第的第1位位 4.5.2 sbit型位变量的定义型位变量的定义2、特殊功能寄存器名带位号定义、特殊功能寄存器名带位号定义位变量的定义格式为:位变量的定义格式为:sbit位变量名位变量名 特殊功能寄存器名特殊功能寄存器名 位号常数位号常数这里的位号常数为这里的位号常数为07。例如:。例如:sbitP0_3=P0 3; /定义定义P0口的第口的第3位位sbitP1_4=P1 4; /定义定义P1口的第口的第4位位sbitOV=PSW 2; /定义定义PSW的第的第2位位sbitES=IE 4; /定义定义IE的第的第4位位 4.5.2 sbit型位变量的定义型位变量的定义3、寄存器

53、地址带位号定义位变量、寄存器地址带位号定义位变量位变量的定义格式为:位变量的定义格式为:sbit位变量名位变量名 特殊功能寄存器地址特殊功能寄存器地址 位号常数位号常数这里的位号常数同上,为这里的位号常数同上,为07。例如:。例如:sbitP0_6=0 x80 6; /定义定义P0口的第口的第6位位sbitP1_7=0 x90 7; /定义定义P1口的第口的第7位位sbitAC=0 xd0 6; /定义定义PSW的第的第6位位sbitEA=0 xa8 7;/定义定义IE的第的第7位位 还可以用还可以用“逻辑或逻辑或”和和“加加”运算:运算:sbitP0_6=0 x80| |6; sbitP0_

54、6=0 x80+6;4.5.2 sbit型位变量的定义型位变量的定义4、几点说明、几点说明1)用)用sbit定义的位变量,必须能够按位操作定义的位变量,必须能够按位操作,而不能够对无位操作功能的位定义位变量。而不能够对无位操作功能的位定义位变量。2)用)用sbit定义位变量,必须放在函数外面作为定义位变量,必须放在函数外面作为全局位变量全局位变量,而不能在函数内部定义。,而不能在函数内部定义。3)用)用sbit每次只能定义一个位变量每次只能定义一个位变量。4)对其它模块定义的位变量)对其它模块定义的位变量(bit型或型或 sbit型)型)的引用声明的引用声明,使用,使用bit。5)用)用sbi

55、t定义的是一种绝对定位的位变量定义的是一种绝对定位的位变量(因(因为名字是与确定位地址对应的),具有特定的意为名字是与确定位地址对应的),具有特定的意义,在应用时不能像义,在应用时不能像bit型位变量那样随便使用。型位变量那样随便使用。4.5.2 sbit型位变量的定义型位变量的定义二、二、位寻址区变量的位寻址区变量的位定义位定义对对bdata型变量(字节型、整型、长整型)型变量(字节型、整型、长整型) ,被保存在被保存在RAM中的位寻址区,因此中的位寻址区,因此可以对可以对bdata型变量各位作位变量定义型变量各位作位变量定义。这样,既可以对这样,既可以对bdata型变量作字节(或整型、型变

56、量作字节(或整型、长整型)操作,也可以作位操作。长整型)操作,也可以作位操作。bdata型变量的位定义格式:型变量的位定义格式:sbit 位变量名位变量名 bdata型变量名型变量名 位号常数位号常数 4.5.2 sbit型位变量的定义型位变量的定义bdata型变量为在此之前应该是定义过的型变量为在此之前应该是定义过的,位,位号常数可以是号常数可以是07(8位字节变量),或位字节变量),或015(16位整型变量),或位整型变量),或031(32位字长整型变位字长整型变量)。例如:量)。例如:unsignedchar bdataoperate;对对operate的低的低4位作位变量定义:位作位变

57、量定义:sbit flag_key=operate 0; /键盘标志位键盘标志位sbit flag_dis=operate 1; /显示标志位显示标志位sbit flag_mus=operate 2; /音乐标志位音乐标志位sbit flag_run=operate 3; /运行标志位运行标志位 4.6 C51指针与结构体的定义指针与结构体的定义主要内容主要内容4.6.1 通用指针通用指针4.6.2 存储器专用指针存储器专用指针4.6.3 指针变换指针变换4.6.4 C51指针应用指针应用4.6.5 C51结构体的定义结构体的定义指针概念:指针概念:是以地址方式直接访问计是以地址方式直接访问计

58、算机存储器的数据类型。算机存储器的数据类型。4.6 C51指针的定义指针的定义由于由于MCS-51单片机有三种不同类型的存储空单片机有三种不同类型的存储空间,并且还有不同的存储区域,间,并且还有不同的存储区域,因此因此C51指针的内指针的内容更丰富。容更丰富。指针除了具有像变量的四种属性(存储类型、指针除了具有像变量的四种属性(存储类型、数据类型、存储区、变量名)外,数据类型、存储区、变量名)外,按存储区,将指按存储区,将指针分为通用指针和不同存储区域的专用指针。针分为通用指针和不同存储区域的专用指针。对于结构体变量的定义,实质上与一般变量定对于结构体变量的定义,实质上与一般变量定义是一样的。

59、义是一样的。 4.6.1 通用指针通用指针所谓通用指针,就是通过该类指针可以访问所谓通用指针,就是通过该类指针可以访问所有的存储空间所有的存储空间。在在C51库函数中通常使用这种指针来访问。库函数中通常使用这种指针来访问。通用指针用通用指针用3个字节来表示:个字节来表示:第一个字节:表示指针第一个字节:表示指针所指向的存储空间所指向的存储空间第二个字节:为指针第二个字节:为指针地址的高字节地址的高字节第三个字节:为指针第三个字节:为指针地址的低字节地址的低字节4.6.1 通用指针通用指针通用指针的定义与一般通用指针的定义与一般C语言指针的定义相同,语言指针的定义相同,其格式为:其格式为:存储类

60、型存储类型 数据类型数据类型 *指针名指针名1,*指针名指针名2 , (公式(公式4-8)例如:例如:unsigned char *cpt;int *dpt;long *lpt;static char *ccpt; 通用指针的特点:通用指针的特点:定义简单定义简单访问所有空间访问所有空间访问速度慢访问速度慢 4.6.2 存储器专用指针存储器专用指针所谓存储器专用指针,就是通过该类指针,只所谓存储器专用指针,就是通过该类指针,只能够访问规定的存储空间区域能够访问规定的存储空间区域。指针本身占用指针本身占用1个字节个字节(data *,idata *,bdata *,pdata *)或或2个字节个

温馨提示

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

评论

0/150

提交评论