第四章C51语法简介.ppt

上传人:sccc 文档编号:5654047 上传时间:2023-08-06 格式:PPT 页数:30 大小:625.51KB
返回 下载 相关 举报
第四章C51语法简介.ppt_第1页
第1页 / 共30页
第四章C51语法简介.ppt_第2页
第2页 / 共30页
第四章C51语法简介.ppt_第3页
第3页 / 共30页
第四章C51语法简介.ppt_第4页
第4页 / 共30页
第四章C51语法简介.ppt_第5页
第5页 / 共30页
点击查看更多>>
资源描述

《第四章C51语法简介.ppt》由会员分享,可在线阅读,更多相关《第四章C51语法简介.ppt(30页珍藏版)》请在三一办公上搜索。

1、第四章 C51语法简介,河工科技瓮嘉民制作,第四章 C51语法简介,第五节 51单片机SFR中可位寻址的单元的位的定义,第四节 直接对51单片机的SFR的定义,第三节 变量定义的格式,第二节 数据与数据类型,第一节 关键字,第六节 51单片机中可位寻址区(0 x200 x2f)的访问,第十一节 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=0 x8

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

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

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

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

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

8、link list _at_ 0 x40;/指定list结构变量从40H开始,其中link 是结构,list是结构变量名xdata char text256 _at_ 0 xE000;/指定text数组从0E000H开始特别提示:如果外部绝对变量是I/O端口等可自行变化数据,需要使用volatile关键字进行描述。3宏定义例:#include#define rval CBYTE0 x0002/rval 指向程序存储器的0002H地址#define rval XBYTE0 x0002/rval 指向外RAM的2sizeof(unsigned int)=0004H地址.,第九节 函数的递归调用与再

9、入函数,在调用一个函数的过程中又间接或直接地调用该函数本身称为函数的递归调用。,再入函数是一种可以在函数体内不直接或间接调用其自身的一种函数,显然再入函数是可以进行递归调用的。,函数类型 函数名(形式参数表)reentrant再入函数可被递归调用,无论何时,包括中断服务函数在内的任何函数都可调用再入函数。,中断服务函数的一般形式为:函数类型 函数名(形式参数表)interrupt n using n,第十节 中断服务函数与寄存器组定义,表4-5 常用中断号与中断向量,编写51单片机中断函数时应遵循以下原则:(1)中断函数不能进行参数传递,如果中断函数中包含任何参数声明,都将导致编译出错。(2)

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

11、项,则由编译器自动选择一个寄存器组作绝对寄存器组访问。另外,由于中断的产生不可预测,中断函数对其他函数的调用可能形成递规调用,需要时可将被中断函数所调用的其他函数定义成再入函数。(5)C51编译器从绝对地址8n+3处产生一个中断向量,其中n为中断号。该向量包含一个到中断函数入口地址的绝对跳转。在对源程序编译时,可用编译控制命令NOINTVECTOR抑制中断向量的产生,从而使用户有能力从独立的汇编程序模块中提供中断向量。,一、算术运算符和算术表达式,1基本算术运算符+加法运算符;-减法(取负)运算符;*乘法运算符;/除法运算符;%取余(模)运算符。在这些运算符中,加、减和乘法符合一般的算术运算规

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

13、转换成同种类型。转换方式有两种情况:一是自动转换,是指编译器在编译时自动进行的类型转换。顺序为:bitcharintlongfloat,signedunsigned。二是强制类型转换,如:(double)a,将a 强制转换为double类型。,二、关系运算符和关系表达式,1关系运算符 大于;=大于等于;=等于;!=不等于关系运算即比较运算。其优先级低于算术运算,高于赋值运算。在以上6种关系运算中,前4种优先级相同,处于高优先级;后2种优先级相同,处于低优先级。,2关系表达式关系表达式的值为逻辑值:真和假。C51中用0表示假,用1表示真。,三、逻辑运算符和逻辑表达式,1逻辑运算符&逻辑与;|逻辑

14、或;!逻辑非 在三种逻辑运算中,逻辑非的优先级最高,且高于算术运算符;逻辑或的优先级最低,低于关系运算符,但高于赋值运算符。,2逻辑表达式 逻辑表达式的值也为逻辑值:真和假。,C51提供6种位运算符:&位与;|位或;位异或;位取反;右移位运算的优先级顺序为:位取反、左移和右移、位与、位异或、位或。,四、位运算符,五、赋值和复合赋值运算符,在C51中共有10种复合运算符:+=加法赋值;-=减法赋值;*=乘法赋值;/=除法赋值;%=取模赋值;=右移位赋值;&=逻辑与赋值;|=逻辑或赋值;=逻辑异或赋值;=逻辑非赋值。,复合赋值运算的一般格式如下:变量 复合运算赋值符 表达式,第十二节 C51流程控

15、制语句,一、C51选择语句,1条件语句条件语句由关键字if构成。有3种条件语句:(1)if(条件表达式)语句若条件表达式的结果为真(非0值),则执行后面的语句;反之若条件表达式的结果为假(0值),则不执行后面的语句。例如:if(P1!=0)w=20;(2)if(条件表达式)语句1 else 语句2若条件表达式的结果为真(非0值),则执行语句1;反之若条件表达式的结果为假(0值),则执行语句2。例如:if(P1!=0)W=20;/真 执行语句1 else W=0;/假 执行语句2(3)if(条件表达式1)语句1 else if(条件表达式2)语句2 else if(条件表达式3)语句3 else

16、 if(条件表达式n)语句n else 语句n+1功能和开关语句switch相似,此种形式的条件语句常用于实现多方向条件分支。,2开关语句开关语句主要用于多分支的场合。一般形式为:switch(表达式)case 常量表达式1:语句1;break;case 常量表达式2:语句2;break;case 常量表达式n:语句n;break;default:语句n+1;开关语句执行时,将switch后面表达式的值与case后面各个常量表达式的值逐个进行比较,若匹配则执行相应case后面的语句,然后执行break语句。break语句的功能是中止当前语句的执行,使程序跳出switch语句。若没有匹配的情况,

17、则执行语句n+1。,二、C51循环语句,1while语句一般形式为:while(条件表达式)语句;/先检查条件,后执行若条件表达式的结果为真(非0值),程序就重复执行后面的语句,一直执行到条件表达式的结果变为假(0值)时为止。这种循环结构是先检查条件表达式给出的条件,再根据检查的结果决定是否执行后面的语句。如果条件表达式的结果一开始就为假,则后面的语句一次也不能执行。,2do-while语句一般形式为:do语句while(条件表达式);/先执行,后检查条件该结构的特点是先执行给定的循环语句,然后再检查条件表达式的结果。当条件表达式的值为真(非0值),则重复执行循环体语句,直到条件表达式的值变为

18、假(0值)时为止。对于此种结构,在任何条件下,循环体语句至少会被执行一次。,3for语句一般形式为:for(初值表达式;条件表达式;更新表达式)语句该语句执行时,先计算初值表达式,作为循环控制变量的初值,再检查条件表达式的结果,当满足条件时就执行循环体语句并计算更新表达式,然后再根据更新表达式的计算结果来判断循环条件是否满足,一直进行到循环条件表达式的结果为假(0值)时退出循环体。,4if语句与goto语句结合利用if语句与goto语句的结合,可以构成循环结构。可以有两种形式:(1)当型循环loop:if(表达式)语句 goto loop;(2)直到型循环loop:语句 if(表达式)goto

19、 loop;,5break和continue语句,(1)break语句前面已介绍过用break语句可以跳出switch结构,使程序继续执行switch结构后面的一个语句。使用break语句还可以从循环体中跳出循环,提前结束循环而接着执行循环结构下面的语句。它不能用在除了循环语句和switch语句之外的任何其它语句中。(2)continue语句continue语句用在循环结构中,用于结束本次循环,跳过循环体中continue下面尚未执行的语句,直接进行下一次是否执行循环的判定。continue语句和break语句的区别在于:continue语句只是结束本次循环而不是终止整个循环;break语句则

20、是结束循环,不再进行条件判断。,6return语句return语句一般放在函数的最后位置,用于终止函数的执行,并控制程序返回调用该函数时所处的位置。返回时还可以通过return语句带回返回值。return语句格式有两种:(1)return;(2)return(表达式);如果return语句后面带有表达式,则要计算表达式的值,并将表达式的值作为函数的返回值。若不带表达式,则函数返回时将返回一个不确定的值。通常我们用return语句把调用函数取得的值返回给主调用函数。,第十三节 C51的指针类型,运算符:*(取内容)和&(取地址)。一般定义形式为:变量=*指针变量 指针变量=&目标变量,char

21、data*P1/*定义指针变量*/P1=30H/*为指针变量赋值,30H为片内RAM地址*/C51编译器支持两种指针类型:一般指针和基于存储器的指针。,一、一般指针,定义指针变量时,若未指定它所指向的对象的存储器类型时,该指针变量就被认为是一般指针。一般指针占用3个字节:第一个字节存放该指针的存储器类型编码(由编译模式的默认值确定),第二和第三个字节分别存放该指针的高位和低位地址偏移量。编码为:,二、基于存储器的指针 定义指针变量时,若指定了它所指向的对象的存储类型时,该指针变量就被认为是基于存储器的指针。基于存储器的指针可以高效访问对象,类型由C51源代码中存储器类型决定,且在编译时确定。由

22、于不必为指针选择存储器,这些指针的长度可以为1个字节(idata*,data*,pdata*)或2个字节(code*,xdata*)。,例如:xdata 类型,地址为0 x1234的指针表示为:第一字节为0 x01,第二字节为0 x12,第三字节为0 x34。,习 题,1C51应用程序具有怎样的结构?2C51支持的数据类型有哪些?3C51支持的存储器类型有哪些?与单片机存储器有何对应关系?4C51有哪几种编译模式?每种编译模式的特点如何?5中断函数是如何定义的?各种选项的意义如何?6C51应用程序的参数传递有哪些方式?特点如何?7一般指针与基于存储器的指针有何区别?8关键字bit与sbit的意义有何不同?9单片机汇编程序与C51程序在应用系统开发上有何特点?,OVER!,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号