资源预览内容
第1页 / 共53页
第2页 / 共53页
第3页 / 共53页
第4页 / 共53页
第5页 / 共53页
第6页 / 共53页
第7页 / 共53页
第8页 / 共53页
第9页 / 共53页
第10页 / 共53页
亲,该文档总共53页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
2,3,4,C语言编程的基本概念和知识,5,1标识符,标识符是用来表示源程序中自定义对象名称的符号。其中的自定义对象可以是常量、变量、数组、结构、语句标号以及函数等。 在C51语言中,标识符可以由字母(az,AZ)、数字(09)和下划线“_”组成,最多可支持32个字符。,C51标识符的定义不是随意的,应遵循“简洁”和“见名知意”的原则,并需要符合一定的规则: 标识符的第一个字符必须是字母或者下划线,不能为数字。由于有些编译系统专用的标识符以下划线开头,所以用户在定义标识符时一般不要以下划线开头。 C51的标识符区分大小写,例如“ch1”和“Ch1”表示两个不同的标识符。 用户自定义的标识符不能与系统保留的关键字重复。,6,2关键字,关键字是C51编译器保留的一些特殊标识符,具有特定的含义和用法。 单片机C51程序语言继承了ANSI C标准定义的32个关键字,如表7-1所示。,表7-1 C51的关键字,同时C51又结合单片机硬件的特点扩展了19个关键字: _at_ idata sfr16 alien interrupt small bdata large _task_ code bit pdata using reentrant xdata compact sbit data sfr,7,表7-2列出了Keil uVision2 C51编译器所支持的数据类型。,表7-2 C51编译器所支持的数据类型,8,1char字符类型 char类型的长度是一个字节,通常用于定义处理字符数据的变量或常量。char字符类型分为无符号字符类型(unsigned char)和有符号字符类型(signed char),默认值为signed char类型。 unsigned char类型用字节中所有的位来表示数值,可以表达的数值范围是0255;signed char类型中字节最高位表示数据的符号,“0”表示正数,“1”表示负数(负数用补码表示),所能表示的数值范围是-128+127。,9,2int整型 int整型长度为两个字节,用于存放一个双字节数据。分为有符号整型数signed int和无符号整型数unsigned int,默认值为signed int类型。 signed int表示的数值范围是-32768+32767,字节中最高位表示数据的符号,“0”表示正数,“1”表示负数;unsigned int表示的数值范围是065535。,3long长整型 long长整型长度为四个字节,用于存放一个四字节数据。分有符号长整型signed long和无符号长整型unsigned long,默认值为signed long类型。 signed int表示的数值范围是-2147483648+2147483647,字节中最高位表示数据的符号,“0”表示正数,“1”表示负数;unsigned long表示的数值范围是04294967295。,10,11,9sbit可位寻址位 sbit是C51中的一种扩充数据类型,利用它可以访问芯片内部的RAM中的可寻址位或特殊功能寄存器中的可寻址位。 定义格式:sbit 变量名=位地址;sbit 变量名=SFR地址位序号;sbit 变量名=sfr16变量位序号。 因P1端口的寄存器是可位寻址的,所以我们可以定义P1_1为P1中的P1.1引脚,同样我们可以用P1.1的地址去写,这样在以后的程序语句中就可以用P1_1来对P1.1引脚进行读写操作了。 例如: sbit P1_1=P11; sbit P1_1=0x91;,8sfr16 16位特殊功能寄存器 sfr16是一种扩充数据类型,占用两个内存单元,sfr16和sfr一样用于操作特殊功能寄存器,所不同的是,此类型的变量可访问16为特殊功能寄存器。 定义格式:sfr16 变量名=变量地址。 此处的变量地址为16位中的低8位地址,其地址范围为0x800xFF。通过sfr16变量读16位特殊功能寄存器时,先读低字节,后读高字节;写特殊功能寄存器时先写高字节,后写低字节。,12,(2)浮点型常量 浮点型常量可分为十进制和指数表示形式。 十进制浮点型常量由数字和小数点组成,整数或小数部分为0,可以省略但必须有小数点,如0.888,3345.345,0.0等。 指数浮点型常量表示形式为:数字.数字e数字 中的内容为可选项,如125e3,7e9,-3.0e-3等。,1常量 常量是在程序运行过程中不能改变的量,如固定的数据表、字符等。常量的数据类型只有整型、浮点型、字符型、字符串型和位标量。,(1)整型常量 不同数据类型的整型常量表示方法不同,十进制如123,0,-89等;十六进制则以0x开头如0x34,-0x3B等;长整型就在数字后面加字母L,如104L,034L,0xF340等。,13,1常量 常量是在程序运行过程中不能改变的量,如固定的数据表、字符等。常量的数据类型只有整型、浮点型、字符型、字符串型和位标量。,(3)字符型常量 字符型常量是单引号内的字符,如a,d等。表示不显示的控制字符,可以在该字符前面加一个反斜杠“”组成专用转义字符,常用转义字符如表7-3所示。,表7-3 常用转义字符表,14,1常量 常量是在程序运行过程中不能改变的量,如固定的数据表、字符等。常量的数据类型只有整型、浮点型、字符型、字符串型和位标量。,(4)字符串型常量 字符串型常量由双引号内的字符组成,如“test”,“OK”等。当引号内没有字符时,为空字符串。 在C中字符串常量是做为字符类型数组来处理的,在存储字符串时系统会在字符串尾部加上“0”转义字符以作为该字符串的结束符。字符串常量“A”和字符常量A是不同的,前者在存储时多占用一个字节的空间。,15,(5)位标量 位标量是C51编译器的一种扩充数据类型,它的值是一个二进制位,不是0就是1。下面我们来看一些常量定义的例子: #define False 0x0; /用预定义语句可以定义常量,这里定义False为0,True 为1 #define True 0x1; /在程序中用到False编译时自动用0替换,同理True替换为1 unsigned int code a=100; /这一句用code把a定义在程序存储器中并赋值 const unsigned int c=100; /用const定义c为无符号int常量并赋值 以上两句它们的值都保存在程序存储器中,而程序存储器在运行中是不允许被修改的,所以如果在这两句后面用了类似a=110,a+这样的赋值语句,编译时将会出错。,1常量 常量是在程序运行过程中不能改变的量,如固定的数据表、字符等。常量的数据类型只有整型、浮点型、字符型、字符串型和位标量。,16,2变量,17,(1)变量的定义和作用范围 定义一个变量的格式如下: 存储类型 数据类型 存储器类型 变量名表 在定义格式中除了数据类型和变量名表是必要的,其他都是可选项。 存储类型 不同存储类型的变量以及不同位置定义的变量具有不同的代码有效范围,也就是变量的作用域。在单片机程序中,按照变量的存储类型,可以分为:自动变量、全局变量、静态变量和寄存器变量。,2变量,18,存储类型,19,存储器类型,存储器类型的说明就是指定该变量在C51硬件系统中所使用的存储区域,并在编译时准确的定位。表7-4中是KEIL uVision2所能认别的存储器类型。,表7-4 存储器类型,20,如果省略存储器类型,系统则会按编译模式small,compact或large所规定的默认存储器类型去指定变量的存储区域。,21,对变量进行绝对定位,C51扩展的关键字_at_专门用于对变量作绝对定位,_at_使用在变量的定义中,其格式为: 存储类型 数据类型 存储区 变量名1 _at_ 地址常数,变量名2,例如: 对data区域中的 unsigned char变量aa作绝对定位: unsigned char data aa _at_ 0x30; 对pdata区域中的 unsigned int数组cc作绝对定位: unsigned int pdata cc10 _at_ 0x34; 对xdata区域中的 unsigned char变量printer_port作绝对定位: unsigned char xdata printer_port _at_ 0x7fff;,22,对变量进行绝对定位,对变量绝对定位的几点说明:,23,(2)变量的初始化和赋值,变量的初始化,变量的初始化是指变量在被说明的同时赋给一个初值。外部变量和静态全程变量在程序开始处被初始化,局部变量包括静态局部变量是在进入定义它们的函数或复合语句时才作初始化。所有全程变量在没有明确的初始化时将被自动清零,而局部变量和寄存器变量在未赋值前其值是不确定的。,对于外部变量和静态变量,初值必须是常数表达式,而自动变量和寄存器变量可以是任意的表达式,这个表达式可以包括常数和前面说明过的变量和函数。,24,例如:,float f0,f1=0.2; /定义全程变量,在初始化时f0被清零,f1被赋0.2 main() static int i=10,j; /定义静态局部变量,初始化时i被赋10,j不确定 int k=i*5; /定义局部变量,初始化时k 被赋10*5=50 char c=y; /定义字符型指什变量并初始化 ,变量的初始化,25,变量的赋值,变量赋值是给已说明的变量赋给一个特定值。 单个变量的赋值: 整型变量和浮点变量。 赋值格式如下: 变量名=表达式;,例如:,main() int a,m; /定义局部整型变量a,m float n; /定义局部浮点变量n a=100,m=20; /给变量赋值 n=a*m*0.1; ,main() int a,b,c; a=b=c=0; /同时给a,b,c赋值 ,26,变量的赋值, 字符型变量。 字符型变量可以用三种方法赋值。,例如:,main() char a0,a1,a2; /定义局部字符型变量a0,a1,a2 a0=b; /将字母b赋给a0 a1=50; /将十进制数字2的ASCII值50赋给a1 a2=x0d; /将回车符赋给a2 ,27,28,29,单片机C程序的运算符和表达式如下:,30,算术运算符是执行算术运算时的操作符,包括四则运算和取模运算符,如表7-5所示。,表7-5 算术运算符,31,关系运算符用来对两个变量的大小进行判断的,如表7-6所示。,表7-6 关系运算符,32,逻辑运算符就是执行逻辑运算功能的操作符号,包括与(AND)、或(OR)、非(NOT),逻辑运算的最终结果为真(值为1)或假(值为0),如表7-7所示。,表7-7 逻辑运算符,33,布尔“位”运算符与逻辑运算符比较相似,不同之处在于逻辑运算的最终结果为真或假,而布尔“位”运算符的结果是一个具体数据。布尔“位”运算符如表7-8所示。,表7-8 布尔“位”运算符,34,赋值运算符包括“=”运算符,还有算术运算符,逻辑运算符等,如表7-9所示。,表7-9 赋值运算符,35,递增/递减运算符也是一种比较有效的运算符,包括自增与自减运算符,如表7-10所示。,表7-10 递增/递减运算符,36,运算符的优先级如表7-11所示。,表7-11 运算符的优先级,37,38,39,循环指令就是将程序流控制在指定的循环里,直到符合指定条件才结束循环,继续往下执行。Keil C所提供的循环指令有for语句、while语句、do-while语句。,1计数循环,for语句是一个很实用的计数循环,其格式如下: for(表达式1;表达式2;表达式3) 指令; break; 例如: for(int i=0;i0;x-) fo
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号