




已阅读5页,还剩71页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本章重点: C语言基本语法,51单片机语言特点,单片机语言是标准语言的一个子集,但又有扩充,它有如下特点:标准语言是一种在操作系统平台上运行的编译语言,它可以调用操作系统的底层功能 C51是一种在裸机上运行的C语言编译器。,语言程序举例,例5-1 #include main( ) TMOD=0x20 ; SCON= 0x55; TR=1 ; TH1=0XFD ; TL1=0XFD ; printf(“中国,您好!n“);/函数调用语句 ,C程序特点,必须有一个main函数 main函数是程序入口 include:文件包含命令,通常用于包含函数的头文件 头文件:.h,包含函数原型 注释: /*/:多行注释 /:单行注释,C程序特点,C程序特点,格式化输出函数printf,一般格式: printf(格式字符串,输出项1,输出项2); 格式字符串: %-0m.n格式字符 %:格式说明开始 -:是否左对齐 0:空位是否填0 m:指定输出项输出后占的字符数 n:指定小数位数,格式字符: d: 十进制整数 x或X:十六进制整数 o: 八进制整数 u: 无符号十进制整数 c: 单个字符 s: 字符串 e或E:指数形式 f: 小数形式,C程序特点,语句以分号;结束 :定义函数体或代码块 所有可执行代码必须放在函数体中,5.2 字符 标志符 关键字,5.2.1 语言的字符集 1、字母 小写字母az、大写字母AZ 2、数字 09共10个 3、空白符 空格符、制表符、换行符等统称为空白符。 空白符只在字符常量和字符串常量中起作用 在其它地方出现时,只起间隔作用,编译程序将其忽略,5.2.2 语言词汇,1、标识符 标识符:变量名、函数名、标号 库函数的函数名由系统定义 用户自定义标识符只能是字母、数字、下划线组成的字符串,且第一个字符必须是字母或下划线。 在使用标识符时还必须注意以下几点: 不限制长度 区分大小写,2、关键字 (1) 类型说明符 (2) 语句定义符 (3) 预处理命令字 3、运算符 4、分隔符 5、常量 6、注释符,5.3 数据类型,5.3.1 语言的数据类型 变量必须先说明,后使用 对变量的说明可以包括三个方面: 数据类型、存储类型、作用域 语言数据类型可分为: 基本数据类型 构造数据类型 指针类型 空类型,表5-2 Keil Cx51的数据类型,1、整型量,整型量包括整型常量、整型变量。 整型常量 整型常数有八进制、十六进制和十进制 八进制整常数 前缀为0开头 十六进制整常数 前缀为0X或0x 十进制整常数 无前缀,整型变量的说明 说明形式为: 类型说明符 变量名标识符,.; 例如: int a,b,c; /a,b,c为整型变量 long x,y; /x,y为长整型变量 unsigned int p,q; /p,q为无符号整型 说明: 多个变量之间用逗号分开 语句以分号;结束 一般在函数开始部分说明变量,2、实型量, 实型常量 实型也称为浮点型。实型常量也称为实数或者浮点数。 十进制数形式 0.0 0.25 5.789 300.0 指数形式 2.1E5 (等于2.1*105) 3.7E-2 (等于3.7*10-2) 实型常数不分、双精度,都按双精度double型处理。, 实型变量 实型变量分为两类:单精度型和双精度型,其类型说明符为: float 单精度说明符 double 双精度说明符 C51中单精度型占4个字节,6位有效数字 双精度型占8 个字节,10位有效数字,3、字符型量, 字符常量 字符常量是用单引号括起来的一个字符。 转义字符 转义字符是一种特殊的字符常量。转义字符以反斜线“”开头,后跟一个或几个字符。 常用的转义字符如表5-3所示。,5-3 常用的转义字符及其含义, 字符变量 char a,b; 允许对整型变量赋以字符值,也允许对字符变量赋以整型值。 在输出时,允许把字符变量按整型量输出,也允许把整型量按字符量输出。 整型量为二字节量,字符量为单字节量,当整型量按字符型量处理时,只有低八位字节参与处理。,【例5-7】 main( ) char a,b; a=120; b=121; printf(“%c,%cn%d,%dn“,a,b,a,b); , 字符串常量,字符串常量是由一对双引号括起的字符序列。例如: “CHINA“ , “$12.5“ 字符串常量和字符常量不同。有以下区别: 字符常量由单引号括起来,字符串常量由双引号括起来。 字符常量只能是单个字符,字符串常量则可以含一个或多个字符。 可以把一个字符常量赋予一个字符变量,但不能把一个字符串常量赋予一个字符变量。语言中用字符数组来存放字符串常量。, 字符常量占一个字节的存储空间。字符串常量占的存储空间的字节数等于字符串中字节数加1。增加的一个字节中存放字符0 (ASCII码为0)。这是字符串结束的标志。 例如,字符串“C program“在内存中所占的字节为:C program0。字符常量a和字符串常量“a“虽然都只有一个字符,但在内存中的情况是不同的。a在内存中占一个字节,可表示为:a, “a“在内存中占二个字节,可表示为:a0, 符号常量,符号常量定义形式: #define 标识符 常量,【例5-8】 #define PI 3.14159 void main( ) float s,r; /s,r定义为实数 r=5; /5-r s=PI*r*r; / PI*r*r-s printf(“s=%fn”,s); ,5.3.3. C51编译器扩展数据类型,1、bit位变量 bit位变量的值是0或1,占一位。 2、sfr特殊功能寄存器 sfr占一个字节,分配的内存RAM的地址为0X800XFF,值域为0X000XFF。 用于访问51单片机内部的特殊功能寄存器。 例如: sff P1=0x90; /定义P1为P1端口地址 P1=255; /对P1端口的所有引脚置高电平,3、sfrl6 16位特殊功能寄存器 sfrl6 用于定义存在于80C51单片机内部RAM的16位特殊功能寄存器。通过名字或地址引用的sfrl6地址必须大于80H。 4、sbit可寻址位 sbit是C51中的一种扩充数据类型,利用它可以访问芯片内部的RAM中的可寻址位或特殊功能寄存器中的可寻址位。,5.4 变量的初值和类型转换 5.4.1 变量赋初值 在程序中经常需要对变量赋初值,以便使用变量。程序中可有多种方法为变量提供初值。在变量说明中赋初值的方法称为初始化。这种方法的一般形式为: 类型说明符 变量1=值1,变量2=值2,; 例如: int a=b=c=5; float x=3.2,y=3f,z=0.75; char ch1=K,ch2=P; 应注意,在说明中不允许连续赋值,如a=b=c=5是不合法的。 【例5-9】 void main( ) int a=3,b,c=5; /a3,c5 b=a+c; /ba+c printf(“a=%d,b=%d,c=%dn“,a,b,c); /显示程序运行结果 ,5.4.2 变量类型的转换,1、自动类型转换 规则: 若参与运算量的类型不同,则先转换成同一类型,然后进行运算。 转换按数据长度增加的方向进行,以保证精度不降低。 所有的浮点运算都是以双精度进行 赋值以等号左侧类型为准,【例5-10】 void main( ) float PI=3.14159; int s,r=5; s=r*r*PI; printf(“s=%dn“,s); ,2、强制类型转换 其一般形式为: (类型说明符) (表达式) 其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。 例如: (float) a 把a转换为实型 (int)(x+y) 把x+y的结果转换为整型,在使用强制转换时应注意以下问题: 类型说明符和表达式都必须加括号(单个变量可以不加括号) 无论是强制转换或是自动转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,而不改变数据说明时对该变量定义的类型。,【例5-11】 main( ) float f=5.75; printf(“(int)f=%d,f=%fn“,(int)f,f); float f=5.75; printf(“(int)f=%d,f=%fn“,(int)f,f); ,5.5 变量的存储种类和存储器类型,C51对变量的进行定义的格式如下: 存储种类 数据类型 存储器类型 变量 其中,存储种类和存储器类型是可选项。,5.5.1 存储种类,存储种类是指变量在程序执行过程中的作用范围。 变量的存储种类有四种 自动(auto) 外部(extern) 静态(static) 寄存器(register),5.5.2 存储器类型,定义变量时,除了说明存储种类外,还允许说明变量的存储器类型。存储器类型和存储种类是完全不同的概念,存储器类型指明该变量所处的单片机的内存空间。C51编译器可识别以下存储器类型,如表5-5所示。 表5-5 C51编译器可识别的存储器类型,5.5.3. 存储模式,C51编泽器允许采用三种存储模式:小编译模式SMALL、紧凑编译模式COMPACT、大编译模式LARGE。,5.6 运算符、表达式,5.6.1 基本运算符和表达式 1、运算符的种类 语言的运算符可分为以下几类: 算术运算符 关系运算符 逻辑运算符 用于逻辑运算。包括与(&)、或(|)、非(!)等。 位操作运算符 二进制位进行运算。包括位与(&)、位或(|)、位非()、位异或()、左移()等。 赋值运算符 用于赋值运算,分为简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)和复合位运算赋值(&=,|=,=,=,=)等。,5.6 运算符、表达式,(6)条件运算符 ?: 逗号运算符 用于把若干表达式组合成一个表达式(,)。 指针运算符 用于取内容(*)和取地址(&)二种运算。 求字节数运算符 用于计算数据类型所占的字节数(sizeof)。 特殊运算符 有括号(),下标,成员(,.)等几种,2、优先级和结合性,自左至右的结合方向就称为“左结合性”。 自右至左的结合方向称为“右结合性”。 最典型的右结合性运算符是赋值运算符。如x=y=z,由于“=”的右结合性,应先执行y=z再执行x=(y=z)运算。语言运算符中有不少为右结合性,应注意区别,以避免理解错误。,3、算术运算符和算术表达式 基本的算术运算符 加法运算符“+” 减法运算符“-” 乘法运算符“*” 除法运算符“/” 除法参与运算量均为整型时,结果也为整型,舍去小数。如果运算量中有一个是实型,则结果为双精度实型。, 求余运算符(模运算符)“%” 双目运算,具有左结合性。要求参与运算的量均为整型。 求余运算的结果等于两数相除后的余数。,4、自增,自减运算符,+i i自增1后再参与其它运算。 -i i自减1后再参与其它运算。 i+ i参与运算后,i的值再自增1。 i- i参与运算后,i的值再自减1。,例5-13 void main( ) int i=8; printf(“%dn“,+i); printf(“%dn“,-i); printf(“%dn“,i+); printf(“%dn“,i-); printf(“%dn“,-i+); printf(“%dn“,-i-); ,6、赋值运算符和赋值表达式,简单赋值运算符记为“=”。由“= ”连接的式子称为赋值表达式。其一般形式为: 变量=表达式,例如: x=a+b w=sin(a)+sin(b) a=b=c=5,具体规定如下: 实型赋予整型,舍去小数部分。 整型赋予实型,数值不变,但将以浮点形式存放, 即增加小数部分(小数部分的值为0)。 字符型赋予整型,由于字符型为一个字节, 而整型为二个字节,故将字符的ASCII码值放到整型量的低八位中,高八位为0。 整型赋予字符型,只把低八位赋予字符量。,7、复合赋值符及表达式,复合赋值符: += -= *= = %= = &= |= = 例如: a+=5 等价于a=a+5 x*=y+7 等价于x=x*(y+7) r%=p 等价于r=r%p,8、逗号运算符和逗号表达式,一般形式为: 表达式1,表达式2 其求值过程是分别求两个表达式的值,并以表达式2的值作为整个逗号表达式的值。 void main( ) int a=2,b=4,c=6,x,y; y=(x=a+b),(b+c); printf(“y=%d,x=%d“,y,x); ,9、位操作运算符,按位“与”运算,按位“或”运算 | b3 = b1|b2 b1 = 00011001(0x1B) b2 = 01001101(0x4D) b3 = 01011101(或0x5D)即b3 = 93 按位“异或”运算 b3 = b1b3 b1 = 00011001(0x1B) b2 = 01001101(0x4D) b3 = 01010100(0x54)即b3 = 84,(4)按位取反运算符 w2 = w1,w2为w1二进制按位取反。例如: unsigned int w1 = 0122457,w2; 二进制表示(8进制表示) w1 1010010100101111(0122457) w2 0101101011010000(0055320),(5)左移运算符 左移运算符“”是双目运算符。其功能把“”左边的运算数的各二进位全部左移若干位,由“”右边的数指定移动的位数,高位丢弃,低位补0。例如: a4 把a的各二进位向左移动4位。如a = 00000011(十进制3),左移4位后为00110000(十进制48)。,(6)右移动运算符 右移运算符“”是双目运算符。功能是把“”左边的运算数的各二进位全部右移若干位,由“”右边的数指定移动的位数。 例如:设a = 15, a2 表示把000001111右移为00000011 应该说明的是,对于有符号数,在右移时,符号为将随同移动。当为正数时,最高位补0,而为负数时,符号为为1,最高位是补0或是补1取决于编译系统的规定。Turbo C和很多系统规定为补1。,5.7 C51设计的基本语句,5.7.1 表达式语句 在表达式后面加入分号“;”就构成表达式语句。 空语句:仅由一个分号“;”组成。,5.7.2 复合语句,有若干条语句组合而成的语句叫复合语句。复合语句之间用 分隔,而它内部的各条语句还是需要以分号“;”结束。符合语句的一般形式为: 局部变量定义; 语句1; 语句2; 语句n; ,【例5-17】 复合语句及其局部变量的应用。 #incluide main( ) /主函数体开始 int a,b,c,m,d; /定义变量, a,b,c,m,d a=1;b=2,c=3,d=4; printf(“nX:%d%d%d%d”,a,b,c,d); /复合语句1 int b,m; /定义局部变量b,m,它们仅在复合语句1中有效 b=8; m=100; printf(“nY:%d%d%d|%d,a,b,c,d,m); /复合语句2 int c,n; /定义局部变量c,n,它们仅在复合语句2有效 c=9;n=150; printf(“nZ:%d%d%d%d|%d%d,a,b,c,d,m); /复合语句2结束 printf(“nY:%d%d%d%d|%d,a,b,c,d,m); /复合语句1结束 printf (“n”); ,5.7.3 条件语句,1if(条件表达式)语句 2if(条件表达式)语句1 else 语句2 3if (条件表达式1)语句1 else if (条件表达式2)语句2 else if (条件表达式3)语句3 else if (条件表达式m)语句n else 语句m,【例5-18】,【例5-18】条件语句的使用一求一元二次方程根的程序。 # include # include main( ) float a,b,c,x1,x2; float r,s; a=2.0;b=3.0;c=4.0; r=b*b-4.0*a*c; if (r0.0) s=sqrt(r); x1=(-b+s)/(2.0*a); x2=(-b-s)/(2.0*a); printf(“real:x1=%15.7f,x2=%15.7fn”,x1,x2); else if(r= = 0.0) printf(“double:x1,x2=%15.7fn”,-b/(2.0*a); else x1=-b/(2.0*a); printf(“complex:Re=%15.7f,Im=%15.7fn”,x1,x2); while(1); ,5.7.4 开关语句,开关语句是实现多方向条件分支的语句,其关键字是switch。它的一般形式如下: Switch (表达式) case 常量表达式1:语句1;break; case 常量表达式2:语句2;break; case 常量表达式3:语句3;break; case 常量表达式n:语句n;break; default: 语句 ,【例5-19】,此程序按照输入的年份year和月份month,计算该月有多少天。程序需要判断该年是否为闰年。闰年的2月有29天,平年2月只有28天。闰年的条件是:年份数yca,能被4整除,但不能被100整除;或者年份数year能被400整除。这个条件可以用逻辑关系式来表达: (year%4= =0)&(year%100!=0)| (year%400= =0),# include main( ) int year,month,len; pintf(“Enter year ,5.7.5 循环语句,循环语句有while、do-while、for和goto 1、while语句 while语句用到实现“当型”循环结构,其一般形式如下: while(表达式)语句; 当表达式为非0 值(真)时,执行while语句中的内嵌语句。其特点是:先判断表达式,后执行语句。,【例5-20】用while语句的计算自然数1100的累加和。 #include main( ) int i,s=0; i=1; while(i=100) s=s+i ; i+; printf(“1+2+100=%dn”,s); while(1); ,2do-while语句,do-while语句用来实现“直到型”循环,特点是先执行循环体,然后判断循环条件是否成立。其一般形式如下: do 循环体语句 while(表达式):,2do-while语句,例5-21】用dowhile计算自然数1+2+100 # include main() int i,s=0; i=1; do s=s+i; i+; while(I=100); printf(“1+2+100=%dn”,s); ,3for语句,for语句的一般形式为: for(表达式l;表达式2;表达式3) 语句; 执行过程: 先求解表达式1。 求解表达式2,其值为真,则执行for语句中指定的内嵌语句(循环体),然后执行第(3)步,如果为假,则结束循环。 求解表达式3。 转回上面的第(2)步继续执行。,For语句典型的应用是这样一种形式: for(循环变量初值;循环条件;循环变量增值)语句 如果变量初值在for语句前面赋值,则for语句中的表达式1应省略,其后的分号不能省略 表达式2也可省略,同样不能省略其后的分号 表达式3也可以省略,但此时编程者应该另外设法保证循环能正常结束。 表达式1、2和3都可以省略,即形成如for(;)的形式,它的作用相当于是while(1),构成一个无限循环的过程。,【例5-22】用for语句构成的循环计算自然数1100的累加和。 #include main( ) int i,s=0; for(i=1;i=100;i+) s=s+i; printf(“1+2+100=%dn”,s); while(1); ,4goto语句,goto语句是一个无条件转向语句,它的一般形式为: goto 语句标号; 其语句标号是个带冒号的标识符。常见的是在
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论