版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 Series第第7章章 C51语言及其程序设计语言及其程序设计n熟悉熟悉C51C51语法基础和程序结构语法基础和程序结构n掌握掌握C51C51结构化程序设计结构化程序设计n掌握掌握C51C51对单片机硬件的访问方法对单片机硬件的访问方法n掌握掌握C51C51函数定义与调用函数定义与调用n了解汇编语言和了解汇编语言和C51C51的混和编程的混和编程2机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 Series7.1 C51概述概述7.2 C51语法
2、基础语法基础 7.2.1 标识符和关键字标识符和关键字 7.2.2 数据类型数据类型 7.2.3 运算符和表达式运算符和表达式 7.2.4 程序结构程序结构7.3 C51对单片机的访问对单片机的访问 7.3.1 存储类型存储类型 7.3.2 存储模式存储模式 7.3.4 存储器和并行口的访问存储器和并行口的访问 7.3.5 位地址访问位地址访问7.4 C51函数函数 7.4.1 函数的分类函数的分类 7.4.2 函数的定义函数的定义 7.4.3 函数的调用函数的调用 7.4.4 对被调函数的说明对被调函数的说明 7.4.5 中断函数中断函数 7.3.3 特殊功能寄存器的访问特殊功能寄存器的访问
3、3机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 Series7.5 C51结构化程序设计结构化程序设计 7.5.1 顺序结构程序顺序结构程序 7.5.2 选择结构程序选择结构程序 7.5.3 循环结构程序循环结构程序 7.5.4 查表程序查表程序7.6 C51程序设计实例程序设计实例 7.6.1 单片机内单片机内/外部资源应用程序设计外部资源应用程序设计 7.6.2 C51语言和语言和MCS-51汇编语言混合编程汇编语言混合编程 7.6.3 编程优化的概念编程优化的概念4机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Contr
4、ol System 51 SeriesC语言是一种通用的程序设计语言,其代码率高,数据类型及运算符丰富,位操作能力强,适用于各种应用的程序设计。使用C语言进行单片机应用系统开发,具有编程灵活、调试方便、目标代码编译效率高的特点。C语言也是目前使用最广的单片机应用系统编程语言。C语言编写的单片机应用程序称为单片机C语言程序。MCS-51系列单片机开发系统的编译软件可以对51单片机C语言源程序进行编译,称为C51编译器。在C51编译软件中可进行51单片机C语言程序的调试。7.1 C51概述概述5机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 Ser
5、ies1) 扩展了专门访问MCS-51单片机硬件的数据类型;2) 存储类型按MCS-51单片机存储空间分类;3) 存储模式遵循存储空间选定编译器模式;4) 指针分为通用指针和存储器指针;5) 函数增加了中断函数和再入函数。C51编译器针对编译器针对MCS-51单片机硬件在下列几方单片机硬件在下列几方面对面对ANSI C进行了扩展:进行了扩展:7.1 C51概述概述6机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 Series使用具有C51编译扩展功能的C语言进行51单片机应用系统的开发编程称为C51编程编程。C51编程具有以下特点。1) 可管理
6、内部寄存器和存储器的分配,编程时,无需考虑不同存储器的寻址和数据类型等细节问题;2) 程序由若干函数组成,具有良好的模块化结构、可移植性好、便于项目维护管理;3) 有丰富的子程序库可直接引用,从而大大减少用户编程工作量,提高编程效率;4) 与汇编语言交叉编程。用汇编语言编写与硬件有关的程序,用C51编写与硬件无关的运算程序,充分发挥两种语言的长处,提高开发效率。7.1 C51概述概述7机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 SeriesC51编程和汇编语言编程过程一样。单片机C语言源程序经过编辑、编译、连接后生成目标程序(.BIN和.H
7、EX)文件,然后运行即可。调试51单片机C语言程序可用Keil C51编译器。注意:注意:使用C51编程可以取代繁琐的汇编语言编程,但仍需要了解51单片机的硬件结构。所以对于单片机系统的开发应采用汇编语言与C51混合编程的方法更为有效。7.1 C51概述概述8机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 Series标识符标识符用来标识源程序中某个对象的名字,这些对象可以是语句、数据类型、函数、变量、数组等。标识符由字符串、数字和下划线等组成,应该注意的是第一个字符必须是字母或下划线,不能用数字开头,如“1_a”是错误的,编译时会有错误提示。
8、在C51编译器中,只支持标识符的前32位为有效标识。7.2 C51语法基础语法基础1. 标识符标识符9机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 SeriesC51语言是区分大小写的一种高级语言,如“a_1”和“A_1”是两个完全不同的标识符。C51中有些库函数的标识符是以下划线开头的,所以一般不要以下划线开头命名用户自定义标识符。标识符在命名时应当简单,含义清晰,这样有助于阅读理解程序。1. 标识符标识符10机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 Series关键字关键字是编程语言
9、保留的特殊标识符,它们具有固定的名称和含义,在程序编写中不允许将关键字另做他用。C51中的关键字除了有ANSI C标准的32个关键字外,还根据MCS-51单片机的特点扩展了相关的关键字。C51关键字如表5-1所示。在C51的文本编辑器中编写C程序,系统可以把保留关键字以不同颜色显示,例如int关键字的默认颜色为天蓝色。7.2 C51语法基础语法基础2. 关键字关键字11机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 SeriesC51关键字列表关键字列表12机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control Syste
10、m 51 SeriesC51关键字列表(续关键字列表(续1)13机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 SeriesC51关键字列表(续关键字列表(续2)14机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 SeriesC51具有ANSI C的所有标准数据类型。基本数据类型包括:char、int、short、long、float和double。对C51编译器来说,short类型和int类型相同,double类型和float类型相同。除此之外,为了更加有利地利用MCS-51的结构,C51还增
11、加了一些特殊的数据类型,包括bit、sbit、sfr、sfr16。数据类型如下表所示。15机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 SeriesC51的数据类型列表的数据类型列表16机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 Serieschar类型的长度是1B,通常用于定义处理字符数据的变量或常量。unsigned char类型用字节中所有的位表示数值,可以表达的数值范围是0255。signed char类型用字节中最高位表示数据的符号,0表示正数,1表示负数,负数用补码表示,能表示
12、的数值范围是-128+127。unsigned char常用于处理ASCII字符或用于处理小于或等于255的整型数。1. char字符类型字符类型17机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 Seriesint整型长度为2B,用于存放一个双字节数据。signed int表示的数值范围是-32768+32767,字节中最高位表示数据的符号,0表示正数,1表示负数。unsigned int表示的数值范围是065535。2. int整型类型整型类型long长整型长度为4B,用于存放一个四字节数据。 分有符号long长整型signed long和
13、无符号long长整型unsigned long,默认值为signed long类型。signed long表示的数值范围是-2147483648+2147483647,字节中最高位表示数据的符号,0表示正数,1表示负数。unsigned long表示的数值范围是04294967295。3. long长整型类型长整型类型18机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 Seriesfloat浮点型在十进制中有7位有效数字,是符合IEEE-754标准(32)的单精度浮点型数据,占用4B。具有24位精度。4. float浮点型类型浮点型类型指针型本
14、身是一个变量,在这个变量中存放着指向另一个数据的地址。这个指针变量要占据一定的内存单元,对不同的处理器长度也不尽相同,在C51中它的长度一般为13个字节。5. *指针型类型指针型类型bit位标量是C51编译器的一种扩充数据类型,利用它可定义一个位标量。它的值是一个二进制位,不是0,就是1,类似一些高级语言中的boolean型数据的True和False。6. bit位标量类型位标量类型19机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 Seriessfr类型是一种C51扩充数据类型,占用一个内存单元,值域为0255。利用它可以访问MCS-51单片
15、机内部的所有特殊功能寄存器。如用sfr P1 = 0 x90定义一个特殊功能寄存器变量“P1”,0 x90是指51单片机的P1端口地址90H,变量P1即指51单片机的P1端口。在后面的语句中可以用P1=255(对P1端口的所有引脚置高电平)之类的语句操作特殊功能寄存器。7. sfr特殊功能寄存器类型特殊功能寄存器类型20机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 Seriessfr16类型也是一种C51扩充数据类型,用于定义存在于MCS-51单片机内部RAM的16位特殊功能寄存器。例如,定时器T0和T1。 sfr16型数据占用2个内存单元,
16、取值范围为065535。8. sfr16 16位特殊功能寄存器类型位特殊功能寄存器类型21机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 Seriessbit类型也是一种C51扩充数据类型,利用它可以访问芯片内部RAM中的可寻址位或特殊功能寄存器中的可寻址位。定义方法有如下三种:(1)sbit 位变量名位变量名 = 位地址位地址将位的绝对地址赋给位变量,位地址必须位于80HFFH(特殊功能寄存器的位地址)之间。(2)sbit 位变量名位变量名 = 特殊功能寄存器名特殊功能寄存器名位位置位位置当可寻址位位于特殊功能寄存器中时,可采用这种方法。位位
17、置是一个07之间的常数。(3)sbit 位变量名位变量名 = 字节地址字节地址位位置位位置这种方法是以一个常数(字节地址)作为基地址,该常数必须在80HFFH(特殊功能寄存器的字节地址)之间。位位置是一个07之间的常数。9. sbit可寻址位类型可寻址位类型22机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 Series关于数据类型的说明关于数据类型的说明sbit定义特殊功能寄存器中的可寻址位;而bit则定义了一个普通的位变量,一个函数中可包含bit类型的参数,函数返回值也可为bit类型。另外,bit还可访问MCS-51单片机片内20H2FH范
18、围内的位对象。C51编译器提供了一个bdata存储器类型,允许将具有bdata类型的对象放入MCS-51单片机片内可位寻址区。sbit和和bit的区别的区别51单片机中的特殊功能寄存器及其可寻址位,已被预先定义放在文件reg51.h中,在程序的开头只需加上#include或#include即可。关于关于reg51.h文件的说明文件的说明23机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 SeriesC51算术运算符有五种:算术运算符有五种:+加法运算符或正号-减法运算符或负号*乘法运算符/除法运算符%模(求余)运算符,模运算即求余数,如7%3,
19、结果是7除以3所得余数1。优先级:优先级:先乘除,后加减,先括号内,再括号外。结合性:结合性:自左至右方向。1. C51的算术运算符的算术运算符24机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 SeriesC51关系运算符有关系运算符有6种。种。关系表达式的结果是逻辑值“真”或“假”,C51中以“1”代表真,“0”代表假。大于 =大于等于= =相等! =不相等优先级:优先级:前四个高,后两个“= =”和“! =”级别低。结合性:结合性:自左至右方向。2. C51的关系运算符的关系运算符25机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Mi
20、cro Control System 51 SeriesC51逻辑运算符有逻辑运算符有3种。种。运算符的两边为关系表达式。逻辑表达式和关系表达式的值相同,以“0”代表假,以“1”代表真。&逻辑与| | 逻辑或! ! 逻辑非优先级:优先级:逻辑非“!”最高。结合性:结合性:“&”和“|”自左至右方向。“!”自右至左方向。3. C51的逻辑运算符的逻辑运算符26机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 SeriesC51按位操作运算符有按位操作运算符有6种。种。 & &按位与 | |按位或 按位异或 位取反 位
21、右移注意:注意:移位操作为补零移位。位运算符只能对整形和字符型运算,不能对实型数据运算。 如:char a = 0 x0f;表达式a = a值为0 xf0。 如:char a = 0 x22;表达式a2值为0 x88,即a值左移两位,移位后空白位补0。4. C51的按位操作运算符的按位操作运算符27机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 SeriesC51自增、自减运算符有自增、自减运算符有2种。种。自增、自减运算符可以在变量的前面或后面使用。 + 自增1 - - - - 自减1说明:说明:+i或-I,意为在使用i之前,先使i值加1或减
22、1。 i+或i-,意为在使用变量i之后,再使i值加1或减1。 例如,定义整型变量:int i=6,并有j=+i,则j值为7,i值也为7。而如有j=i+,则j值为6,i值为7。5. 自增、自减运算符自增、自减运算符28机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 SeriesC51赋值运算符为:赋值运算符为: 赋值 赋值操作是将“”右边的值赋给“”左边的变量。6. 赋值运算符赋值运算符C51提供了提供了10种复合赋值运算符。种复合赋值运算符。采用符合赋值运算的目的是为了简化程序,提高C51程序的编译效率。+=+= -= -= * *= = /=
23、 /= %= %= = &= &= = = |= |=例如:a+=b相当于a=a+b。a=b相当于a=ab。7. 复合赋值运算符复合赋值运算符29机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 Series注意&与*的用法意义如下:1)“&”与按位与运算符的差别。与按位与运算符的差别。如果“&”为“与”运算,&运算符的两边必须为变量或常量,如a=c&b。“&”是取地址运算时,如a=&b。2)“*”与指针定义时指针前的与指针定义时指针前的“*”的差别。的差别。如char *p
24、t,这里的“*”只表示pt为指针变量,不代表间址取内容的运算。而c=*b,是将以b的内容为地址的单元内容送c变量。C51对指针操作的运算符有对指针操作的运算符有2种种 & &取地址运算符* *指针运算符8. 对指针操作的运算符对指针操作的运算符30机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 Series!(非)算术运算 关系运算 &和| 赋值运算7.2 C51语法基础语法基础C51运算的优先级规定说明运算的优先级规定说明31机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 5
25、1 Series和ANSI C一样,C51的程序是一个函数定义的集合,可以由任意个函数构成,其中必须有一个主函数main( )。程序的执行是从主函数main( )开始的,调用其他函数后返回主函数main( ),最后在主函数中结束整个程序,而不管函数的排列顺序如何。C51程序的组成情况如下:7.2 C51语法基础语法基础32机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 Series全局变量说明全局变量说明/*可被各函数引用可被各函数引用*/类型说明类型说明main( ) /*主函数主函数*/声明部分声明部分语句部分语句部分类型说明类型说明 函数
26、名函数名1(形式参数表形式参数表)/*函数函数1*/声明部分声明部分语句部分语句部分类型说明类型说明 函数名函数名n(形式参数表形式参数表)/*函数函数n*/声明部分声明部分语句部分语句部分33机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 Series51单片机的存储器分为片内数据存储器、特殊功能寄存器、片外数据存储器、片内程序存储器和片外程序存储器。在C51中访问这些存储器时,是通过定义不同存储类型的变量,以说明该变量所访问的存储器位置。7.3 C51对对51单片机的访问单片机的访问34机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Mi
27、cro Control System 51 Series直接寻址片内数据存储区RAM(128字节),访问速度快。1. data直接寻址片内直接寻址片内RAM7.3 C51对对51单片机的访问单片机的访问可位寻址片内数据存储区RAM(16个字节),允许位与字节混合访问。2. bdata位寻址片内位寻址片内RAM间接寻址内部数据存储区,可访问全部内部地址空间(00FFH,256字节)。3. idata间接寻址片内间接寻址片内RAM35机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 Series分页(256Byte)外部数据存储区RAM(256字节)
28、,由操作码MOVX Ri 访问。4. pdata分页寻址片外分页寻址片外RAM寻址片外数据存储区RAM(64K字节),由操作码MOVX DPTR 访问。5. xdata寻址片外寻址片外RAM寻址片内外程序存储区ROM(64K字节),由操作码MOVX A+DPTR 访问。6. code寻址寻址ROM36机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 Series 存储器模式决定了变量的默认存储类型变量的默认存储类型和参数传递区和参数传递区,变量定义不明确存储区类型时使用默认值。 1. C51的三种存储器模式的三种存储器模式 SMALL模式 LAR
29、GE模式 COMPACT模式37机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 Series存 储 模 式说 明小编译模式SMALL参数及局部变量放入可直接寻址的片内数据存储区(最大128 B,默认存储类型是data),因此访问十分方便。另外所有对象,包括栈,都必须嵌入片内RAM。栈长很关键,因为实际栈长依赖于不同函数的嵌套层数。紧凑编译模式COMPACT参数及局部变量放入分页片外数据存储区(最大256 B,默认的存储类型是pdata),通过寄存器R0和R1间接寻址,栈空间位于内部数据存储区中。大编译模式LARGE参数及局部变量直接放入片外数据
30、存储区(最大64 KB,默认存储类型为xdata),使用数据指针DPTR来进行寻址。用此数据指针访问的效率较低,尤其是对两个或多个字节的变量,这种数据存储类型的访问机制直接影响代码的长度,不方便之处在于这种数据指针不能对称操作。38机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 Series2. 数据存储模式的两种设定方式数据存储模式的两种设定方式这种方式需在程序的第一句加预处理命令。如:#pragma small /*设定数据存储模式为小编译模式*/#pragma compact /*设定数据存储模式为紧凑编译模式*/#pragma larg
31、e /*设定数据存储模式为大编译模式*/1)使用预处理命令设定数据存储模式)使用预处理命令设定数据存储模式用C51编译程序对C51源程序进行编译时,使用编译控制命令,格式如下:C51 源程序名 SMALL C51 源程序名 COMPACT C51 源程序名 LARGE2)使用编译控制命令设定数据存储模式)使用编译控制命令设定数据存储模式39机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 Series2. 数据存储模式的两种设定方式数据存储模式的两种设定方式在程序的第一句加预处理命令:#pragma compact1)使用预处理命令)使用预处理命
32、令用C51对file1.C进行编译时,使用编译控制命令:C51 file1.C COMPACT 2)使用编译控制命令)使用编译控制命令例如:例如:C51源程序为file1.C,若使程序中的变量存储类型和参数传递区限定在外部数据存储区,即设定数据存储模式为COMPACT(紧凑编译模式)。40机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 Series#pragma small /*默认存储类型为MCS-51直接寻址片内RAM*/char data i, j, k; /*在片内直接寻址RAM中定义3个变量,默认为自动变量*/char i, j, k
33、; /*未指明存储类型,由#pragma small决定,与前一句等价*/int xdata m, n; /*在MCS-51片外RAM中定义了两个自动变量*/static char m, n; /*在MCS-51片内直接寻址RAM中定义了两个静态变量*/unsigned char xdata ram10;/*在MCS-51片外RAM中定义了大小为10 B的数组变量*/【例例7-1】变量和函数的存储模式设置举例。 变量存储模式设置举例变量存储模式设置举例41机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 Seriesint func1(int i
34、, int j) large /*指定函数中变量是LARGE模式*/return(i+j);int func2(int i, int j) /*未指明存储模式,按默认的SMALL模式*/return(i-j);【例例7-1】变量和函数的存储模式设置举例。 函数存储模式设置举例函数存储模式设置举例42机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 Series 51系列单片机片内有21个特殊功能寄存器(SFR),分散在片内RAM区的0 x800 xFF地址范围内。对SFR的操作只能用直接寻址方式。 为了能直接访问这些特殊功能寄存器,C51提供了定
35、义sfr的方法。这与ANSI C不兼容,只适用于51系列单片机。7.3 C51对对51单片机的访问单片机的访问43机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 Series用sfr数据类型定义特殊功能寄存器名的语法为 sfr 特殊功能寄存器名特殊功能寄存器名 = 整型常量整型常量1. 用用sfr数据类型访问特殊功能寄存器数据类型访问特殊功能寄存器例如:例如:sfr PSW=0 xD0; /*定义程序状态字PSW, 因51单片机的PSW地址为D0H*/sfr TMOD=0 x89; /*定义寄存器TMOD, 因51单片机的TMOD地址为89H*
36、/sfr P1=0 x90; /*定义P1口, 因MCS-51单片机的P1口地址为 90H*/sfr SCON=0 x98; /*定义串口控制寄存器SCON, 因MCS-51单片机的SCON地址为8H*/44机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 Series2. 用用sbit数据类型访问可位寻址的特殊功能寄存器中的位数据类型访问可位寻址的特殊功能寄存器中的位 51单片机片内21个特殊功能寄存器(SFR)中有11个是可位寻址的。访问这些可位寻址的SFR中的位的方法可由关键字sbit定义特殊功能寄存器位寻址数据类型来实现。定义特殊功能寄存
37、器位名的语法有3种:sbit 特殊功能寄存器位名特殊功能寄存器位名 = 特殊功能寄存器名特殊功能寄存器名整型常量整型常量其中,特殊功能寄存器名是已由sfr定义了的特殊功能寄存器名,整型常量是位可寻址特殊功能寄存器中的位(是一个07之间的常数)。 方法方法145机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 Series2. 用用sbit数据类型访问可位寻址的特殊功能寄存器中的位数据类型访问可位寻址的特殊功能寄存器中的位sbit 特殊功能寄存器位名特殊功能寄存器位名 =整型常量整型常量1整型常量整型常量2其中,整型常量1是指可位寻址特殊功能寄存器
38、的字节地址(在80HFFH之间),整型常量2是指该寄存器中的位(是一个07之间的常数)。 方法方法2sbit 特殊功能寄存器位名特殊功能寄存器位名 = 整型常量整型常量其中,整型常量是可位寻址特殊功能寄存器的绝对位地址(位于80HFFH之间)。 方法方法346机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 Series例如:例如:sfr PSW=0 xD0; /*定义程序状态字PSW,因为PSW地址为D0H*/sbit OV=PSW2; /*在前面定义了PSW后,OV位于PSW的第2位*/sbit AC=0 xD06; /*D0H是程序状态字P
39、SW的字节地址, 辅助进位标志位AC位于PSW的第6位*/sbit RS0=0 xD03; /*工作寄存器组控制位RS0位于PSW的第3位*/sbit CY=0 xD7; /*进位标志位Cy的绝对位地址为D7H*/标准SFR在reg51.h、reg52.h等头文件中已经被定义,只要用文件包含做出申明即可使用。47机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 Series#include ”reg51.h”sbit P10=P10; /*定义P10为P1口第0位,即P1.0口*/sbit P12=P12; /*定义P12为P1口第2位,即P1.
40、2口*/void main( )P10=1;/*置位P1.0口*/P12=0;/*复位P1.2口*/PSW=0 x08;/*程序状态字置0 x08*/【例例7-2】特殊功能寄存器的访问。48机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 Series 51单片机片有128个字节的RAM区(00H7FH),可扩展片外64KB的ROM和RAM,有P0、P1、P2、P3四个8位双向并行I/O口,每个端口可以按字节输入或输出,也可以按位进行输入或输出,四个口共32根口线。 使用C51编程时,片内/外存储器、片内I/O口与片外扩展I/O口可以统一在头文件
41、中定义,也可以在程序中进行定义(一般在程序开始的位置)。C51定义存储器、并行口方法如下。49机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 Series C51编译器提供一组宏定义用来对MCS-51系列单片机的CODE、DATA、PDATA和XDATA空间进行绝对地址访问。函数原型如下:函数原型如下:#define CBYTE(unsigned char volatile *)0 x50000L)#define DBYTE(unsigned char volatile *)0 x40000L)#define PBYTE(unsigned ch
42、ar volatile *)0 x30000L)#define XBYTE(unsigned char volatile *)0 x20000L)#define CWORD(unsigned int volatile *)0 x50000L)#define DWORD(unsigned int volatile *)0 x40000L)#define PWORD(unsigned int volatile *)0 x30000L)#define XWORD(unsigned int volatile *)0 x20000L)这些函数原型存放在absacc.h文件中。1. 对存储器使用绝对地址访
43、问对存储器使用绝对地址访问50机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 SeriesCBYTE以字节形式对CODE区寻址;DBYTE以字节形式对DATA区寻址; PBYTE以字节形式对PDATA区寻址; XBYTE以字节形式对XDATA区寻址; CWORD以字形式对CODE区寻址; DWORD以字形式对DATA区寻址; PWORD以字形式对PDATA区寻址; XWORD以字形式对XDATA区寻址。51机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 Series#include#includ
44、e#define uint unsigned int#define uchar unsigned charvoid main(void)uint ui_var1;uchar uc_var1;ui_var1 = XWORD 0 x0000; /*访问外部RAM的0000H0001H地址的内容*/【例例7-3】使用绝对地址访问存储器。52机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 Seriesuc_var1 = XBYTE 0 x0002; /*访问外部RAM的0002H地址的内容*/XWORD 0 x0000=0 xAABB; /*将0 xA
45、ABB送入外部RAM的0000H0001H地址中*/XBYTE 0 x0002=0 xAA; /*将0 xAA送入外部RAM的0002H地址中*/for(;);【例例7-3】使用绝对地址访问存储器。(续)(续)53机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 Series 采用指针的方法,可实现在C51程序中对任意指定的存储器地址进行操作。2. 对存储器使用指针访问对存储器使用指针访问#define uchar unsigned char#define uint unsigned intvoid test_memory(void)uchar
46、idata ivar1; /*定义一个指向idata存储空间的变量*/uchar xdata *xdp; /*定义一个指向XDATA存储器空间的指针*/char data *dp; /*定义一个指向DATA存储器空间的指针*/【例例7-4】使用指针访问存储器。54机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 Seriesuchar idata *idp; /*定义一个指向IDATA存储器空间的指针*/xdp=0 x1000; /*XDATA指针赋值,指向XDATA存储器地址1000H处*/*xdp=0 x5A; /*将数据5AH送到XDATA
47、区的1000H单元*/dp=0 x61; /*DATA指针赋值,指向DATA存储器地址61H处*/*dp=0 x23; /*将数据23H送到DATA区的61H单元*/idp=&ivar1; /*idp指向IDATA区的变量ivar1*/*idp=0 x16; /*数据16H送到IDATA区的变量ivar1所在的 地址单元中, 等价于ivar1=0 x16*/【例例7-4】使用指针访问存储器。(续)(续)55机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 Series 片内并行口可用关键字sfr定义,I/O口定义格式举例:sfr P0=0
48、 x80; /*定义P0口,地址80H*/sfr P1=0 x90; /*定义P1口,地址90H*/3. C51定义片内定义片内I/O口口sfr P1=0 x90; /*定义P1口,地址90H*/sfr P3=0 xB0; /*定义P3口,地址B0H*/sbit DIPswitch=P14;/*P1口第4位(P1.4口)为DIP开关的输入*/sbit LEDgreen=P35;/*P3口第5位(P3.5口)为LED的输出*/【例例7-5】操作片内I/O口。56机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 Series3. C51定义片内定义片
49、内I/O口口void main( )unsigned char inval=0; for(;)if(DIPswitch=1) /*检查P1.4口输入是否为高*/ inval=P1&0 x0F; /*读P1口03位*/ LEDgreen =0;/*置P1.5口输出为低*/ ElseLEDgreen =1;/*置P1.5口输出为高*/P3=(P3&0 x0F)|inval; /*P1口03位与P3口的03位相或输出*/【例例7-5】操作片内I/O口。(续)(续)57机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 Series 对片外
50、扩展的I/O口,则根据其硬件译码地址,将其看作片外数据存储器的一个单元,使用#define语句进行定义。采用指针定义,指针的定义在absacc.h头文件中。4. C51定义外部并行定义外部并行I/O口口#include “absacc.h”#define PA XBYTE0 xffec /*定义PA为外部I/O口,地址为0 xffec*/void main( )PA=0 x5A; /*将数据5AH写入地址为0 xffec的存储单元或I/O端口*/【例例7-6】操作片外I/O口。58机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 Series在头
51、文件或程序中对片内/外I/O口进行定义以后,在程序中就可以使用这些口了。 定义口地址的目的是为了便于C51编译器按51单片机系统的实际硬件结构建立I/O口变量名与其实际地址的联系,以便程序员能用软件模拟51单片机系统的硬件操作。59机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 SeriesC51对位变量的定义有3种方法:1用用bit关键字定义关键字定义C51位变量位变量例如:例如:bit lock; /*将lock定义为位变量*/bit dirention;/*将direction定义为位变量*/bit display; /*将display
52、定义为位变量*/注意:注意:不能定义位变量指针; 也不能定义位变量数组。60机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 SeriesC51对位变量的定义有3种方法:2函数可包含函数可包含bit的参数和返回值的参数和返回值例如:例如:bit fun(bit a1,bit a2)return(a1);61机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 SeriesC51对位变量的定义有3种方法:3可位寻址存储区的位变量定义可位寻址存储区的位变量定义 C51编译器允许数据类型为bdata的变量放入
53、片内RAM可位寻址区中。例如:例如:先定义变量的数据类型和存储类型,然后使用sbit定义位变量。bdata int ibdata; /* ibdata定义为bdata整型变量*/bdata char carry5; /* carry定义为bdata字符数组*/sbit mybit0= ibdata0; /* mybit0定义为ibdata的第0位*/sbit mybit15= ibdata15; /* mybit15定义为ibdata的第15位*/62机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 Series例如:例如:先定义变量的数据类型和
54、存储类型,然后使用sbit定义位变量。(续)(续)sbit arrybit07= carry07; /* arrybit07定义为carry0的第7位*/sbit arrybit37= carry37/* arrybit37定义为carry3的第7位*/arrybit37=0;/*carry3的第7位赋值为0(位寻址)*/carry0=A; /*carry0赋值为A(字节寻址)*/ 位置(位置(操作符)后的最大值取决于指定的基本数据类操作符)后的最大值取决于指定的基本数据类型。型。对于char而言是07;对于int而言是015;对于long而言是031。3可位寻址存储区的位变量定义可位寻址存储
55、区的位变量定义63机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 Series C51程序是由一个个函数构成的,构成程序是由一个个函数构成的,构成C51程序的若干程序的若干个函数中必须有一个主函数个函数中必须有一个主函数main(),主函数可根据需要来调,主函数可根据需要来调用其它函数。同一个函数可以在不同的地方被调用。用其它函数。同一个函数可以在不同的地方被调用。7.4 C51函数函数 从用户使用角度划分,函数分为库函数和用户自定义函数。 库函数是编译系统为用户设计的一系列标准函数,用户只需调用,而无需自己去编写这些复杂的函数。在调用前要先使
56、用#include包含命令包含和该函数有关的头文件,然后才能调用。如前面所用到的头文件reg51.h等,每一种头文件中包括一系列函数。1库函数库函数64机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 Series 用户自定义函数是用户根据任务编写的函数。从函数定义形式上可划分为三种:无参函数、有参函数和空函数。2用户自定义函数用户自定义函数 函数中无参数定义,该函数调用时无参数传递。1)无参函数)无参函数2)有参函数)有参函数 函数中定义形式参数。在调用函数时,实际参数值传递给形式参数,调用后返回结果给调用它的函数使用。3)空函数)空函数 函数
57、中无参数也无语句。该函数可以调用但没有任何功能,该函数是为了开发程序时将一些非基本模块的功能函数定义成空函数,先占好位置,以后再用编好的函数替换它。65机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 Series7.4 C51函数函数函数类型函数类型 函数名函数名 ( )函数体语句函数体语句说明:说明:如果函数没有返回值,可以将返回值类型设为void,函数以“”开始,以“”结束。1无参函数的定义无参函数的定义66机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 Series1无参函数的定义无参函数
58、的定义【例例7-7】无参函数的定义与调用。#include void fun1( )printf(“This is a C51 Programn”);void main( )fun1( );67机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 Series2有参函数的定义有参函数的定义函数类型函数类型 函数名函数名 (形式参数表列形式参数表列)函数体语句函数体语句return (返回形参名返回形参名) 说明:说明:其中形式参数表列的各项要用,隔开,通过return语句将需返回的值返回给调用函数。7.4 C51函数函数68机械电子工程系机械电子工程
59、系主主讲讲:陈慧:陈慧 Micro Control System 51 Series2. 有参函数的定义有参函数的定义void fun2(int a,int b ) int sum; sum=a+b; return sum;void main()int x=123,y=456,sum; sum=fun2(x,y); 【例例7-8】有参函数的定义与调用。69机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 Series3. 空函数的定义空函数的定义【例例7-9】空函数的定义与调用。void fun3( ) void main( ) fun3( );
60、函数类型函数类型 函数名函数名 ( ) 函数可以将返回值类型设为函数可以将返回值类型设为void。70机械电子工程系机械电子工程系主主讲讲:陈慧:陈慧 Micro Control System 51 Series函数名函数名 (实际参数表列实际参数表列); 函数的调用方式有三种:1)把被调函数作为主调函数中的一个语句。)把被调函数作为主调函数中的一个语句。 例如例如 fun1( );2)把被调函数作为表达式的一个运算对象。)把被调函数作为表达式的一个运算对象。 例如例如 sum=2* fun2(x, y);3)把被调函数作为另一个函数的参数。)把被调函数作为另一个函数的参数。 例如例如 printf(“sum is %dn”, fun2(x, y);函数调用的形式如下:函数调用的形式如下:71机械电子工程系机械电子工程系主主讲讲
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度区块链身份认证系统建设合同2篇
- 股权比例合同模板
- 学校融资合同范例
- 2024年度25MW柴油发电机电站备用电源配置与技术保障合同3篇
- 2024年度全国汽车展览会参展商合作协议书3篇
- 单位招聘保安合同范例
- 2024年度建筑塔吊司机承包劳务合同书2篇
- 汉沽区电子运输合同范例
- 2024年度软件开发合同标的的功能需求与开发进度2篇
- 采购仓储货架合同模板
- 格构护坡施工方案完整
- 肾恶性肿瘤的护理查房
- 软件项目验收确认书
- 青岛科技大学机械设计基础期末复习题
- 全国优质课大赛一等奖道德与法治人教版八年级上册《维护国家安全》大单元教学设计精美课件
- 幼儿园大班科学聪明的中国人
- 工程质量监督人员考试真题模拟汇编(共957题)
- 老年人心力衰竭的特点及临床诊治课件
- 岭南版四年级美术上册质量检测练习试题附答案
- 压力管道验收资料表格
- 动力触探技术规定
评论
0/150
提交评论