单片机C51语言基础.ppt_第1页
单片机C51语言基础.ppt_第2页
单片机C51语言基础.ppt_第3页
单片机C51语言基础.ppt_第4页
单片机C51语言基础.ppt_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

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

文档简介

21天学51单片机开发,第四讲:单片机C51语言基础,课程安排,单片机C51语言概述 标识符和关键字 数据类型 分隔符 const修饰符 变量作用域 运算符 表达式,单片机C51语言概述,单片机C51语言是由C语言继承而来的。 和C语言不同的是,C51语言运行于单片机平台,而C语言则运行于普通的桌面平台。 C51语言具有C语言结构清晰的优点,便于学习,同时具有汇编语言的硬件操作能力。 对于具有C语言编程基础的读者,能够轻松地掌握单片机C51语言的程序设计。,单片机C51语言的主要特点,单片机C51语言兼备高级语言与低级语言的优点。 语法结构和标准C语言基本一致,语言简洁,便于学习。 运行于单片机平台,支持的微处理器种类繁多,可移植性好。对于兼容的8051系列单片机,只要将一个硬件型号下的程序稍加修改,甚至不加改变,就可移植到另一个不同型号的单片机中运行。 具有高级语言的特点,尽量减少底层硬件寄存器的操作。 单片机C51语言提供了完备的数据类型、运算符及函数供使用。 C51语言是一种结构化程序设计语言,可以使用一对花括号“”将一系列语句组合成一个复合语句,程序结构清晰明了。 C51语言代码执行的效率方面十分接近汇编语言,且比汇编语言的程序易于理解,便于代码共享。,“Hello world”程序,1 #include /头文件 2 #include 3 void main(void) /主函数 4 5 while(1) /主循环 6 7 printf(“Hello world!rn“); /字符串输出 8 9 ,良好的编程规范,完备和详尽的程序注释 用“/”符号开头来注释一行,如“/变量声明”。 用“/*”符号开头,并以“*/”符号结束。采用这种方法,可以对C51源程序中的任何部分进行注释,如“/*声明整型变量count */”。 整齐的代码书写格式 if、do、while等块结构语句中的“”和“”要配对对齐,这样便于理解该结构的起始点和结束点。 为了程序理解的方便,最好将每个语句单独写在一行,并加以注释。如果相连的语句具有相近的功能,则可以放置在一行。 代码书写时,可以通过适当的空格以及Tab键来实现代码对齐,这样代码整齐美观,便于阅读。 对于源程序文件不同结构部分之间要留有空行来区分。例如,头文件声明、自定义函数声明、main()函数以及自定义函数之间均要空一行。 简洁清晰的命名,标识符和关键字,标识符是用来表示源程序中自定义对象名称的符号。其中的自定义对象可以是常量、变量、数组、结构、语句标号以及函数等。 在C51语言中,标识符可以由字母(az,AZ)、数字(09)和下划线“_”组成,最多可支持32个字符。 C51标识符的定义不是随意的,需要符合一定的规则。 标识符的第一个字符必须是字母或者下划线,不能为数字。 C51的标识符区分大小写,例如“ch1”和“Ch1”表示两个不同的标识符。 用户自定义的标识符不能与系统保留的关键字重复。,关键字,关键字是C51编译器保留的一些特殊标识符,具有特定的含义和用法。 单片机C51程序语言继承了ANSI C标准定义的32个关键字,同时又结合单片机硬件的特点扩展了一些关键字。 详细的C51关键字可以参阅书中列表。,数据类型,在C51语言中,每个变量或者常量在使用前都必须指明数据类型。,变量和常量,变量和常量都是用户自定义使用的数据,不同的是,变量在程序执行过程中可以更改数值,而常量则不可以。 C51常量可以直接使用,但对于变量,则需要首先进行声明。变量声明后,C51编译器在单片机内存中单独划分一定的存储单元,用来存放该变量的值。,char a、n、3 /字符型常量 int 45、123、-110 /整型常量 unsigned int 10010、457、7 /无符号整型常量 long int 35510、-78 /长整型常量 float 115.23、3.14e-3 /浮点型常量,常量,int i,j; /整型变量 char ch; /字符型变量 short int shi; /短整型变量 unsigned int ut; /无符号整型变量 float fset,st; /浮点型变量,变量,整型数据,整型常量也称为整型常数,可以在程序中直接使用。C51语言支持整型常量的十进制、八进制和十六进制表示。 十进制整型常量,以非0开始的数字来表示,例如124、-34等。 八进制整型常量,以0开始的数字来表示,例如07、012等。 十六进制整型常量,以0x或者0X开始的数字和字母(AF,af),例如0x1A、0xFF、0XC0等。 在C51语言中,整型变量按修饰符的不同,可以分为如下几种: unsigned short int:无符号短整型,简写为unsigned int,字长为2字节共16位二进制数,数据的范围是065 535。 signed short int:有符号短整型,简写为short或int,字长为2字节共16位二进制数,数据的范围是-32 76832 767。 unsigned long int:无符号长整型,简写为unsigned long,字长为4字节共32位二进制数,数据的范围是04 294 967 295。 signed long int:有符号长整型,简写为long,字长为4字节共32位二进制数,数据的范围是-2 147 483 6482 147 483 647。,字符型数据,字符型数据用于表示单个字符。 在C51中进一步可以细分为字符型常量、转义字符和字符型变量。 字符型常量是指用一对单引号括起来的单个字符。其中单引号只起定界作用,并不表示字符本身,例如A、5、!等。 字符型常量可以在程序中直接使用。 在单片机内部,字符是以ASCII码的形式保存的。因此,也可以使用ASCII码值来表示字符,例如0x41表示字符A、0x35表示字符5、0x21表示字符!等。,转义字符,转义字符是一种比较特殊的字符,用于表示不可打印或者某些特殊的字符。转义字符用反斜杠“”后面跟一个字符或一个八进制或十六进制数表示。,使用转义字符时的注意事项,转义字符中只能使用小写字母来表示,例如“T”是错误的转义字符。 在C51语言中,每个转义字符只能看作一个字符。 不可打印字符必须用转义字符来表示,例如响铃、换行等。 “v”垂直制表和“f”换页符在屏幕显示时没有任何影响,但是在打印机输出时,会影响到打印机的操作。 使用转义字符“ddd”可以表示任意字符。其中,“ddd”为斜杠后面跟字符所对应的三位八进制ASCII码值。 使用转义字符“xhh”可以表示任意字符。其中,“x”后面跟字符所对应的两位十六进制ASCII码值。,字符型变量,字符型变量是保存字符的变量类型。在C51语言中,可以定义两种类型的字符型变量: 有符号字符变量(char):有符号字符型变量的取值范围为-128127。 无符号字符变量(unsigned char):无符号字符型变量的取值范围是0255。在单片机中,立即寻址方式的寻址空间是程序存储器,也就是说立即寻址方式所操作的立即数是存储在指令字节中的。 在程序中,字符型变量通常和字符型常量一起使用。字符型常量和字符型变量也可以根据其ASCII码值来按照整型数据进行操作。,浮点型数据,浮点型数据是用于表示包含小数点的非整型数据类型。在C51中进一步可以细分为浮点型常量和浮点型变量。 浮点型常量由整数部分、尾数部分和指数部分组成,其值表示为十进制形式。例如13.5、1.2e5、-4.5E-2等等。 一般来说,所有的浮点型常量均默认为float型。 在浮点型常量的指数部分,字母E或e之前必须有数字,表示形式为“数字e数字”。另外,浮点型常量中E或e后面指数必须为整数,例如“e2.1”、“e 3”等都是不合法的指数形式。 在C51语言中,如果浮点型常量的绝对值小于1,则其小数点前面的零可以省略。例如,0.15可以简写为.15,-0.026e-2可以简写为-.026e-2。,浮点型变量,浮点型变量用于保存浮点型数据。 C51语言中支持float、double和long double类型的变量。 由于单片机的资源不同于PC机,因此,C51语言中不具体区分这三种类型。也就是说,这三种浮点类型有相同的精度和取值范围,都将按照float类型对待。 浮点型变量字长为4个字节,共32位二进制数,浮点型变量的取值范围为3.4x10-383.4x10+38。,分隔符,分隔符用于区分或者定界C51程序中不同的数据对象。分隔符广泛应用于各种语句中,可以细分为单分隔符和组合分隔符。 单分隔符是指除字母、数字、下画线以外的单个ASCII字符,如+、-、*、/、!、|、=、.、,、:、;、#等。 典型的单分隔符的使用示例如下: 用“;”进行隔离语句,例如int i, j, k; 用“,”进行隔离,例如char ch1, ch2; 用“*”做指针,例如char *pter; 用“#”做预处理伪指令,例如#define PI 3.1415926; 用“”标识特殊寄存器的位,例如sbit P10=P10。,组合分隔符,组合分隔符是由两个或者两个以上特定字符组合而使用,例如=、(、)等。典型的组合分隔符的使用示例如下: 用“ ”对数组说明,例如char ch =This is a new string!; 用“( )”进行隔离,例如s=Fun(r); 用“”进行隔离复合语句,例如for i=0;i200;i+;,const修饰符,const修饰符用于定义符号常量,一般采用基本数据类型前加const来表示。 程序在编译时,符号常量将其视为一个常量,而不被分配内存空间。当在程序代码中遇到该符号常量时,将用其定义时的初值来代替。 因此,在声明符号常量时,必须对其进行初始化赋值,除非该变量是用extern修饰的全局变量。 在程序中,const修饰符常用于防止程序运行时某些值被意外修改的场合。 另外,通过const修饰符可以方便对于程序中经常使用的数值进行统一修改,便于调试程序。,变量作用域,不同存储类型的变量以及不同位置定义的变量具有不同的代码有效范围,也就是变量的作用域。 在C51语言中,复合语句内部定义的变量仅作用于该复合语句内部。这一点是从标准C语言中继承而来的,读者最为熟悉。 复合语句是任何以花括号“”和“”括起来的一段程序,也称为一个块结构。例如if语句、while语句、自定义的函数等等。 在单片机程序中,按照变量的存储类型,可以分为: 自动变量 全局变量 静态变量 寄存器变量 这四种变量具有不同的作用域范围。,自动变量,自动变量是以关键字auto标识的变量类型,其一般是在函数的内部或者复合语句中使用。 自动变量的定义格式为“auto 类型说明符 变量标识符,变量标识符”。 自动型变量的作用域范围是函数或者复合语句的内部。 在C51中,函数或复合语句内部定义自动变量时,关键字auto可以省略,即默认为自动型变量。 在程序执行过程中,自动变量是动态分配存储空间的。当程序执行到该变量声明语句时,根据变量类型自动为其分配存储空间。当该函数或者复合语句执行完毕后,该变量的存储空间将立刻自动取消,即该自动变量失效。因此,在函数或者复合语句外部将不能够使用该变量。,全局变量,如果一个变量定义在所有函数的外部,即整个程序文件的最前面,那么这个变量便是全局变量。全局变量有时也称为外部变量。 全局变量的作用域是整个程序文件,即全局变量可以被该程序文件中的任何函数使用。 在编译程序时,全局变量将被静态地分配适当的存储空间。该变量一旦分配空间,在整个程序运行过程中便不会消失。 因此,全局变量对整个程序文件都有效。,静态变量,静态变量可以永久占用存储空间。 静态变量以关键字static定义,其定义格式为“static 类型说明符 变量标识符,变量标识符”。 从变量作用域来看,静态变量和自动变量类似,作用域只是定义该变量的函数内部。如果静态变量定义在函数外部,将具有全局的作用域。 而从内存占用的角度,静态变量和全局变量类似,其始终占有内存空间。,寄存器变量,单片机的CPU寄存器中也可以保存少量的变量,这种变量称为寄存器变量。 寄存器变量以关键字register声明,声明格式为“register 类型说明符 变量标识符,变量标识符”。 由于单片机对CPU寄存器的读写十分快,因此寄存器变量的操作速度要原高于其他类型的变量。寄存器变量常用于某一变量名频繁使用的情况,这样做可以提高系统的运算速度。 由于单片机资源有限,程序中只允许同时定义两个寄存器变量。如果多于两个,在编译时会自动地将其他的寄存器变量当做非寄存器变量来处理。,运算符,运算符是用于对数据进行各种运算操作的符号。 C51语言中有如下几类运算符: 算术运算符 关系运算符 逻辑运算符 位运算符 特殊运算符,算术运算符,算术运算符是实现数据之间算术运算的运算符。有如下几种: “-”运算符:进行减法或取负的运算。用于减法时为双目运算符,例如6-1=5。用于取负时为单目运算符,例如-6。 “+”运算符:进行加法运算,双目运算符。例如6+1=7。 “*”运算符:进行乘法运算,双目运算符。例如2*3=6。 “/”运算符:进行除法运算,双目运算符,运算结果为除法结果的整数部分。例如7/2=3。 “%”运算符:进行模运算,为双目运算符。运算结果为除法结果的余数部分。例如7%2=1。另外该运算符不能应用于浮点型数据的操作。 自增运算符“+”:进行自增(增1)运算,表示操作数加1,即x+等同于x=x+1。 自减运算符“-”:进行自减(减1)运算,表示操作数减1,即x-等同于x=x-1。,逻辑运算符,逻辑运算符用于表示操作数之间的逻辑运算。这里的操作数可以是整型数据、浮点型数据,以及字符型数据。而且,操作数可以是变量,也可以是常量。 C51中规定,非零的操作数均按照逻辑真来对待,为零的操作数按照逻辑假来对待。 典型的逻辑运算符有如下几种: 逻辑非运算符!,单目运算符,只需一个操作数,例如!5=0。 逻辑与运算符&,双目运算符,需要两个操作数,例如1&2=1。 逻辑或运算符|,双目运算符,需要两个操作数,例如17|0=1。,关系运算符,关系运算符用于对操作数进行比较,比较的结果为逻辑真TRUE“1”或假FALSE“0”。 关系运算符和逻辑运算符在程序运算中常常在一起联合使用。 在C51语言中,常用的关系运算符有如下几种: “”运算符:用于判断左边的操作数是否大于右边的操作数。 “=”运算符:用于判断左边的操作数是否大于等于右边的操作数。 “”运算符:用于判断左边的操作数是否小于右边的操作数。 “=”运算符:用于判断左边的操作数是否小于等于右边的操作数。 “=”运算符:用于判断左边的操作数是否等于右边的操作数。 “!=”运算符:用于判断左边的操作数是否不等于右边的操作数。,位运算符,位运算符是操作数中的二进制位(bit)进行逐位逻辑处理或移位的运算符。 C51语言中支持位运算符,这是C51语言不同于标准C语言之处,这也展示了其兼具的低级汇编语言的能力。 在C51语言中,常用的位运算符有如下几种: “&”运算符:用于对操作数逐位进行逻辑与(AND)运算。 “|”运算符:用于对操作数逐位进行逻辑或(OR)运算。 “”运算符:用于对操作数逐位进行逻辑异或(XOR)运算。 “”运算符:用于对操作数逐位进行按位取补(NOT)运算。 “”运算符:用于对操作数进行右移运算。 “”运算符:用于对操作数进行左移运算。 在C51语言中,位运算符用于字节或者字数据,对应char和int数据类型。位操作不能用于float、double、long double、void或其他复杂数据类型。,“,”运算符,“,”运算符提供了对多个连续运算的一种简便书写方式。 在使用时,“,”运算符将多个表达式串接在一起,并用括号括起来。 在计算时,按照从左至右的顺序来计算各个表达式,并将最后一个表达式的值作为整个表达式的值来返回。,“?”运算符,“?”运算符提供了对if - then - else语句的一种简便书写方式,其是一种三目运算符。 “?”运算符一般由“?”和“:”将表达式连接起来,其一般形式为EXP1?EXE2:EXP3; “?”运算符在执行的时候,首先计算表达式EXP1值,如果其值为True,则计算表达式EXP2的值,并将其结果作为整个表达式的结果;如果表达式EXP1的值为False,则计算表达式EXP3的值,并将其作为整个表达式的结果。,地址操作运算符,地址操作运算符用于指针类型数据的操作,地址操作运算符主要包括如下两个: “&”运算符:单目运算符,用于获取变量的地址; “*”运算符:单目运算符,用于获取地址中保存的数据值。,其他特殊运算符,联合操作运算符 :为一些特殊赋值语句提供了简化的书写方式 。 sizeof运算符:用于获取变量或者数据类型的长度 。 类型转换运算符:用于对操作数或者表达式的数据类型进行强制转换 。,运算符的优先级,在C51语言中,最常用的运算符优先级规则如下: 算术运算符的优先级由高到低依次为自增自减(+、-)和取负(-)、乘法除法(*、/)和取模(%)、加和减(+、-)。 括号的优先级最高,所以括号会改变计算顺序。 关系运算符和逻辑运算符的相对优先级最高的是!,其次是、=和1+12和表达式10(1+12)计算的结果是一样的。 在关系或逻辑表达式中可以使用括号来修改原计算的优先级顺序。,运算符的优先级,运算符的结合性,运算符的结合性分为左结合性和右结合性两种。 左结合性是指变量(或常量)与左边的运算符结合 右结合性是指变量(或常量)与右边的运算符结合 在C51语言中,一般来说,对于双目运算符均为左结合性,而对于单目运算符和双目运算符则均为右结合性。,表达式,表达式就是用于执行计算的式子。表达式一般采用运算符将各个变量或者常量连接起来,有的时候参与运算的还可以是函数的返回值。 在C51语言中,按照其中运算符的不同可以分为如下几种: 算术表达式 赋值表达式 逗号表达式 关系和逻辑表达式,算术表达式,算术表达式是一类最常用的表达式类型,主要用于执行加(+)、减(-)、乘(*)、除(/)以及取模(%)运算。 算术表达式中可以使用各种算术运算符以及括号,参与运算的可以为变量、常量、函数或者其他表达式。,01 #include /头文件 02 void main() /主函数 03 04 int i,j,x,y,z; /声明变量 05 i=23; 06 j=12; 07 x=i+j; /算术运算 08 y=i-j; /算术运算 09 z=(i+1)/j)%2; /复杂的算术运算 10 printf(“x=%dny=%dnz=%dn“,x,y,z); /输出结果 11 ,赋值表达式,赋值表达式其实在前面的例子中都已经用到,其是由赋值运算符将一个变量和一个表达式连接起来的式子。这里的赋值运算符就是“=”,表达式可以是任意类

温馨提示

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

评论

0/150

提交评论