分享
分享赚钱 收藏 举报 版权申诉 / 30

类型第四章_C51语法简介.ppt

  • 上传人:jinchen
  • 文档编号:8701537
  • 上传时间:2019-07-08
  • 格式:PPT
  • 页数:30
  • 大小:625.50KB
  • 配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    第四章_C51语法简介.ppt
    资源描述:

    1、第四章 C51语法简介,河工科技 瓮嘉民制作,第四章 C51语法简介,第五节 51单片机SFR中可位寻址的单元的位的定义,第四节 直接对51单片机的SFR的定义,第三节 变量定义的格式,第二节 数据与数据类型,第一节 关键字,第六节 51单片机中可位寻址区(0x200x2f)的访问,第十一节 C51的运算符和表达式,第十节 中断服务函数与寄存器组定义,第九节 函数的递归调用与再入函数,第八节 51单片机外扩I/O的访问,第七节 关键字bit和sbit区别,第十二节 C51流程控制语句,第十三节 C51的指针类型,第一节 关键字,表4-1 ANSI C标准的关键字,表4-1 ANSI C标准的关

    2、键字 续表,表4-2 C51编译器的扩展关键字,第二节 数据与数据类型,数据具有一定格式的数字或数值叫做数据。 数据类型数据的不同格式叫做数据类型。 数据结构数据按一定的数据类型进行的排列、组合构架称为数据结构。,表4-3 Keil Vision2 C51编译器能够识别的数据类型,第三节 C51中变量定义的格式,C51中对变量进行定义的格式,表4-4 Keil C51编译器所能识别的存储器类型,存储器模式SMALL、COMPACT或LARGE来规定默认存储器类型, 确定变量的存储器空间,第四节 C51中直接对51单片机的SFR的定义,sfr 特殊功能寄存器名 地址常数; 例如: sfr P0

    3、= 0x80 ;/定义I/O口P0,其地址为0x80,注意:(1)sfr后面必须跟一个标识符作为寄存器名,名字可任意选取, 但应符合一般习惯。,(2)等号后面必须是常数,不允许有带运算符的表达式,而该常数必须在SFR的地址范围之内(0x800xff)。,(3)新一带8051单片机,SFR经常组合成16位来使用。采用关键字sfr16 来定义。例如对8052的定时器T2,可采用如下方法定义:sfr16 T2 = 0xcc; /定义TIMER2,其地址为T2L=0xcc,T2H=0xcd,第五节 C51中对51单片机的SFR中可位寻址的单元的位的定义,方法3:sbit 位变量名字节地址位位置;这种方

    4、法以一个整常数作为基地址,该值必须在0x800xff之间。“位位置”是一个0 7之间的常数。 例如:sbit OV=0XD02;sbit CY=0XD07;,定义方法有如下三种:,方法1: sbit 位变量名 位地址 ;该方法将位的绝对地址赋给位变量, 位地址必须位于0x800xff之间。 例如: sbit OV=0xd2;sbit CY=0xd7;,方法2:sbit 位变量名特殊功能寄存器名位位置;当可寻址位位于SFR时,可采用这种方法。特殊功能寄存器名必须是已定义的SFR的名字。“位位置”是一个07之间的常数。 例如: sfr PSW=0xd0; /定义特殊功能寄存器名字 sbit OV

    5、= PSW2; /定义特殊功能寄存器中的位 sbit CY=PSW7; /定义特殊功能寄存器中的位,第六节 C51对51单片机中可位寻址区(0x200x2f)的访问,C51编译器提供了一个bdata存储器类型,允许将具有bdata类型的对象放入51片内可位寻址区。例如: int bdata ibase; /在位寻址区定义一个整型变量ibasechar bdata bary4;/在位寻址区定义一个数组bary4使用关键字sbit 可独立访问可位寻址对象中的某一位。 例如:sbit mybit0=ibase0;,第七节 关键字bit 与sbit区别,sbit是一个独立的关键字。 bit是C51编译

    6、器的一种扩充数据类型,用来定义一个普通位变量,它的值是二进制数的0或1。 一个函数中可包含bit类型的参数,函数的返回值也可以为bit类型。,例如:static bit direction_bit; /定义一个静态位变量direction_bit extern bit lock_prt_port; /定义一个外部位变量lock_prt_port bit func(bit b0,bit b1) /*语句*/return (b1);,不能定义位指针,如不能定义: bit *bit_pointer; 也不能定义位数组,如不能定义:bit b_array;,第八节 51单片机外扩I/O口的访问,访问外

    7、部I/O口的方法有三种。 1绝对宏 在程序中,用“#include”即可使用其中定义的宏来访问绝对地址,包括:CBYTE,XBYTE,PWORD,DBYTE,CWORD,XWORD,PBYTE,DWORD 具体使用可看一看Keil C51中的absacc.h头文件便知。例如:rval=CBYTE0x0002; / rval指向程序存储器的0002H地址rval=XWORD0x0002; / rval指向外RAM的2 sizeof (unsigned int) = 0004H地址 2_at_关键字 直接在数据定义后加上_at_ const 即可,但是注意: (1)绝对变量不能被初始化; (2)b

    8、it型函数及变量不能用_at_指定。例如: idata struct link list _at_ 0x40 ; /指定list结构变量从40H开始,其中link 是结构,list是结构变量名 xdata char text256 _at_ 0xE000;/指定text数组从0E000H开始 特别提示:如果外部绝对变量是I/O端口等可自行变化数据,需要使用volatile关键字进行描述。 3宏定义 例:#include #define rval CBYTE0x0002 / rval 指向程序存储器的0002H地址 #define rval XBYTE0x0002 / rval 指向外RAM的2

    9、 sizeof (unsigned int) = 0004H地址.,第九节 函数的递归调用与再入函数,在调用一个函数的过程中又间接或直接地调用该函数本身称为函数的递归调用。,再入函数是一种可以在函数体内不直接或间接调用其自身的一种函数,显然再入函数是可以进行递归调用的。,函数类型 函数名(形式参数表) reentrant 再入函数可被递归调用,无论何时,包括中断服务函数在内的任何函数都可调用再入函数。,中断服务函数的一般形式为:函数类型 函数名(形式参数表)interrupt n using n,第十节 中断服务函数与寄存器组定义,表4-5 常用中断号与中断向量,编写51单片机中断函数时应遵循

    10、以下原则: (1)中断函数不能进行参数传递,如果中断函数中包含任何参数声明,都将导致编译出错。 (2)中断函数没有返回值,如果企图定义一个返回值,将得不到正确的结果。因此建议在定义中断函数时将其定义为void类型,以明确说明没有返回值。 (3)在任何情况下,都不能直接调用中断函数,否则会产生编译错误。因为中断函数的退出是由51单片机指令RETI完成的,RETI指令影响51单片机的硬件中断系统。如果在没有实际中断请求的情况下直接调用中断函数,则RETI指令的操作结果会产生一个致命的错误。 (4)如果在中断函数中调用其他函数,则被调用函数所使用的寄存器组必须与中断中断函数相同。用户必须保证按要求使

    11、用相同的寄存器组,否则会产生不正确的结果,这一点必须引起足够的注意。如果定义中断函数时没有使用using选项,则由编译器自动选择一个寄存器组作绝对寄存器组访问。另外,由于中断的产生不可预测,中断函数对其他函数的调用可能形成递规调用,需要时可将被中断函数所调用的其他函数定义成再入函数。 (5)C51编译器从绝对地址8n+3处产生一个中断向量,其中n为中断号。该向量包含一个到中断函数入口地址的绝对跳转。在对源程序编译时,可用编译控制命令NOINTVECTOR抑制中断向量的产生,从而使用户有能力从独立的汇编程序模块中提供中断向量。,一、算术运算符和算术表达式,1基本算术运算符 + 加法运算符; -

    12、减法(取负)运算符; * 乘法运算符; / 除法运算符; % 取余(模)运算符。在这些运算符中,加、减和乘法符合一般的算术运算规则。除法运算时,如果是两个整数相除,其结果为整数,舍去小数部分;如果是两个浮点数相除,其结果为浮点数。而对于取余运算,则要求两个运算对象均为整型数据。 求一个算术运算表达式的值时,要依运算符的优先级进行。算术运算符中取负运算优先级最高,其次为乘法、除法和取余,加法和减法优先级最低。也可以根据需要,在算术表达式中采用括号来改变运算符的优先级。,第十一节 C51的运算符和表达式,2自增、自减运算符,+ 自增运算符;- 自减运算符 +和-运算符只能用于变量,不能用于常量和表

    13、达式。如,+j表示j先加1,再取表达式的值;j+表示先取表达式的值,j再加1。自减运算类同。,3类型转换运算符两侧的数据类型不同时,要转换成同种类型。转换方式有两种情况: 一是自动转换,是指编译器在编译时自动进行的类型转换。顺序为:bitcharintlongfloat,signedunsigned。 二是强制类型转换,如:(double)a ,将a 强制转换为double类型。,二、关系运算符和关系表达式,1关系运算符大于;= 大于等于; = = 等于; != 不等于 关系运算即比较运算。其优先级低于算术运算,高于赋值运算。 在以上6种关系运算中,前4种优先级相同,处于高优先级;后2种优先级

    14、相同, 处于低优先级。,2关系表达式 关系表达式的值为逻辑值:真和假。C51中用0表示假,用1表示真。,三、逻辑运算符和逻辑表达式,1逻辑运算符& 逻辑与; | | 逻辑或; ! 逻辑非在三种逻辑运算中,逻辑非的优先级最高,且高于算术运算符; 逻辑或的优先级最低,低于关系运算符,但高于赋值运算符。,2逻辑表达式逻辑表达式的值也为逻辑值:真和假。,C51提供6种位运算符: & 位与;| 位或; 位异或; 位取反; 右移 位运算的优先级顺序为:位取反、左移和右移、位与、位异或、位或。,四、位运算符,五、赋值和复合赋值运算符,在C51中共有10种复合运算符: += 加法赋值; - = 减法赋值;*=

    15、 乘法赋值; /= 除法赋值; %= 取模赋值; = 右移位赋值;&= 逻辑与赋值;|= 逻辑或赋值; = 逻辑异或赋值;= 逻辑非赋值。,复合赋值运算的一般格式如下: 变量 复合运算赋值符 表达式,第十二节 C51流程控制语句,一、C51选择语句,1条件语句 条件语句由关键字if构成。有3种条件语句: (1)if(条件表达式)语句 若条件表达式的结果为真(非0值),则执行后面的语句;反之若条件表达式的结果为 假(0值),则不执行后面的语句。 例如: if(P1!= 0) w=20; (2)if(条件表达式)语句1 else 语句2 若条件表达式的结果为真(非0值),则执行语句1;反之若条件表

    16、达式的结果为假 (0值),则执行语句2。 例如:if(P1!= 0) W=20; / 真 执行语句1 else W=0; / 假 执行语句2 (3)if (条件表达式1)语句1 else if (条件表达式2)语句2else if (条件表达式3)语句3 else if (条件表达式n)语句nelse 语句n+1 功能和开关语句switch相似,此种形式的条件语句常用于实现多方向条件分支。,2开关语句 开关语句主要用于多分支的场合。一般形式为: switch (表达式) case 常量表达式1:语句1; break; case 常量表达式2:语句2; break; case 常量表达式n:语句

    17、n; break; default : 语句n+1; 开关语句执行时,将switch后面表达式的值与case后面各个常量表达式的值逐个进 行比较,若匹配则执行相应case后面的语句,然后执行break语句。 break语句的功能是中止当前语句的执行,使程序跳出switch语句。若没有匹配的情况,则执行语句n+1。,二、C51循环语句,1while语句 一般形式为:while(条件表达式)语句;/先检查条件,后执行 若条件表达式的结果为真(非0值),程序就重复执行后面的语句,一直执行到条件表 达式的结果变为假(0值)时为止。这种循环结构是先检查条件表达式给出的条件, 再根据检查的结果决定是否执行

    18、后面的语句。如果条件表达式的结果一开始就为假, 则后面的语句一次也不能执行。,2do-while语句 一般形式为: do语句while(条件表达式);/先执行,后检查条件 该结构的特点是先执行给定的循环语句,然后再检查条件表达式的结果。当条件表达 式的值为真(非0值),则重复执行循环体语句,直到条件表达式的值变为假(0值) 时为止。对于此种结构,在任何条件下,循环体语句至少会被执行一次。,3for语句 一般形式为:for(初值表达式;条件表达式;更新表达式) 语句 该语句执行时,先计算初值表达式,作为循环控制变量的初值,再检查条件表达式的 结果,当满足条件时就执行循环体语句并计算更新表达式,然

    19、后再根据更新表达式的 计算结果来判断循环条件是否满足,一直进行到循环条件表达式的结果为假(0值)时 退出循环体。,4if语句与goto语句结合 利用if语句与goto语句的结合,可以构成循环结构。可以有两种形式: (1)当型循环 loop: if(表达式) 语句goto loop; (2)直到型循环 loop: 语句if(表达式) goto loop;,5break和continue语句,(1)break语句 前面已介绍过用break语句可以跳出switch结构,使程序继续执行switch结构后面的 一个语句。使用break语句还可以从循环体中跳出循环,提前结束循环而接着执行 循环结构下面的语

    20、句。它不能用在除了循环语句和switch语句之外的任何其它语句中。 (2)continue语句 continue语句用在循环结构中,用于结束本次循环,跳过循环体中continue下面尚未 执行的语句,直接进行下一次是否执行循环的判定。 continue语句和break语句的区别在于:continue语句只是结束本次循环而不是终止整 个循环;break语句则是结束循环,不再进行条件判断。,6return语句 return语句一般放在函数的最后位置,用于终止函数的执行,并控制程序返回调用该 函数时所处的位置。返回时还可以通过return语句带回返回值。return语句格式有两种: (1)retur

    21、n; (2)return (表达式) ; 如果return语句后面带有表达式,则要计算表达式的值,并将表达式的值作为函数的 返回值。若不带表达式,则函数返回时将返回一个不确定的值。 通常我们用return语句把调用函数取得的值返回给主调用函数。,第十三节 C51的指针类型,运算符:*(取内容)和&(取地址)。 一般定义形式为:变量 = * 指针变量指针变量 = & 目标变量,char data *P1 /* 定义指针变量 */ P1 = 30H /* 为指针变量赋值,30H为片内RAM地址 */ C51编译器支持两种指针类型:一般指针和基于存储器的指针。,一、一般指针,定义指针变量时,若未指定

    22、它所指向的对象的存储器类型时,该指针变量就被认为是 一般指针。一般指针占用3个字节:第一个字节存放该指针的存储器类型编码 (由编译模式的默认值确定),第二和第三个字节分别存放该指针的高位和低位地址偏移量。 编码为:,二、基于存储器的指针 定义指针变量时,若指定了它所指向的对象的存储类型时,该指针变量就被认为是基 于存储器的指针。基于存储器的指针可以高效访问对象, 类型由C51源代码中存储器类型决定,且在编译时确定。由于不必为指针选择存储器, 这些指针的长度可以为1个字节(idata *,data *,pdata *)或2个字节(code *,xdata *)。,例如:xdata 类型,地址为0x1234的指针表示为: 第一字节为0x01, 第二字节为0x12, 第三字节为0x34。,习 题,1C51应用程序具有怎样的结构? 2C51支持的数据类型有哪些? 3C51支持的存储器类型有哪些?与单片机存储器有何对应关系? 4C51有哪几种编译模式?每种编译模式的特点如何? 5中断函数是如何定义的?各种选项的意义如何? 6C51应用程序的参数传递有哪些方式?特点如何? 7一般指针与基于存储器的指针有何区别? 8关键字bit与sbit的意义有何不同? 9单片机汇编程序与C51程序在应用系统开发上有何特点?,OVER !,

    展开阅读全文
    提示  道客多多所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:第四章_C51语法简介.ppt
    链接地址:https://www.docduoduo.com/p-8701537.html
    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    道客多多用户QQ群:832276834  微博官方号:道客多多官方   知乎号:道客多多

    Copyright© 2025 道客多多 docduoduo.com 网站版权所有世界地图

    经营许可证编号:粤ICP备2021046453号    营业执照商标

    1.png 2.png 3.png 4.png 5.png 6.png 7.png 8.png 9.png 10.png



    收起
    展开