版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
车用单片机原理(含实验与实训)12C51语言基础C51的语言的函数单击此处添加标题单击此处添加标题01C51语言基础第一节C51语言基础一、数据类型数据的不同格式叫做数据类型,C51编译器所支持的数据类型与标准C语言中所使用的数据类型基本相同,见表3-1,其中bit,sbit,sfr以及sfr16不是标准C中所具有的,是C51根据51单片机的结构特点,增加的特殊数据类型。第一节C51语言基础第一节C51语言基础(1)bit位类型。利用bit可以定义一个在RAM位寻址区的位变量,但不能定义位指针和位数组,它的值域是0或者1。(2)特殊功能寄存器sfr。8051单片机的特殊功能寄存器分布在片内数据存储区的地址单元80H~FFH之间,“sfr”数据类型占用一个内存单元。利用它可访问8051单片机内部的所有特殊功能寄存器。例如:sfrP1=0x90这一语句定义了P1端口在片内的寄存器,在程序后续的语句中可以用“P1=0xff”,使P1的所有引脚输出为高电平的语句来操作特殊功能寄存器。第一节C51语言基础(3)特殊功能寄存器sfr16。“sfr16”数据类型占用两个内存单元,用于操作占两个字节的特殊功能寄存器。例如:“sfr16DPTR=0x82”语句定义了片内16位数据指针寄存器DPTR,其低8位字节地址为82H,高8位字节地址为83H。在程序的后续语句中就可对DPTR进行操作。(4)特殊功能位sbit。
sbit是指AT89S51片内特殊功能寄存器的可寻址位。例如:
sfr PSW=0xd0; //定义PSW寄存器地址为0xd0 sbit OV=PSW^2; //定义OV位为PSW.2符号“^”前是特殊功能寄存器名字,“^”后的数字定义特殊功能寄存器可寻址位在寄存器中的位置,取值必须是0~7。第一节C51语言基础二、
数据存储类型与存储模式
(一)存储类型
在讨论C51数据类型时,须同时提及它的存储类型,以及它与8051单片机存储器结构的关系,因为C51定义的任何数据类型必须以一定的方式,定位在8051单片机的某一存储区中,否则没有任何实际意义。
在51单片机中,数据存储区域较多,有片内程序存储器,片外程序存储器,片外数据存储器、片内数据存储器、片内数据存储器又分为SFR区、位寻址区、字节寻址区、工作寄存器区等,为了能够将数据存储在单片机实际的区域中,C51编译器将变量、常量定义成不同存储类型,与MCS-51的实际存储空间的进行对应,见表3-2。第一节C51语言基础表3-2
C51的存储类型与存储空间对应关系存储类型存储空间位置字节地址data片内RAM直接寻址区,片内低128B00H~7FHbdata片内可位寻址区20H~2FHidata片内RAM的256B存储区,要间接寻址00H~FFHpdata片外数据存储区的256B00H~FFHxdata片外RAM64KB空间0000H~FFFFHcode程序ROM0000H~FFFFH第一节C51语言基础
访问片外数据存储区比访问片内数据存储区慢,因为访问片外数据存储区要通过对数据指针加载地址来间接寻址访问。C51提供两种不同的数据存储类型xdata和pdata来访问片外数据存储区
程序存储区只能读不能写,可能在8051单片机内部或者外部,或外部和内部都有,由8051单片机硬件决定,C51提供了code存储类型来访问程序存储区
单片机访问片内RAM比访问片外RAM相对快一些,所以应尽量把频繁使用的变量置于片内RAM。即采用data、bdata或idata存储类型,而将容量较大或使用不太频繁的那些变量置于片外RAM,即采用pdata或xdata存储类型。常量只能采用code存储类型。第一节C51语言基础(二)存储模式
如果在变量定义时略去存储类型标识符,编译器会自动默认存储类型。
进一步由SMALL、COMPACT和LARGE存储模式指令限制。例如,若声明charvar1,则在使用SMALL存储模式下,var1被定位在data存储区,在使用COMPACT模式下,var1被定位在idata存储区;在LARGE模式下,var1被定位在xdata存储区中。第一节C51语言基础SMALL模式。该模式下,所有变量都默认位于8051单片机内部的数据存储器,与使用data指定存储器类型的方式一样。在此模式下,变量访问的效率高,但是所有数据对象和堆栈必须使用内部RAM。COMPACT模式。本模式下所有变量都默认在外部数据存储器的1页(256字节)内,这与使用pdata指定存储器类型是一样的。该类型适用于变量不超过256字节的情况,此限制是由寻址方式决定的,相当于使用数据指针@Ri寻址。与SMALL模式相比,该存储模式的效率比较低,对变量访问的速度也慢一些,但比LARGE模式快。LARGE模式。本模式下所有变量都默认位于外部数据存储器,相当于用@DPTR寻址。通过数据指针访问外部数据存储器的效率较低,特别是当变量为2字节或更多字节时,该模式要比SMALL和COMPACT产生更多的代码。
在固定的存储器地址上进行变量传递,是C51的标准特征之一。第一节C51语言基础表3-3存储模式及其说明存储模式说明SMALL变量定义在片内数据存储器中,与data定义的存储空间一一致,访问速度最快。COMPACT变量定义在分页寻址的片外数据存储器中(默认存储类型是pdata),每页片外数据存储器的长度为256字节,通过寄存器R0和R1(MOVX@Ri)进行间接寻址访问,堆栈位于片内数据存储器中。LARGE变量定义在片外数据存储器中(最大64KB,默认存储类型是xdata),使用数据指针DPTR来间接访问变量(MOVX@DPTR)。第一节C51语言基础三、C51的基本运算6
C语言表达式是由操作数和运算符组成的序列,运算符是表示特定的算术或逻辑操作的符号,也称为操作符。根据所用运算符的不同,表达式也有很多种类。(1)算术运算符运算符号功能举例(设x=10,y=3)运算符号功能举例(设x=10,y=3)+加法z=x+y;//z=13%余数运算z=x%y;//z=1-减法z=x-y;//z=7++递增(增1)
*乘法z=x*y;//z=30--递减(减1)
/除法(或求模运算)z=x/y;//z=3
第一节C51语言基础6运算符号说明举例(设x初值为4)x++先用x的值,再让x加1y=x++;//y为4,x为5++x先让x加1,再用x的值y=++x;//y为5,x为5x--先用x的值,再让x减1y=x--;//y为4,x为3--x先让x减1,再用x的值y=--x;//y为3,x为3(3)关系运算符运算符号说明举例(设a=2,b=3)运算符号说明举例(设a=2,b=3)>
大于a>b;//返回值为0<=小于等于a<=b;//返回值为1<
小于a<b;//返回值为1==等于a==b;//返回值为0>=大于等于a>=b;//返回值为0!=不等于a!=b;//返回值为1(2)自增和自减运算第一节C51语言基础67(4)逻辑运算符运算符号说明举例(设a=2,b=3)&&逻辑与a&&b;//返回值为1||逻辑或a||b;//返回值为1!逻辑非!a;//返回值为0逻辑运算符表逻辑运算符的逻辑真值表ABA&&BA||B!A00001010111001011110第一节C51语言基础(5)位运算符运算符号说明举例(a=0x38、b=0x25、x=0x0f、y=0x3a、z=0x0f)&逻辑与a&b=0x380&0x25=0x20|按位逻辑或a|b=00111000|00100101=00111101=0x3d^按位逻辑异或a^b;a|b=0x1d(00011101)~按位按位取反~x=0xf0<<
按位左移(高位丢弃,低位补0)若y<<2则y=0xe8>>
按位右移(高位补0,低位丢弃)若z>>3则w=0x01第一节C51语言基础6(6)算术运算符的优先级算术运算符的优先级由高到低依次为自增自减(++、--)和取负(-)、乘法除法(*、/)和取模(%)、加和减(+、-)。对同级运算符一般按从左到右的顺序进行计算,但是,由于括号优先级最高,所以括号会改变计算顺序。2.关系运算符和逻辑运算符的优先级关系运算符和逻辑运算符的相对优先级最高的是“!”,其次是“>”、“<”、“>=”和“<=”,是“==”和“!=”,后面是“&”、“^”、“〡”、“&&”,最后是“||”。关系和逻辑运算符的优先级比算术运算符低,像表达式10>1+12和表达式10>(1+12)计算的结果是一样的。在关系或逻辑表达式中可以使用括号来修改计算原来的优先级顺序。第一节C51语言基础四、绝对地址的访问6
(1)绝对宏:
在程序中,用“#include
<absacc.h>
”即可使用其中声明的宏来访问绝对地址。包括:CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE和DWORD等,如:xval=XBYTE[0x0002];XWORD[0x0002]=0x2000;#defineDAC0832XBYTE[0xffff];DAC0832=0x80;第一节C51语言基础
(2)_at_关键字:
该关键字用法较简单,直接在数据声明后加上_at_地址常数即可。但需要注意以下问题:
(1)绝对变量不能被初始化。
(2)bit型数据及变量不能用_at_指定。例如:structdat{structdatidata*next;charcode*test;};idatastructdatnum_at_0x42;xdataintval_at_0x8000;第一节C51语言基础五、C51控制语句与程序设计(一)C51的基本结构
1.顺序结构顺序结构是指程序按照自上而下的顺序执行各个代码及程序模块,程序只有一条路可走,没有语句的跳转。顺序结构最常用,也比较简单和理解。
2.选择结构—if、switch语句选择结构一般用于有选择地执行操作,通过判断表达式条件是否成立,来有选择性执行相应程序。选择结构的程序一般由if条件语句、switch开关语句等来构成。分支控制语句有:if语句和switch语句。第一节C51语言基础(1)if语句if语句是用来判定所给定的条件是否成立,并根据判定条件的结果,决定执行哪种操作。C51提供3种形式的if语句:1)形式1:
if(表达式){语句}形式1的流程图如图3-1所示,先判断括号中所给定表达式是否成立,如果表达式成立执行大括号中的语句,否则跳过大括号中的语句,直接执行后面的语句。图3-1单分支选择结构图第一节C51语言基础2)形式2:
if(表达式){语句1;}else{语句2;}形式2的流程图如图3-2所示,先判断括号中的表达式是否成立,如果括号中的表达式成立就执行第一个大括号中的语句1,否则执行第二个大括号中的语句2,相当于双分支选择结构。
图3-2双分支选择结构图第一节C51语言基础3)形式3:
if(表达式1){语句1;}elseif(表达式2){语句2;}elseif(表达式3){语句3;}...elseif(表达式m){语句m;}else{语句n;}形式3的流程图如图3-3所示,本形式相当于串行多分支选择结构。先判断表达式1是否成立,如果表达式1成立就则执行语句1,如果表达式条件1不成立,则判断表达式2是否成立,如果表达式2成立,就执行语句2,否则判断表达式3是否成立,直至判断到表达式m是否成立,如果都没有表达式成立,执行最后的语句n。在if语句中含有一个或多个if语句,称为if语句的嵌套。if总是与它后面最近的一个else语句相对应,不会与相隔if的else对应。图3-3多分支选择结构图第一节C51语言基础图3-3多分支选择结构图第一节C51语言基础(2)switch/case语句。根据表达式的值决定要执行的语句组,常用于实现多选一功能。switch(表达式){
case常量表达式1:{语句组1};break;case常量表达式2:{语句组2};break;…case常量表达式m:{语句组m};break;default:
{语句组n};}第一节C51语言基础switch语句的说明如下:1)switch后面括号内的表达式,可以是整型或字符型表达式。2)当switch括号内表达式的值与某一“case”后面常量表达式的值相等时,就执行该“case”后面的语句,然后遇到break语句就会退出switch选择结构,若表达式的值与所有case后的常量表达式的值都不相同,就执行default后面的语句,然后退出switch选择结构。3)每一个case后面常量表达式的值必须互不相同。4)case语句和default语句的出现次序不会影响程序执行的结果。5)当case语句后面没有break语句时,即使执行了相应的case语句,也不会退出当前switch结构,会继续依次执行后面的语句,直到遇到break或结束。6)当所有case后的常量表达式都与switch中的表达式不等时,就执行default语句。第一节C51语言基础在程序执行过程中,很多时候需要循环结构来实现某段程序的重复执行,在C51中有3种语句可以实现循环,分别是:while语句、do-while语句和for语句。
(1)while语句while语句的一般形式如下:while(表达式){循环体语句;}while语句的结构流程图如图3-4所示。3.循环结构第一节C51语言基础图3-4
while语句循环结构图while语句特点是:先判断条件,再执行循环体语句,在循环体语句中对条件进行更新,然后再判断条件是否成立,如条件成立,则继续执行循环体,如条件不成立,则退出循环,如条件第一次就不成立,则循环体一次也不执行。第一节C51语言基础(2)do-while语句do-while语句的格式如下:do{循环体语句;}while(表达式)do-while的结构流程图如图3-5所示。先执行一次大括号内的循环体语句,再判断表达式是否成立,当表达式成立时,再重复执行大括号内的循环体语句,直到表达式不成立时,直接跳出dowhile循环体执行后面的语句。
第一节C51语言基础图3-5do-while循环结构图while语句首先判断表达式是否成立,再决定是否执行循环体语句,而do-while语句要先执行一次循环体语句,再去判断表达式是否成立,因此无论表达式是否成立,在do-while语句中循环体至少已经被执行过一次。第一节C51语言基础
(3)for语句for语句经常使用在循环次数已知的循环体中,也可用于循环次数不确定而只给出循环条件情况的循环体中。for语句的格式如下:for(表达式1;表达式2;表达式3){循环体语句;}在for语句中,for括号中的表达式1为初值赋值语句,用于把初值赋值给循环变量;表达式2为条件表达式,一般是一个逻辑或者关系表达式,用来判断循环变量的真假;表达式3为循环变量更新表达式,用于更新循环变量。第一节C51语言基础6for语句后面带三个表达式,它的执行过程如下:第一步:先执行表达式1的赋值。第二步:判断表达式2是否成立,如果表达式2成立,则执行一次循环体中的语句,然后再执行下一步(第三步)的操作,如果表达式2不成立,直接执行第四步。第三步:执行求解表达式3,对循环变量的值进行更新,然后跳转到第二步继续执行。第四步:退出for循环,执行循体结构后面的语句,第一节C51语言基础图3-6for语句程序流程图for语句中3个表达式都是可选项,可以任意省略,但“;”不能省。省1是不对循环变量赋初值;省2是不判断循环条件的真假;省3是不对循环变量操作。for(;;)表示无限循环,相当于while(1)或者do-while(1)。第一节C51语言基础
4.break语句、continue语句、return语句在循环语句执行过程中,可以用break和continue语句用来跳出循环结构,但是二者又有所不同,下面分别介绍。(1)break语句break语句只能在switch开关语句或者循环语句中使用,一般用来跳出循环体或者switch语句,直接执行循环结构后面或者switch语句之后的语句。(2)continue语句continue语句用于结束本次循环,不再执行当前本轮循环,即continue后面的语句不再执行,直接从下一轮循环入口开始执行,直到判断条件不满足为止。(3)return返回语句return返回语句有两种格式:1)return。2)return(表达式)。如果return语句后面带有表达式,则要计算表达式的值,并将表达式的值作为函数的返回值;如果return语句不带表达式,则函数不返回任何值。第一节C51语言基础六、数组简介
数组是同类数据的一个有序结合,用数组名来标识。整型变量的有序结合称为整型数组,字符型变量的有序结合称为字符型数组。数组中的数据,称为数组元素。
数组中各元素的顺序用下标表示,下标为n的元素可以表示为数组名[n]。改变[]中的下标就可以访问数组中的所有的元素。
数组有一维、二维、三维和多维数组之分。C51语言中常用的一维、二维数组和字符数组。第一节C51语言基础(1)一维数组具有一个下标的数组元素组成的数组成为一维数组,一维数组形式如下:类型说明符数组名[元素个数];其中,数组名是一个标识符,元素个数是一个常量表达式,不能是含有变量的表达式:例如:intarray1[8]第一节C51语言基础定义名为array1的数组,包含8个整型元素,在定义数组时,可对数组进行整体初始化,若定义后对数组赋值,则只能对每个元素分别赋值。例如:inta[3]={2,4,6};
/*给全部元素赋值,a[0]=2,a[1]=4,a[2]=6*/intb[4]={5,4,3,2};/*给全部元素赋值,b[0]=5,b[1]=4,b[2]=3,b[3]=2*/第一节C51语言基础(2)二维数组或多维数组具有两个或两个以上下标的数组,称为二维数组或多维数组。定义二维数组的一般形式如下:类型说明符数组名[行数][列数];其中,数组名是一个标识符,行数和列数都是常量表达式。例如:floatarray2[4][3]/*array2数组,4行3列共12个浮点型元素*/第一节C51语言基础6二维数组可以在定义时进行整体初始化,也可在定义后单个地进行赋值。例如:inta[3][4]={1,2,3,4},{5,6,7,8},{9,10,11,12};/*a数组全部初始化*/intb[3][4]={1,3,5,7},{2,4,6,8},{};/*b数组部分初始化,未初始化的元素为0*/第一节C51语言基础(3)字符数组 若一个数组的元素是字符型的,则该数组就是一个字符数组。例如:定义了一个字符型数组a[],有10个数组元素,并且将9个字符(其中包括一个字符串结束标志‘\0’
)分别赋给了a[0]~a[8],剩余的a[9]被系统自动赋予空格字符。chara[10]={‘B’,‘E’,‘I’,‘’,‘J’,‘I’,‘N’,‘G’,‘\0’};/*字符串数组*/第一节C51语言基础(4)字符串数组
字符串数组有别于字符数组。字符数组是一个一维数组,而字符串数组是以字符串作为数组元素的数组,可以将其看成一个二维字符数组,字符串数组中各字符串在结束时,自动添加一个结束符'\0',下面定义一个简单的字符串数组。charname[5][20]={"Li","Wang","Zhao","Chen","Chao"}第一节C51语言基础用双引号括起来的一串字符,成为字符串常量,C51编译器会自动地在字符串末尾加上结束符‘\0’。用单引号括起来的字符为字符的ASCII码值,而不是字符串。例如‘a’表示a的ASCII码值61H,而“a”表示一个字符串,由两个字符a和\0组成。字符串数组name中含有5个字符串元素,每个字符串的长度要小于20,在计算字符串长度时,字符串后面的'\0'也要考虑在内。02C51语言的函数第二节C51语言的函数一、函数的定义与分类
(一)函数的定义
在C51中函数定义的格式如下:函数值类型函数名称(形式参数表){函数体;}第二节C51语言的函数1.函数值类型
函数类型用来说明函数返回值的数据类型。函数值类型在编程时可以省略,若省略,则系统默认函数返回值的数据类型是int。如果函数只执行操作,不需要返回函数值,该函数类型就是空类型或者无类型,用void表示,它表示本函数是没有返回值的。2.函数名称
由用户命名的,可以是任意的字母、数字和下划线组成,但开头不能使用数字。在同一个文件中,函数是不允许与其他变量或者函数重名的,也不能是关键字,比如int,if,else,for等。第二节C51语言的函数3.形式参数列表形式参数列表是函数调用时相互传递数据用的。有的函数不需要传递参数给它,则可以用void来替代,void也可以省略,但是无参函数的函数名后面的()不能省略。4.函数体函数体包含了声明语句和执行语句两个部分。声明语句部分要放在执行语句之前,主要用于声明函数内部所使用的变量,执行语句部分主要是一些函数需要执行的语句。第二节C51语言的函数例如定义一个用户函数,用于求三个整数中的最大值,并返回其值,程序如下:intmax(intx,inty,intz){intmax1;if(x>y)max1=x;elsemax1=y;if(z>max1)max1=z;return(max1);}说明:由上面用户函数的定义可知,该函数返回值的类型为int,函数名为max,三个形式参数x、y、z都是int类型。另外,该函数体中还定义了int变量max1,其他语句为求三个整数中最大值的程序段。注意:该用户函数不能单独运行,只有在主函数调用后,才可实际运行。第二节C51语言的函数(二)函数分类C51函数分为主函数、标准库函数、自定义函数。
1.主函数主函数的标准写法是intmain(void)前面的int是main函数的返回值类型,用于向操作系统说明程序的退出状态。返回值为0代表正常退出,1代表异常。形式参数void用于说明主函数main()不需要传递参数2.标准库函数C51编译器提供了丰富的库函数,使得C51语言编程效率高、功能强大。库函数是已经编写好的功能函数,可完成数学计算、输入输出等常用功能。如果在C51编程中需要使用库函数,则应该在程序的开头处使用预处理命令#include包含语句,将所用的库函数头文件包含到程序中来。例如:#include<reg51.h>专用寄存器SFR定义#include<absacc.h>绝对地址定义第二节C51语言的函数3.自定义函数可根据用户需要编写自定义
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年三亚航空旅游职业学院单招职业适应性考试题库附答案详解(a卷)
- 2026年亳州职业技术学院单招职业适应性测试题库及1套完整答案详解
- 2026年云南林业职业技术学院单招职业适应性考试题库附答案详解(培优)
- 2026年上海外国语大学贤达经济人文学院单招职业技能测试题库附答案详解(培优a卷)
- 2026年上饶卫生健康职业学院单招职业技能考试题库及答案详解1套
- 2026年中国计量大学单招综合素质考试题库带答案详解(综合卷)
- 2026年上海财经大学浙江学院单招职业适应性考试题库含答案详解(培优a卷)
- 2026年三门峡社会管理职业学院单招职业倾向性测试题库及一套完整答案详解
- 2026年东营科技职业学院单招职业倾向性测试题库附参考答案详解(突破训练)
- 2026年九江职业技术学院单招职业技能测试题库含答案详解(培优a卷)
- 消防监控证试题及答案
- 过敏性紫癜课件教学课件
- CT的维护保养课件
- LY-T 3398-2024 草原等级评定技术规程
- 住培入科教育体系框架
- JG/T 235-2014建筑反射隔热涂料
- 棋牌室转让合同协议书
- 装饰工程临电临水施工方案
- 吊车租赁合同范本
- 护理团体标准解读-成人氧气吸入疗法护理
- 2024年浙江首考高考英语卷试题真题及答案解析(含听力原文+作文范文)
评论
0/150
提交评论