1、Copyright 2010 CUGB06 九月 2024单片机原理及应用课主要讲授内容第一章:单片机基本概念;第一章:单片机基本概念;第二章:第二章:MCS-51单片机的硬件结构;单片机的硬件结构;第三章:第三章:MCS-51单片机的指令系统及汇编编程;单片机的指令系统及汇编编程;第四章:第四章:MCS-51单片机的扩展;单片机的扩展;第五章:第五章:MCS-51单片机的单片机的C程序设计;程序设计;第六章:综合实例;第六章:综合实例;Copyright 2010 CUGB06 九月 2024 5-2 C515-2 C51的数据类型与运算的数据类型与运算 5-3 C515-3 C51流程控制
2、语句流程控制语句 5-4 5-4 C51的指针类型的指针类型 5-5 5-5 C51的函数的函数 5-1 5-1 单片机的单片机的C C语言语言 5-6 MCS-515-6 MCS-51内部资源的内部资源的C51C51编程编程第五章第五章 5151单片机的单片机的C C程序设计程序设计Copyright 2010 CUGB06 九月 2024一、一、C51的优点的优点 编译器能自动完成变量的存储单元的分配,编编译器能自动完成变量的存储单元的分配,编程者可以专注于应用软件的设计,可以对常用的程者可以专注于应用软件的设计,可以对常用的接口芯片编制通用的驱动函数,对常用的功能模接口芯片编制通用的驱动
3、函数,对常用的功能模块和算法编制相应的函数,可以方便地进行信号块和算法编制相应的函数,可以方便地进行信号处理算法和程序的移植,从而加快单片机应用系处理算法和程序的移植,从而加快单片机应用系统的开发速度。统的开发速度。当代码长度超过当代码长度超过4KB以上时,以上时,C51比汇编语言比汇编语言更具有明显的优势。更具有明显的优势。5-1 5-1 单片机的单片机的C C语言语言Copyright 2010 CUGB06 九月 2024二、二、C51程序开发过程程序开发过程Copyright 2010 CUGB06 九月 2024三、三、C51程序结构程序结构 预处理命令预处理命令全局变量说明;全局变
4、量说明;函数函数1说明;说明;函数函数n说明;说明;main()()局部变量说明;局部变量说明;执行语句;执行语句;函数调用(实际参数表);函数调用(实际参数表);函数函数1(形式参数说明)(形式参数说明)局部变量说明;局部变量说明;执行语句;执行语句;函数调用(实际参数表);函数调用(实际参数表);函数函数n(形式参数说明)(形式参数说明)局部变量说明;局部变量说明;执行语句;执行语句;函数调用(实际参数表);函数调用(实际参数表);Copyright 2010 CUGB06 九月 2024一、一、C51的数据类型的数据类型 数据类型数据类型长度长度(位位)取值范围取值范围字符型字符型sig
5、ned char8-128127unsigned char80255整整 型型signed int16-3276832767unsigned int16065535长整型长整型signed long32-2147488364821474883647unsigned long3204294967295浮点型浮点型float321.75494E-383.402823E+38位位 型型bit 10,1sbit 10,1访问访问SFRsfr 80255sfr16160655355-2 5-2 C51C51的数据类型与运算的数据类型与运算 Copyright 2010 CUGB06 九月 2024二、二
6、、C51数据的存储器类型数据的存储器类型 应用程序中使用的任何数据(变量和常量)必须以应用程序中使用的任何数据(变量和常量)必须以一定的存储器类型定位于单片机的相应的存储区域中。一定的存储器类型定位于单片机的相应的存储区域中。存储器类型存储器类型长度(位)长度(位)对应单片机存储器对应单片机存储器bdata1片内片内RAM,位寻址区,共,位寻址区,共128位。(亦能字节访问)位。(亦能字节访问)data8片内片内RAM,直接寻址,共,直接寻址,共128字节。字节。idata8片内片内RAM,间接寻址,共,间接寻址,共256字节字节(MOV Ri)。pdata8片外片外RAM,分页间址,共,分页
7、间址,共256字节。(字节。(MOVX Ri)xdata16片外片外RAM,间接寻址,共,间接寻址,共64k字节。(字节。(MOVX DPTR)code16ROM区域,间接寻址,共区域,间接寻址,共64k字节。(字节。(MOVC DPTR)Copyright 2010 CUGB06 九月 2024 访问片内访问片内RAM比访问片外比访问片外RAM的速度要的速度要快得多,所以对于经常使用的变量应该置于片快得多,所以对于经常使用的变量应该置于片内内RAM中,即用中,即用bdata、data、idata来定义;来定义;对于不经常使用的变量或规模较大的变量应该对于不经常使用的变量或规模较大的变量应该置
8、于片外置于片外RAM中,即用中,即用pdata、xdata来定义。来定义。例如:例如:bit bdata flags;/*位变量位变量flags定位在片内定位在片内RAM的位寻址区的位寻址区*/char data var;/*字符变量字符变量var定位在片内定位在片内RAM区区*/float idata x,y,z;/*实型变量实型变量x,y,z定位在片内间址定位在片内间址RAM区区*/sfr P1=0 x90;/*定义定义P1口地址为口地址为90H*/Copyright 2010 CUGB06 九月 2024 如果用户不对变量的存储器类型进行定义,如果用户不对变量的存储器类型进行定义,C51
9、编译器采编译器采用默认的存储器类型。默认的存储器类型由编译控制命令中用默认的存储器类型。默认的存储器类型由编译控制命令中的存储模式指令限制。的存储模式指令限制。例如:例如:char var;/*在在SMALL模式时,模式时,var定位定位data存储区存储区*/*在在COMPACT模式时,模式时,var定位定位pdata存储区存储区*/*在在LARGE模式时,模式时,var定位定位xdata存储区存储区*/存储模式存储模式默认存储类型默认存储类型特特 点点SMALLdata直接访问片内直接访问片内RAM;栈在片内;栈在片内RAM中。中。COMPACTpdata用用R0和和R1间址片外分页间址片
10、外分页RAM;栈在片内;栈在片内RAM中。中。LARGExdata用用DPTR间址片外间址片外RAM,代码长,效率低。,代码长,效率低。Copyright 2010 CUGB06 九月 2024三、三、80C51硬件结构的硬件结构的C51定义定义 1、特殊功能寄存器的定义、特殊功能寄存器的定义 80C51单片机内部有单片机内部有21个特殊功能寄存器,为了对它们个特殊功能寄存器,为了对它们能够进行直接访问,能够进行直接访问,C51编译器利用扩充的关键字编译器利用扩充的关键字sfr和和sfr16对对这些特殊功能寄存器进行定义。这些特殊功能寄存器进行定义。sfr的定义方法为:的定义方法为:sfr 特
11、殊功能寄存器名特殊功能寄存器名=地址常数;地址常数;例如:例如:sfr SCON=0 x90;/*定义串行口控制寄存器,地址为定义串行口控制寄存器,地址为0 x90*/sfr P0=0 x80;/*定义定义P0口,地址为口,地址为0 x80*/sfr16 T2=0 xCC;/*定义定义80C52的的T2L地址为地址为0 xCC,T2H地址为地址为0 xCD*/Copyright 2010 CUGB06 九月 20242、特殊功能寄存器中特定位的定义、特殊功能寄存器中特定位的定义在在C51中利用关键字中利用关键字sbit定义可独立寻址访问的位变定义可独立寻址访问的位变量,如定义量,如定义80C5
12、1单片机单片机SFR中的一些特定位。定中的一些特定位。定义方法分别为:义方法分别为:、sbit 位变量名位变量名=特殊功能寄存器名特殊功能寄存器名位的位置位的位置(07),如:),如:sfr PSW=0 xD0;/*定义定义PSW寄存器地址为寄存器地址为0 xD0*/sbit OV=PSW2;/*定义定义OV位为位为PSW.2,地址,地址为为0 xD2*/sbit CY=PSW7;/*定义定义CY位为位为PSW.7,地址,地址为为0 xD7*/Copyright 2010 CUGB06 九月 2024、sbit 位变量名位变量名=字节地址字节地址位的位置(位的位置(07),如:),如:sbit
13、 OV=0 xD02;/*定义定义OV位地址为位地址为0 xD2*/sbit CY=0 xD07;/*定义定义CY位地址为位地址为0 xD7*/注:字节地址作为基地址,必须位于注:字节地址作为基地址,必须位于0 x800 xFF之之间。间。、sbit 位变量名位变量名=位地址,如:位地址,如:sbit OV=0 xD2;/*定义定义OV位地址为位地址为0 xD2*/sbit CY=0 xD7;/*定义定义CY位地址为位地址为0 xD7*/注:位地址必须位于注:位地址必须位于0 x800 xFF之间。之间。Copyright 2010 CUGB06 九月 20243、内部、内部RAM中可位寻址对
14、象的定义中可位寻址对象的定义 当位对象位于当位对象位于80C51单片机内部单片机内部RAM的的20H2FH单元时,可以利用单元时,可以利用C51编译器提供的编译器提供的bdata存储器类型进行访问,带有存储器类型进行访问,带有bdata类型的变量可以进类型的变量可以进行字或字节寻址,用行字或字节寻址,用bit指定指定bdata变量的相应位后就变量的相应位后就可以进行位寻址。可以进行位寻址。例如,先定义变量的数据类型和存储类型为:例如,先定义变量的数据类型和存储类型为:int bdata ibase;/*在位寻址区定义一个整形变量在位寻址区定义一个整形变量ibase */char bdata a
15、rray4;/*在位寻址区定义一个字符在位寻址区定义一个字符数组数组array4 */Copyright 2010 CUGB06 九月 2024 然后,利用然后,利用bit定义可独立寻址访问的对象定义可独立寻址访问的对象位:位:bit mybit0=ibase0;/*mybit0定义为定义为ibase的第的第0位位 */bit mybit15=ibase15;/*mybit15定义为定义为ibase的第的第15位位 */bit ary07=array07;/*ary07定义为定义为ary0的第的第7位位 */bit ary37=array37;/*ary37定义为定义为ary3的第的第7位位
16、*/Copyright 2010 CUGB06 九月 2024访问示例:访问示例:ibase=-1;/*字寻址字寻址*/array2=a;/*字节寻址字节寻址*/ary07=0;/*位寻址位寻址*/用关键字用关键字bit定义普通位变量时定义普通位变量时C51编译器会自行编译器会自行安排该位变量于可位寻址的安排该位变量于可位寻址的bdata区。例如,区。例如,bit mybit。应注意的是,不能定义应注意的是,不能定义bit类型指针,也不能定义类型指针,也不能定义bit类型数组。类型数组。Copyright 2010 CUGB06 九月 20241、算术运算符和算术表达式、算术运算符和算术表达式
17、、基本算术运算符、基本算术运算符+加法运算符;加法运算符;减法(取负)运算符;减法(取负)运算符;*乘法运算符;乘法运算符;/除法运算符;除法运算符;%取余(模)运算符。取余(模)运算符。四、四、C51的运算符和表达式的运算符和表达式 Copyright 2010 CUGB06 九月 2024 在这些运算符中,加、减和乘法符合一般的算术在这些运算符中,加、减和乘法符合一般的算术运算规则。除法运算时,如果是两个整数相除,其结运算规则。除法运算时,如果是两个整数相除,其结果为整数,舍去小数部分;如果是两个浮点数相除,果为整数,舍去小数部分;如果是两个浮点数相除,其结果为浮点数。而对于取余运算,则要
18、求两个运算其结果为浮点数。而对于取余运算,则要求两个运算对象均为整形数据。对象均为整形数据。求一个算术运算表达式的值时,要依运算符的优求一个算术运算表达式的值时,要依运算符的优先级进行。算术运算符中取负运算优先级最高,其次先级进行。算术运算符中取负运算优先级最高,其次为乘法、除法和取余,加法和减法优先级最低。也可为乘法、除法和取余,加法和减法优先级最低。也可以根据需要,在算术表达式中采用括号来改变运算符以根据需要,在算术表达式中采用括号来改变运算符的优先级。的优先级。Copyright 2010 CUGB06 九月 2024、自增、自减运算符、自增、自减运算符+自增运算符;自增运算符;-自减运
19、算符。自减运算符。+和和-运算符只能用于变量,不能用于常运算符只能用于变量,不能用于常量和表达式。如,量和表达式。如,+j表示先加表示先加1,再取值;,再取值;j+表示先取值,再加表示先取值,再加1。自减运算类同。自减运算类同。Copyright 2010 CUGB06 九月 2024、类型转换、类型转换运算符两侧的数据类型不同时,要转换成同种运算符两侧的数据类型不同时,要转换成同种类型。转换方式有两种情况:类型。转换方式有两种情况:一是自动转换,是指编译器在编译时自一是自动转换,是指编译器在编译时自动进行的类型转换。顺序为:动进行的类型转换。顺序为:bitcharintlongfloat,s
20、ignedunsigned。二是强制类型转换,如:(二是强制类型转换,如:(double)a,将将a 强制转换为强制转换为double类型。类型。Copyright 2010 CUGB06 九月 20242、关系运算符和关系表达式、关系运算符和关系表达式、关系运算符、关系运算符 小于;小于;大于;大于;=大于等于;大于等于;=等于;等于;!=不等于。不等于。Copyright 2010 CUGB06 九月 2024 关系运算即比较运算。其优先级低于关系运算即比较运算。其优先级低于算术运算,高于赋值运算。在以上算术运算,高于赋值运算。在以上6种关系种关系运算中,前运算中,前4种优先级相同,处于高
21、优先级;种优先级相同,处于高优先级;后后2种优先级相同,处于低优先级。种优先级相同,处于低优先级。、关系表达式、关系表达式关系表达式的值为逻辑值:真和假。关系表达式的值为逻辑值:真和假。C51中中用用0表示假,用表示假,用1表示真。表示真。Copyright 2010 CUGB06 九月 20243、逻辑运算符和逻辑表达式、逻辑运算符和逻辑表达式、逻辑运算符、逻辑运算符&逻辑与;逻辑与;|逻辑或;逻辑或;!逻辑非。逻辑非。在三种逻辑运算中,逻辑非的优先级最高,且在三种逻辑运算中,逻辑非的优先级最高,且高于算术运算符;逻辑或的优先级最低,低于关系高于算术运算符;逻辑或的优先级最低,低于关系运算符
22、,但高于赋值运算符。运算符,但高于赋值运算符。、逻辑表达式、逻辑表达式逻辑表达式的值也为逻辑值:真和假。逻辑表达式的值也为逻辑值:真和假。Copyright 2010 CUGB06 九月 20244、位运算符、位运算符C51提供提供6种位运算符:种位运算符:&位与;位与;|位或;位或;位异或;位异或;位取反;位取反;右移。右移。位运算的优先级顺序为:位取反、左移和右位运算的优先级顺序为:位取反、左移和右移、位与、位异或、位或。移、位与、位异或、位或。Copyright 2010 CUGB06 九月 20245、赋值和复合赋值运算符、赋值和复合赋值运算符 符号符号“=”称为赋值运算符,其作用是将
23、一个称为赋值运算符,其作用是将一个数据的值赋给一个变量。赋值表达式的值就是被赋数据的值赋给一个变量。赋值表达式的值就是被赋值变量的值。值变量的值。在赋值运算符的前面加上其它运算符可以构成在赋值运算符的前面加上其它运算符可以构成复合赋值运算符。在复合赋值运算符。在C51中共有中共有10种复合运算符:种复合运算符:+=加法赋值;加法赋值;-=减法赋值;减法赋值;*=乘法赋值;乘法赋值;/=除法赋值;除法赋值;Copyright 2010 CUGB06 九月 2024%=取模赋值;取模赋值;=右移位赋值;右移位赋值;&=逻辑与赋值;逻辑与赋值;|=逻辑或赋值;逻辑或赋值;=逻辑异或赋值;逻辑异或赋值
24、;Copyright 2010 CUGB06 九月 20241、条件语句、条件语句条件语句由关键字条件语句由关键字if构成。有构成。有3种条件语句:种条件语句:、if(条件表达式)语句(条件表达式)语句若条件表达式的结果为真(非若条件表达式的结果为真(非0值),则执行后面的值),则执行后面的语句;反之若条件表达式的结果为假(语句;反之若条件表达式的结果为假(0值),则不值),则不执行后面的语句。执行后面的语句。例如:例如:if(p1!=0)c=20;一、一、C51选择语句选择语句 5-3 C515-3 C51流程控制语句流程控制语句Copyright 2010 CUGB06 九月 2024、i
25、f(条件表达式)语句(条件表达式)语句1 else 语句语句2若条件表达式的结果为真(非若条件表达式的结果为真(非0值),则执行值),则执行语句语句1;反之若条件表达式的结果为假(;反之若条件表达式的结果为假(0值),值),则执行语句则执行语句2。例如:例如:if(p1!=0)c=20;else c=0;Copyright 2010 CUGB06 九月 2024、if(条件表达式(条件表达式1)语句)语句1 else if(条件表达式(条件表达式2)语句)语句2else if(条件表达式(条件表达式3)语句)语句3 else if(条件表达式(条件表达式n)语句)语句nelse 语句语句n+1
26、Copyright 2010 CUGB06 九月 2024 此种形式的条件语句常用于实现多方此种形式的条件语句常用于实现多方向条件分支。向条件分支。例如:例如:if(a=1)c=10;else if a=2)c=20;else if a=3)c=30;else if a=4)c=40;else c=0;Copyright 2010 CUGB06 九月 20242、开关语句、开关语句开关语句主要用于多分支的场合。一般形式为:开关语句主要用于多分支的场合。一般形式为:switch(表达式)(表达式)case 常量表达式常量表达式1:语句:语句1;break;case 常量表达式常量表达式2:语句:
27、语句2;break;case 常量表达式常量表达式n:语句:语句n;break;default:语句:语句n+1;开关语句执行时,将开关语句执行时,将switch后面表达式的值与后面表达式的值与case后面各后面各个常量表达式的值逐个进行比较,若匹配则执行相应个常量表达式的值逐个进行比较,若匹配则执行相应case后后面的语句,然后执行面的语句,然后执行break语句。语句。break语句的功能是中止当语句的功能是中止当前语句的执行,使程序跳出前语句的执行,使程序跳出switch语句。若没有匹配的情况,语句。若没有匹配的情况,则执行语句则执行语句n+1。Copyright 2010 CUGB06
28、 九月 20241、while语句语句一般形式为:一般形式为:while(条件表达式)语句;(条件表达式)语句;二、二、C51循环语句循环语句 若条件表达式的结果为真(非若条件表达式的结果为真(非0值),程序就重值),程序就重复执行后面的语句,一直执行到条件表达式的结果复执行后面的语句,一直执行到条件表达式的结果变为假(变为假(0值)时为止。这种循环结构是先检查条件值)时为止。这种循环结构是先检查条件表达式给出的条件,再根据检查的结果决定是否执表达式给出的条件,再根据检查的结果决定是否执行后面的语句。如果条件表达式的结果一开始就为行后面的语句。如果条件表达式的结果一开始就为假,则后面的语句一次
29、也不能执行。假,则后面的语句一次也不能执行。Copyright 2010 CUGB06 九月 20242、do-while语句语句一般形式为:一般形式为:do语句语句while(条件表达式);(条件表达式);该结构的特点是先执行给定的循环语句,然后该结构的特点是先执行给定的循环语句,然后再检查条件表达式的结果。当条件表达式的值为真再检查条件表达式的结果。当条件表达式的值为真(非(非0值),则重复执行循环体语句,直到条件表达值),则重复执行循环体语句,直到条件表达式的值变为假(式的值变为假(0值)时为止。对于此种结构,在任值)时为止。对于此种结构,在任何条件下,循环体语句至少会被执行一次。何条件
30、下,循环体语句至少会被执行一次。Copyright 2010 CUGB06 九月 20243、for语句语句一般形式为:一般形式为:for(初值表达式初值表达式;条件表达式条件表达式;更更新表达式新表达式)语句)语句 该语句执行时,先计算初值表达式,作为循该语句执行时,先计算初值表达式,作为循环控制变量的初值,再检查条件表达式的结果,环控制变量的初值,再检查条件表达式的结果,当满足条件时就执行循环体语句并计算更新表达当满足条件时就执行循环体语句并计算更新表达式,然后再根据更新表达式的计算结果来判断循式,然后再根据更新表达式的计算结果来判断循环条件是否满足,一直进行到循环条件表达式的环条件是否满
31、足,一直进行到循环条件表达式的结果为假(结果为假(0值)时退出循环体。值)时退出循环体。Copyright 2010 CUGB06 九月 2024 4、if语句与语句与goto语句结合语句结合 利用利用if语句与语句与goto语句的结合,可以构成循环语句的结合,可以构成循环结构。可以有两种形式:结构。可以有两种形式:、当型循环、当型循环形式为:形式为:loop:if(表达式)(表达式)语句语句 goto loop;、直到型循环、直到型循环形式为:形式为:loop:语句语句 if(表达式)(表达式)goto loop;Copyright 2010 CUGB06 九月 2024 在在C51中可以定
32、义指针类型的变量。变量的指针中可以定义指针类型的变量。变量的指针就是该变量的地址。为了表示指针变量和它所指向就是该变量的地址。为了表示指针变量和它所指向的变量地址间的关系,可以利用运算符:的变量地址间的关系,可以利用运算符:*(取内容)(取内容)和和&(取地址)。(取地址)。一般定义形式为:一般定义形式为:变量变量=*指针变量指针变量指针变量指针变量=&目标变量目标变量 取内容运算是将指针变量所指向的目标变量的取内容运算是将指针变量所指向的目标变量的值赋给左侧的变量;取地址运算是将目标变量的地值赋给左侧的变量;取地址运算是将目标变量的地址赋给左侧的变量。址赋给左侧的变量。5-4 C515-4
33、C51的指针类型的指针类型Copyright 2010 CUGB06 九月 2024 必须注意,指针变量中只能存放指针型数据必须注意,指针变量中只能存放指针型数据(即地址),不要将一个非指针型的数据赋给一个(即地址),不要将一个非指针型的数据赋给一个指针变量。正确的赋值示例如:指针变量。正确的赋值示例如:char data*p /*定义指针变量定义指针变量*/p=30H /*为指针变量赋值,为指针变量赋值,30H为片内为片内RAM地地址址*/C51编译器支持两种指针类型:一般指针和基于存储编译器支持两种指针类型:一般指针和基于存储器的指针。器的指针。5-4 C515-4 C51的指针类型的指针
34、类型Copyright 2010 CUGB06 九月 2024 定义指针变量时,若未指定它所指向的对象的存储器类定义指针变量时,若未指定它所指向的对象的存储器类型时,该指针变量就被认为是一般指针。一般指针占用型时,该指针变量就被认为是一般指针。一般指针占用3个个字节:第一个字节存放该指针的存储器类型编码(由编译模字节:第一个字节存放该指针的存储器类型编码(由编译模式的默认值确定),第二和第三个字节分别存放该指针的高式的默认值确定),第二和第三个字节分别存放该指针的高位和低位地址偏移量。编码为:位和低位地址偏移量。编码为:一、一般指针一、一般指针 存储器类型存储器类型bdata/data/ida
35、taxdatapdatacode编码编码0 x000 x010 xfe0 xffCopyright 2010 CUGB06 九月 2024 例如:例如:xdata 类型,地址为类型,地址为0 x1234的指针表示为:第一字的指针表示为:第一字节为节为0 x01,第二字节为,第二字节为0 x12,第三字节为,第三字节为0 x34。一般指针所指向对象的存储空间位置在运行期一般指针所指向对象的存储空间位置在运行期间才能确定,在编译时无法优化存储方式,必须生间才能确定,在编译时无法优化存储方式,必须生成一般代码以保证对任意空间的对象进行存取。因成一般代码以保证对任意空间的对象进行存取。因此一般指针所产
36、生的代码速度较慢。此一般指针所产生的代码速度较慢。一般指针可用于存取任何变量而不必考虑变量在一般指针可用于存取任何变量而不必考虑变量在80C51单单片机存储空间的位置,许多片机存储空间的位置,许多C51库函数采用了一般指针。库函数采用了一般指针。例如:例如:char*xdata strptr;/*位于位于xdata 空间的一般指针空间的一般指针*/int *data number;/*位于位于data 空间的一般指针空间的一般指针*/Copyright 2010 CUGB06 九月 2024 定义指针变量时,若指定了它所指向的对象的存储类型定义指针变量时,若指定了它所指向的对象的存储类型时,该
37、指针变量就被认为是基于存储器的指针。基于存储器时,该指针变量就被认为是基于存储器的指针。基于存储器的指针可以高效访问对象,类型由的指针可以高效访问对象,类型由C51源代码中存储器类型决源代码中存储器类型决定,且在编译时确定。由于不必为指针选择存储器,这些指定,且在编译时确定。由于不必为指针选择存储器,这些指针的长度可以为针的长度可以为1个字节(个字节(idata*,data*,pdata*)或)或2个字个字节(节(code*,xdata*)。)。二、基于存储器的指针二、基于存储器的指针 例如:例如:char data*str;/*定义指向定义指向data 空间空间char型数据的指针型数据的指
38、针*/int xdata*num;/*定义指向定义指向xdata 空间空间int型数据的指针型数据的指针*/long code*pow;/*定义指向定义指向code 空间空间long型数据的指针型数据的指针*/Copyright 2010 CUGB06 九月 2024还可以在定义时指定指针本身的存储器空间位置。还可以在定义时指定指针本身的存储器空间位置。例如:例如:char data *xdata str;/*指针本身在指针本身在xdata空间空间*/int xdata *data num;/*指针本身在指针本身在data空间空间*/long code *idata pow;/*指针本身在指针
39、本身在idata空间空间*/基于存储器的指针长度比一般指针短,可以节省存基于存储器的指针长度比一般指针短,可以节省存储器空间,运行速度快,但它所指对象具有确定的储器空间,运行速度快,但它所指对象具有确定的存储器空间,兼容性不好。存储器空间,兼容性不好。Copyright 2010 CUGB06 九月 2024 与普通的与普通的C语言程序类似,语言程序类似,C51程序是程序是有若干模块化的函数构成。函数是有若干模块化的函数构成。函数是C51程序程序的基本模块,常说的子程序就是由函数来实的基本模块,常说的子程序就是由函数来实现的。现的。用户可以根据需要定义自己的功能函数,用户可以根据需要定义自己的
40、功能函数,也可以调用也可以调用C51编译器提供的标准函数(库编译器提供的标准函数(库函数)来完成某种特定的功能。函数)来完成某种特定的功能。5-5 C515-5 C51的函数的函数Copyright 2010 CUGB06 九月 2024一、一、C51函数的定义函数的定义函数的一般定义形式为:函数的一般定义形式为:返回值类型返回值类型 函数名(形式参数列表)函数名(形式参数列表)编译编译模式模式reentrantinterrupt nusing n 函数体函数体当函数没有返回值时,应用关键字当函数没有返回值时,应用关键字void明确明确说明说明。Copyright 2010 CUGB06 九月
41、 2024形式参数的类型要明确说明,对于无形参的函数,形式参数的类型要明确说明,对于无形参的函数,括号也要保留。括号也要保留。编译模式为编译模式为SMALL、COPACT或或LARGE,用来指,用来指定函数中局部变量和参数的存储器空间。定函数中局部变量和参数的存储器空间。reentrant用于定义可重入函数。用于定义可重入函数。interrupt n 用于定义中断函数,用于定义中断函数,n为中断号为中断号,可以为,可以为031,通过中断号可以决定中断服务程序的入口地,通过中断号可以决定中断服务程序的入口地址。址。(中断向量中断向量=8*n+3)using n 用于确定中断服务函数所使用的工作寄
42、存器用于确定中断服务函数所使用的工作寄存器组,组,n为工作寄存器组号,取值为为工作寄存器组号,取值为03。Copyright 2010 CUGB06 九月 2024二、二、C51函数的调用与参数传递函数的调用与参数传递 寄存器传递方式最多可以传递寄存器传递方式最多可以传递3个参数。这种个参数。这种参数传递可以产生高效的代码。这一特性可以用参数传递可以产生高效的代码。这一特性可以用REGPARMS和和NOREGPARMS编译命令来控制。编译命令来控制。若被调函数是有参函数,则主调函数必须把若被调函数是有参函数,则主调函数必须把被调函数所需的参数传递给被调函数。传递给被被调函数所需的参数传递给被调
43、函数。传递给被调函数的数据称为实际参数,即实参。实参对形调函数的数据称为实际参数,即实参。实参对形参的传递是单向的,即只能将实参传递给形参。参的传递是单向的,即只能将实参传递给形参。参数传递可以采用寄存器、固定存储器位置方式。参数传递可以采用寄存器、固定存储器位置方式。Copyright 2010 CUGB06 九月 2024寄存器参数传递使用的寄存器如表:传递的参数传递的参数char、1字节指针字节指针int、2字节指针字节指针long、float一般指针一般指针参数参数1R7R6、R7R4R7R1、R2、R3参数参数2R5R4、R5R4R7R1、R2、R3参数参数3R3R2、R3R1、R2
44、、R3Copyright 2010 CUGB06 九月 2024当无寄存器可用时,或说明了当无寄存器可用时,或说明了“pragma NOREGPARMS”时,参数可以采用固定的存储时,参数可以采用固定的存储器位置传递。在固定的存储器位置进行参数传递器位置传递。在固定的存储器位置进行参数传递是是C51的一个重要特征。在的一个重要特征。在SMALL模式下,参数模式下,参数传递在内部传递在内部RAM中完成。在中完成。在COMPACT和和LARGER模式下,参数的传递要在外部模式下,参数的传递要在外部RAM中中完成。完成。由于由于80C51单片机片内单片机片内RAM空间非常有限,所以空间非常有限,所以
45、C51编译器仅将函数的返回地址保存到堆栈中,编译器仅将函数的返回地址保存到堆栈中,不采用堆栈传递参数。但应注意,不采用堆栈传递参数。但应注意,C51提供一种提供一种模拟堆栈,从而支持可重入函数的递归调用。模拟堆栈,从而支持可重入函数的递归调用。Copyright 2010 CUGB06 九月 2024三、三、C51的库函数的库函数 C51编译器提供了丰富的库函数,使用编译器提供了丰富的库函数,使用这些库函数可以大大提高编程的效率。这些库函数可以大大提高编程的效率。每个库函数都在相应的头文件中给出了每个库函数都在相应的头文件中给出了函数的原形,使用时只需在源程序的开始函数的原形,使用时只需在源程
46、序的开始用编译命令用编译命令#include 将头文件包含进来即将头文件包含进来即可。可。常用的常用的C51库函数参见附录库函数参见附录C.2。Copyright 2010 CUGB06 九月 2024一、中断应用的一、中断应用的C语言编程语言编程 C51编译器支持在C源程序中直接开发中断程序。中断服务程序是通过按规定语法格式定义的一个函数。中断服务程序的函数定义的语法格式如下:返回值 函数名(参数)interrupt musing n 5-6 5-6 MCS-51内部资源的内部资源的C51编程编程Copyright 2010 CUGB06 九月 2024一、中断应用的一、中断应用的C语言编程
47、语言编程C51编译器支持在编译器支持在C51源程序中应用中断函数,进而控制源程序中应用中断函数,进而控制单片机中断系统的相关资源。单片机中断系统的相关资源。中断函数的定义形式为:中断函数的定义形式为:void 函数名(函数名(void)interrupt n using m 函数体函数体 这里这里interrupt表示该函数是中断服务函数,表示该函数是中断服务函数,n 表示对表示对应的中断源的编号,范围是应的中断源的编号,范围是031 5-6 5-6 MCS-51内部资源的内部资源的C51编程编程Copyright 2010 CUGB06 九月 2024常用的中断源对应的中断号 关键字usin
48、g 用于指定使用的工作寄存器组,m的范围是03。指定工作寄存器组后,所有被中断调用的过程都必须使用同一个寄存器组,否则参数传递就会发生错误。不设定工作寄存器组时,编译系统会将当前工作寄存器组的8个寄存器都压入堆栈。应注意的是,在应用程序中任何函数都不能应用程序中任何函数都不能调用中断服务函数调用中断服务函数,因为它是由系统调用的。中断源外中断0定时器0外中断1定时器1串行口中断号01234Copyright 2010 CUGB06 九月 2024例例1 在一在一80C51单片机应用系统中,外中断单片机应用系统中,外中断0引脚引脚接一个开关,并行端口线接一个开关,并行端口线P1.0接一个发光二级
49、管。接一个发光二级管。要求系统的功能是,开关闭合一次,发光二极要求系统的功能是,开关闭合一次,发光二极管的状态改变一次。相应的程序为:管的状态改变一次。相应的程序为:Copyright 2010 CUGB06 九月 2024例例2 利用定时利用定时/计数器计数器T0的方式的方式1,产生,产生10ms的定时,并使的定时,并使P1.0引脚上输出周期为引脚上输出周期为20ms的方波,采用中断方式,设系统时钟频的方波,采用中断方式,设系统时钟频率为率为12 MHz。解:1、计算计数初值X:由于晶振为12 MHz,所以机器周期Tcy为1S。因此:Nt/Tcy 10103/110610000因计数器是向上
50、计数,计数到10000时溢出,所以计数器初值为-10000。应将-(10000/256)送入TH0中,-(10000%256)送入TL0中。2、求T0的方式控制字TMOD:M1M0=01,GATE=0,C/=0,可取方式控制字为01H;二、定时器二、定时器/计数器计数器(C/T)应用的应用的C语言编程语言编程Copyright 2010 CUGB06 九月 2024三、串行口使用的三、串行口使用的C语言编程语言编程 例例3 单片机fosc=11.0592 MHz,用C51实现串口控制直流电机。Copyright 2010 CUGB06 九月 2024三、串行口使用的三、串行口使用的C语言编程语