单片机第四章单片机C程序设计基础课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《单片机第四章单片机C程序设计基础课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 第四 程序设计 基础 课件
- 资源描述:
-
1、第四章第四章 单片机单片机C程序设计基础程序设计基础 4.1 C51程序开发概述 4.2 C51数据类型 4.3 C51运算符和表达式 4.4 C51构造数据类型简介 4.5 C51函数4.6 预处理命令、库函数 4.7 汇编语言与C语言混合编程4.8 模块化程序设计 4.9 51单片机C程序开发过程4.1 C51程序开发概述程序开发概述 在C语言编程中,对数据类型与变量的定义,必须要与单片机的存储结构相关联,否则编译器不能正确地映射定位。C51编译器能自动完成变量的存储单元的分配,编程者可以对常用的接口芯片、功能模块和算法编制通用的驱动函数,可以方便地进行信号处理算法和程序的移植,从而加快单
2、片机开发速度。用C语言编写单片机应用程序与编写标准的C语言程序的不同之处就在于根据单片机存储结构及内部资源定义相应的C语言中的数据类型和变量,其它的语法规定、程序结构及程序设计方法都与标准的C语言程序设计相同。4.2 C51数据类型数据类型n4.2.1 C51的标识符与关键字的标识符与关键字C51与任何高级语言一样,有规定的符号、词汇和语法规则。C51的标识符的意义及用途与标准C相同。关键字是C51已定义的具有固定名称和特定含义的特殊标识符,又称保留字,源程序中用户自己命名的标识符不能和关键字相同。n4.2.2 数据类型数据类型C51常用的基本数据类型有无符号字符型、有符号字符型、无符号整型、
3、有符号整型、无符号长整型、有符号长整型、浮点型、指针,这些类型和标准C相同。需注意在C51编译器中int和short相同,float和double相同,C51扩展的数据类型有bit、sbit、sfr、sfr16。n1char 字符类型字符类型char类型的长度是一个字节,通常用于定义处理字符数据的变量或常量。分无符号字符类型unsigned char和有符号字符类型signed char,默认值为signed char类型。n2int 整型整型int整型长度为两个字节,用于存放一个双字节数据。分有符号int整型数signed int和无符号整型数unsigned int,默认值为signed
4、int类型。n3long 长整型长整型long长整型长度为四个字节,用于存放一个四字节数据。分有符号long长整型signed long和无符号长整型unsigned long,默认值为signed long类型。n 4float 浮点型浮点型float浮点型在十进制中具有7位有效数字,是符合IEEE754标准的单精度浮点型数据,占用四个字节。n5指针型指针型指针型本身就是一个变量,在这个变量中存放的是另一个数据的地址。这个指针变量要占据一定的内存单元,对不同的处理器长度也不尽相同 n6bit 位变量位变量bit位变量是C51编译器的一种扩充数据类型,利用它可定义一个位变量,但不能定义位指针,
5、也不能定义位数组。它的值是一个二进制位,不是0就是1。它的声明与别的C数据类型的声明相似,例如:static bit done_flag=0;/位变量bit testfunc(bit flag1,bit flag2).return(0);/位返回值位函数位参数所有的bit变量都放在80C51内部存储区的可位寻址区,而该区域只有16字节长,所以在某个范围内只能声明最多128个位变量。C51编译器对bit变量的声明及使用有如下限制:1)禁止中断的函数(#pragma disable)和使用一个明确的寄存器组(using n)声明的函数不能返回一个位值。2)一个位不能被声明为一个指针 例如:bit*
6、ptr;/无效的3)不能声明一个bit类型的数组,例如:bit ware5;/无效的n7sfr 特殊功能寄存器特殊功能寄存器sfr也是一种扩充数据类型,占用一个内存单元,值域为0255。利用它可以访问51单片机内部的所有特殊功能寄存器。n8sfr16 16位特殊功能寄存器位特殊功能寄存器sfr16占用两个内存单元,值域为065535。sfr16和sfr一样用于操作特殊功能寄存器,所不同的是它用于操作占两个字节的寄存器,如定时器T0和T1。n9sbit 可寻址位可寻址位sbit是C51中的一种扩充数据类型,利用它可以访问芯片内部的RAM中的可寻址位或特殊功能寄存器中的可寻址位。当用sbit访问内
7、部数据存储区的可位寻址区,则必须要有用bdata存储类型声明的变量并且是全局的,即必须有如下变量声明:int bdata ibase;/可位寻址的整型变量char bdata array4;/可位寻址的字符型数组变量ibase和array是可位寻址的,因此这些变量的每个位是可以直接访问和修改的,故可以用sbit关键字声明新的变量,来访问它们的各个位,例如:sbit Ary07=array07;/数组元素array0的第7位上面的例子只是声明并不分配位空间。例子中“”符号后的表达式指定位的位置,此表达式必须是常数,其范围由声明的基变量决定 4.2.3 数据的存储器类型数据的存储器类型nC51变量
8、定义中的存储器类型部分指定了该变量的存储区域,存储器类型可以由关键字直接声明指定。C51编译器支持的存储器类型如表 表4-1 C51存储器类型4.2.4 常量和变量常量和变量n常量常量常量是在程序运行过程中不能改变的量,常量的数据类型只有整型、浮点型、字符型、字符串型和位标量。常量的数据类型说明方式如下:q1)整型常量可以表示为十进制如123,0,-66等,也可以表示为十六进制,以0 x开头,如0 x12,0 xf4等,长整型在数字后面加字母L,如100L、36L等。q2)浮点型常量可分为十进制和指数表示形式。十进制由数字和小数点组成,如0.456,0.10等整数和小数部分为0,可以省略但必须
9、有小数点。指数表示形式为:数字.数字E数字,中的内容为可选项,如123e4,82e-3等。n3)字符型常量由双引号内的字符组成,如”abc”、”123”等,当引号内没有字符时,为空字符串。在使用特殊字符时,同样要使用转义字符如双引号。在C中字符串常量是作为字符类型数组来处理的,在存储字符串时系统会在字符串尾部加上0(数字”0”,而非字母”o”)转义字符,作为字符串的结束符。字符串常量”A”和字符常量A,是不同的,前者在存储时多占一个字节的空间。n2.变量变量变量是可以在程序运行过程中不断变化的量,变量的定义可以使用所有C51编译器支持的数据类型。格式如下:存储种类 数据类型存储器类型 变量名表
10、在定义格式中除了数据类型和变量名表是必要的,其它都是可选项。存储种类有四种:自动(auto),外部(extern),静态(static)和寄存器(register),缺省类型为自动(auto)。4.2.5 51单片机硬件结构的单片机硬件结构的C51定义定义n1对特殊功能寄存器对特殊功能寄存器SFR的定义的定义51系列单片机内部RAM的80HFFH区域有21个特殊功能寄存器,为了对它们能够进行直接访问,C51编译器利用扩展的关键字sfr和sfr16对这些特殊功能寄存器进行定义。8位特殊功能寄存器变量用关键字sfr说明,定义格式为:sfrSFR名=绝对地址;在新型51系列单片机中,两个8位特殊功能
11、寄存器经常组合为16位寄存器使用,当16位寄存器的高端地址直接位于低端地址之后,就可以定义一个16位特殊功能寄存器变量,定义格式为:sfr16 SFR名=sfr16低端地址;n2特殊功能寄存器中特定位的定义特殊功能寄存器中特定位的定义在C51中可以利用关键字sbit定义可独立寻址访问的位变量,如定义80C51单片机SFR中的一些特定位。定义方法有多种,分别为:)用字节地址位表示例如:sbit CY=0 xd07 2)用寄存器名位定义例如:sfr PSW=0 xd0;sbit CY=PSW7;3)用直接位地址表示例如:sbit OV=0 xd2;sbit CY=0 xd7;4)使用头文件reg5
12、1.h,再直接用位名称例如:#includeTR0=1;EA=1;TF0=0;5)使用头文件及sbit定义符,常用于无位名称的可位寻址位例如:#include sbit p10=P10;sbit a7=ACC7;n3对一般位变量的定义对一般位变量的定义当位变量位于内部RAM的可位寻址区(20H2FH单元)时,可以利用C51编译器提供的bdata存储器类型进行访问,带有bdata类型的变量可以进行字节或位寻址,用sbit指定bdata变量的相应位后就可以进行位寻址。例如:char bdata temp;sbit bit7=temp7;bit7=1;另外,也可以用关键字bit定义普通位变量,此时C
13、51编译器会自行将该位变量定位于可位寻址的bdata区。例如:bit flag;注意注意:不能定义bit类型指针,也不能定义bit类型数组。n4C51对存储器和外接对存储器和外接I/O接口的绝对地址访接口的绝对地址访问问用关键字sfr、sfr16、sbit说明变量就是指定变量的绝对地址,对这些变量的访问就是绝对地址访问。C51程序对绝对地址单元的访问还可以使用宏定义实现:用C51提供的宏定义绝对地址访问头文件absacc.h定义绝对地址变量,可对不同的存储区进行访问。也可以不使用宏定义的方法,直接使用,如:var=XBYTE0 x8000;XBYTE0 x8000=0 x21;4.3 C51运
14、算符和表达式运算符和表达式nC语言的运算符有以下几类:算术运算符、逻辑运算符、位操作运算符、赋值运算符、条件运算符、逗号运算符、关系运算符等。运算符的类型可以分为:单目、双目和多目。单目运算符只有一个操作数;双目运算符有两个操作数;而多目运算符则有多个操作数。n用运算符和括号将运算对象(操作数)连接起来并符合C语言规则的式子称为表达式,C语言有算术表达式、赋值表达式、逗号表达式、关系表达式、逻辑表达式等。n任意一个表达式的后面加一个“;”就构成了一个表达式语句。由运算符和表达式可以构成C51程序的各种语句。4.3.1 赋值运算符赋值运算符n赋值运算符及其说明如表4-1所示 表4-1赋值运算符
15、例4-1 指针的使用方法。程序代码如下:main()idata var1,var2,*p,var3;var1=4;var2=7;var3=5;while(1);4.3.2 算术运算符和算术表达式算术运算符和算术表达式n算术运算符及其说明如表4-2所示 n两个整数相除,结果仍为整数(商),舍去小数部分(余数)。取余运算中,参与运算的两个量必须是整型数,结果为两个数相除之后的余数。n关系表达式的值为逻辑值:真和假。在C51中用0表示假,用1表示真。4.3.4 逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式n逻辑运算符及其说明如表4-3所示 n在逻辑运算中,最基本的是二值逻辑即真和假,而逻辑运算就是以
16、真假逻辑为对象的运算。在以上3种逻辑运算中,逻辑非的优先级最高,且高于算术运算符;逻辑或的优先级最低,低于关系运算符,但高于赋值运算符。n逻辑表达式的值与关系表达式的值相同,均为逻辑值。用0表示假,用1表示真。4.3.5 位运算符和位运算位运算符和位运算nC51提供6种位运算符,如表4-4所示 n移位运算法则如下:对于有符号数,要对符号进行扩展,最高位为符号位,正数的最高位保持为0,而负数的最高位保持为1(除非移位后数据溢出)。对于无符号数移位操作,空缺位直接补0即可。n位运算的优先级顺序为:位取反、左移和右移、位与、位异或、位或。4.3.6 复合运算符及其表达式复合运算符及其表达式n复合运算
17、的运算符及说明如表4-5所示。nC语言中的复合运算符,使得语句的书写更加简洁,符号左边的变量既是源操作数也为目的操作数。4.3 C51控制语句和结构化程序设计控制语句和结构化程序设计4.3.1 C51语句和程序结构语句和程序结构nC51语句是计算机执行的操作指令,一条语句以分号结尾(注意程序中的变量、函数声明部分不称为语句,但也以分号结尾)。C语句有表达式语句、复合语句、控制语句、空语句和函数调用语句等。C语言是一种结构化程序设计语言,从结构上可以把程序分为顺序、选择和循环结构。4.3.2 表达式语句、复合语句和顺序结表达式语句、复合语句和顺序结构程序构程序表达式语句的一般形式为:表达式;例如
18、:x=y+z;/*赋值语句*/i+;/*自加1语句*/顺序结构程序由按顺序执行的多个语句组成,在C语言中,常常将按顺序执行的语句用花括号 括起来构成复合语句,复合语句中每个语句以分号结尾,花括号后不加分号。只有分号,不执行任意操作的语句称为空语句。像赋值语句那样的不包含其他语句的语句,称为简单语句。通常用复合语句描述顺序结构程序。如交换两个变量值的复合语句为:int x,y,temp;/*定义变量*/temp=x;/*3个顺序执行的赋值语句*/x=y;y=temp;4.3.3选择语句和选择结构程序选择语句和选择结构程序nif语句用来判定所给的条件是否满足来决定执行哪种操作。If语句有3中形式。
19、1if语句语句1)if(表达式)语句;表达式一般为关系表达式或逻辑表达式。当表达式的值为非0时执行语句,否则不执行语句。语句可以是简单语句或复合语句。2)if(表达式)语句1;else 语句2;当表达式的值为非零时执行语句1,否则执行语句2。其中的语句1和语句2可以是简单语句或复合语句。3)if(表达式1)语句1;else if(表达式2)语句2;else if(表达式n)语句n;else语句n+1;这种形式的if语句可以实现多种条件的选择。在后两种if语句中,应注意if和else的配对,else总是和最近的if配对,在if语句中可以再包含if语句,构成if语句的嵌套。2条件表达式条件表达式在
20、if(表达式)语句1;else语句2;这种形式中,若语句1、语句2都是给同一个变量赋值,则可以用条件表达式来实现。条件表达式的一般形式为:表达式1?表达式2:表达式3;条件表达式求解时,先求表达式1的值,若非零求解表达式2的值,并作为条件表达式的值,若表达式1的值为0,则求解表达式3的值,并作为条件表达式的值。3switch语句语句switch语句是直接处理多分支的选择语句,其功能类似于51的散转指令JMP A+DPTR。一般形式为:switch(表达式)case 常量表达式1:语句1;case 常量表达式2:语句2;case 常量表达式n:语句n;default:语句n+1;switch语句
21、中的表达式一般为整型或字符型表达式,当表达式的值和某一个case后的常量表达式i相同时,就执行语句i;语句i+1,语句n+1,要使各种情况相互排斥,只执行语句i,应在每个语句后加上退出循环的语句break;若表达式和所有的常量表达式都不匹配,则执行default:语句n+1;。同时要求在switch语句中的所有的常量表达式必须不同。4.3.4循环语句和循环结构程序循环语句和循环结构程序n循环语句有三种:for、while和do while循环语句。其执行过程如下图所示 1while语句语句while语句的一般形式为:while(表达式)语句;其中表达式为循环条件,一般为关系表达式或逻辑表达式,
22、语句为循环体,可以是简单语句、复合语句或空语句。2do-while语句语句do-while语句的一般形式:do语句;/*循环体,可以是简单语句或复合语句*/while(表达式);/*注意此分号不可少,表达式为关系表达式或逻辑表达式*/do-while语句执行循环体语句,再求解表达式值,判断是否退出循环。3for语句语句for语句的一般形式为:for(表达式1;表达式2;表达式3)语句;循环程序由循环变量初始化、循环体、修改循环变量、判断循环终止条件等部分组成。只不过while、do-whlie语句循环变量初始化放在语句的前面,循环变量的修改放在循环体中。而for语句具有循环程序所有部分:for
23、(循环变量赋初值;循环条件;循环控制变量修改)/*循环体,可以是简单语句、语句;复合语句或空语句*/for语句中的表达式1可以有几个表达式,表达式之间用逗号隔开。表达式1也可以省略,但分号不可省略;若表达式2省略(;同样不可省),则不进行条件判断,成为死循环;表达式3也可省略,此时应在循环体中增加修改循环控制变量的语句。4goto语句、语句、break语句和语句和continue语句语句1)goto语句为无条件跳转语句,一般形式为:goto 语句标号;/*goto语句尽量少用,它会使得程序流程无规律,可读性差*/2)break语句用于循环体中,功能是跳出循环体,终止整个循环。一般形式为:bre
24、ak;3)continue语句也用于循环体中,功能为跳过本次循环中尚未执行的语句;继续下一次循环,而不是终止整个循环,一般形式为:continue;4.4 C51构造数据类型简介构造数据类型简介n4.4.1 数组数组数组是一种构造类型的数据,通常用来处理具有相同属性的一批数据。数组中各元素的数据类型必须相同,元素的个数必须固定,数组中的元素按顺序存放,每个元素对应于一个序号(称下标),各元素按下标存取。数组元素下标的个数由数组的维数决定,一维数组有一个下标,二维数组有两个下标。1一维数组的定义一维数组的定义C51数组定义与标准C相比,增加了存储器类型选项,定义的格式如下:数据类型 存储器类型
25、数组名 常量表达式;数据类型指定数据中元素的基类型,存储器类型选项指定存放数组的存储器类型,数组名是一个标识符,其后的是数组的标志,方括号中的常量表达式指定数组元素的个数,不能包含变量,即C51不允许对数组的大小作动态定义。例如:在外部RAM中定义一个存放键盘中的10个键号的数组:unsigned char xdata key10;2一维数组的引用一维数组的引用数组必须先定义,再引用。而且只能逐个引用数组中的元素,不能一次引用整个数组。例4-15 假设已定义的一个数组student_score50中存放了某班所有学生的单科成绩,student_scorei代表相应序号的学生的成绩,可以分别存取
展开阅读全文