单片机C51语言关键字的解释和运算优先级及结合性
- 格式:pdf
- 大小:86.41 KB
- 文档页数:4
附表1-2C51编译器的扩展关键字关键字用途说明auto 存储种类说明用以说明局部变量,缺省值为此break 程序语句退出最内层循环case 程序语句Switch语句中的选择项char 数据类型说明单字节整型数或字符型数据const 存储类型说明在程序执行过程中不可更改的常量值continue 程序语句转向下一次循环default 程序语句Switch语句中的失败选择项do 程序语句构成do..while循环结构double 数据类型说明双精度浮点数else 程序语句构成if..else选择结构enum 数据类型说明枚举extern 存储种类说明在其他程序模块中说明了的全局变量flost 数据类型说明单精度浮点数for 程序语句构成for循环结构goto 程序语句构成goto转移结构if 程序语句构成if..else选择结构int 数据类型说明基本整型数long 数据类型说明长整型数register 存储种类说明使用CPU内部寄存的变量return 程序语句函数返回short 数据类型说明短整型数signed 数据类型说明有符号数,二进制数据的最高位为符号位sizeof 运算符计算表达式或数据类型的字节数static 存储种类说明静态变量struct 数据类型说明结构类型数据swicth 程序语句构成switch选择结构typedef 数据类型说明重新进行数据类型定义union 数据类型说明联合类型数据unsigned 数据类型说明无符号数数据void 数据类型说明无类型数据volatile 数据类型说明该变量在程序执行中可被隐含地改变while 程序语句构成while和do..while循环结构附表1-1ANSIC标准关键字关键字用途说明bit 位标量声明声明一个位标量或位类型的函数sbit 位标量声明声明一个可位寻址变量Sfr 特殊功能寄存器声明声明一个特殊功能寄存器Sfr16 特殊功能寄存器声明声明一个16位的特殊功能寄存器data 存储器类型说明直接寻址的内部数据存储器bdata 存储器类型说明可位寻址的内部数据存储器idata 存储器类型说明间接寻址的内部数据存储器pdata 存储器类型说明分页寻址的外部数据存储器xdata 存储器类型说明外部数据存储器code 存储器类型说明程序存储器interrupt 中断函数说明定义一个中断函数reentrant 再入函数说明定义一个再入函数using 寄存器组定义定义芯片的工作寄存器附录二AT89C51特殊功能寄存器列表(适用于同一架构的芯片)带*号的特殊功能寄存器都是可以位寻址的寄存器符号地址注释*ACC E0H 累加器*B F0H 乘法寄存器*PSW D0H 程序状态字SP 81H 堆栈指针DPL 82H 数据存储器指针低8位DPH 83H 数据存储器指针高8位*IE A8H 中断允许控制器*IP D8H 中断优先控制器*P0 80H 端口0*P1 90H 端口1*P2 A0H 端口2*P3 B0H 端口3PCON 87H 电源控制及波特率选择*SCON 98H 串行口控制器SBUF 99H 串行数据缓冲器*TCON 88H 定时器控制TMOD 89H 定时器方式选择TL0 8AH 定时器0低8位TL1 8BH 定时器1低8位TH0 8CH 定时器0低8位TH1 8DH 定时器1高8位附录三运算符优先级和结合性级别类别名称运算符结合性1 强制转换、数组、结构、联合强制类型转换( ) 右结合下标[ ]存取结构或联合成员->或.2 逻辑逻辑非! 左结合字位按位取反~增量加一++减量减一--指针取地址&取内容*算术单目减-长度计算长度计算sizeof3 算术乘* 右结合除/取模%4 算术和指针运算加+减-5 字位左移<<右移>>6 关系大于等于>=大于>小于等于<=小于<7 恒等于==不等于!=8 字位按位与&9 按位异或^10 按位或|11 逻辑逻辑与&& 左结合12 逻辑或||13 条件条件运算?:14 赋值赋值=复合赋值Op=15 逗号逗号运算, 右结合。
单片机关键字寄存器和运算符附录一C51中的关键字关键字用途说明auto存储种类说明用以说明局部变量,缺省值为此break程序语句退出最内层循环case程序语句Switch语句中的选择项char数据类型说明单字节整型数或字符型数据const存储类型说明在程序执行过程中不可更改的常量值continue程序语句转向下一次循环default程序语句Switch语句中的失败选择项do程序语句构成do..while循环结构double数据类型说明双精度浮点数else程序语句构成if..else选择结构enum 数据类型说明枚举extern存储种类说明在其他程序模块中说明了的全局变量flost数据类型说明单精度浮点数for程序语句构成for循环结构goto程序语句构成goto转移结构if程序语句构成if..else选择结构int数据类型说明基本整型数long数据类型说明长整型数register存储种类说明使用CPU内部寄存的变量return程序语句函数返回short数据类型说明短整型数signed数据类型说明有符号数,二进制数据的最高位为符号位sizeof运算符计算表达式或数据类型的字节数static存储种类说明静态变量struct数据类型说明结构类型数据swicth程序语句构成switch选择结构typedef数据类型说明重新进行数据类型定义union 数据类型说明联合类型数据unsigned数据类型说明无符号数数据void数据类型说明无类型数据volatile数据类型说明该变量在程序执行中可被隐含地改变while程序语句构成while和do..while循环结构附表1-1ANSIC标准关键字关键字用途说明bit位标量声明声明一个位标量或位类型的函数sbit位标量声明声明一个可位寻址变量Sfr特殊功能寄存器声明声明一个特殊功能寄存器Sfr16特殊功能寄存器声明声明一个16位的特殊功能寄存器data存储器类型说明直接寻址的内部数据存储器bdata存储器类型说明可位寻址的内部数据存储器idata存储器类型说明间接寻址的内部数据存储器pdata存储器类型说明分。
Keil C51编程基础知知标识符与关键字C语言的标识符是用来标识源程序中某个对象名字的。
这些对象可以是函数、变量、数组、数据类型、存储方式、语句等。
关键字是一类具有固定名称和特定含义的特殊标识符,有时又称为保留字。
ANSI C标准一共规定了32个关健字,表2-1按用途列出了ANSI C标准的关键字。
表2-1 ANSI C标准的关键字关键字用途说明auto 存储器种类声明用以声明局部变量,默认什为此brcak 程度语句退出最内层循环体case 程度语句 switch语句中的选择项char 数据类型声明单字节整型数或字符型数据const 存储类型声明在程度执行中不可修改的变量值continue 程度语句转向下一次循环defaut 程序语句 switch语句中的失败选择项do 程度语句构成do...while循环结构double 数据类型声明双精度浮点数else 程度语句构成if...else选择结构enum 数据类型声明枚举extern 存储种类声明在其它程度模块中声明了的全局变量float 数据类型声明单精度浮点数for 程度语句构成for循环结构goto 程度语句构成goto转移结构if 程度语句构成if...else选择结构int 数据种类声明基本整型数long 数据种类声明长整型数register 数据种类声明使用CPU内部寄存器的变量return 程序语句函数返回short 数据种类声明短整型数signed 数据种类声明有符号数,二进制数的最高位为符号位sizeof 运算符计算表达式或数据类型的字节数static 数据种类声明静态变量struct 数据种类声明结构类型数据switch 程序语句构成switch选择结构typedef 数据种类声明重新进行数据类型定义union 数据种类声明联合类型数据unsigned 数据种类声明无符号数据void 数据种类声明无类型数据volatile 数据种类声明声明该变量在程度执行中可被隐含的改变while 程度语句构成while和...while循环结构C51编绎器除了支持ANSI C标准的关键字以外,还根据8051单片机自身的特点扩展了如表2-2所示的关键字。
Keil C51基本关键字:一、由ANSI标准定义的共32个:auto double int struct break else long switch case enum register typedef char extern return union const float short unsigned continue for signed void default goto sizeof volatile do if while static二、Keil Cx51扩展的关键字:•_at_•alien •bdata •bit •code •compact •data •far•idata•interrupt•large•pdata•_priority_•reentrant•sbit•sfr•sfr16•small•_task_•using•xdata三、标准C关键字说明:1数据类型关键字(12个):(1)char:声明字符型变量或函数(2)double:声明双精度变量或函数(3)enum:声明枚举类型(4)float:声明浮点型变量或函数(5)int:声明整型变量或函数(6)long:声明长整型变量或函数(7)short:声明短整型变量或函数(8)signed:声明有符号类型变量或函数(9)struct:声明结构体变量或函数(10)union:声明联合数据类型(11)unsigned:声明无符号类型变量或函数(12)void:声明函数无返回值或无参数,声明无类型指针(基本上就这三个作用)(2)控制语句关键字(12个):A循环语句(1)for:一种循环语句(可意会不可言传)(2)do:循环语句的循环体(3)while:循环语句的循环条件(4)break:跳出当前循环(5)continue:结束当前循环,开始下一轮循环B条件语句(1)if:条件语句(2)else:条件语句否定分支(与if连用)(3)goto:无条件跳转语句C开关语句(1)switch:用于开关语句(2)case:开关语句分支(3)default:开关语句中的“其他”分支Dreturn:子程序返回语句(可以带参数,也看不带参数)3存储类型关键字(4个)(1)auto:声明自动变量一般不使用(2)extern:声明变量是在其他文件正声明(也可以看做是引用变量)(3)register:声明积存器变量(4)static:声明静态变量4其它关键字(4个):(1)const:声明只读变量(2)sizeof:计算数据类型长度(3)typedef:用以给数据类型取别名(当然还有其他作用(4)volatile:说明变量在程序执行中可被隐含地改变四、C51扩展关键字说明1、_at_定义变量的绝对地址格式:<[>memory_type<]>type variable_name_at_constant;例:int xdata value_at_0x8000;/*int at xdata0x8000*/ 2、alien(PL/M-51)函数外部声明C函数调用PL/M-51必须先用alien声明例:extern alien char plm_func(int,char);char c_func(void){int i;char c;for(i=0;i<100;i++){c=plm_func(i,c);/*call PL/M func*/}return(c);}C函数要被PL/M-51调用必须先用alien声明例:alien char c_func(char a,int b){return(a*b);}3、Code data,bdata,pdata,idata,xdata C51存储器类型声明Code程序代码存储区Data直接寻址片内数据存储区(低128字节)Bdata位寻址片内数据存储区(16字节)Idata间接寻址片内数据存储区(256字节)Pdata分页寻址外部数据存储区(256字节)Xdata可寻址片外数据存储区(64KB)例:int bdata ibase;/*Bit-addressable int*/char bdata bary[4];/*Bit-addressable array*/4、bit位变量定义格式:bit name<[>=value<]>;例:static bit done_flag=0;/*bit variable*/5、sfr sfr16sbit C51扩展数据类型sfr用于定义8位特殊功能寄存器sfr16用于定义16位特殊功能寄存器sbit用于定义可位寻址对象例:sfr P0=0x80;/*Port-0,address80h*/sfr16T2=0xCC;/*Timer2:T2L0CCh,T2H0CDh*/sbit EA=0xAF; //将位绝对地址赋給位变量sfr PSW=0xD0; sbit OV=PSW^2; sbit OV=0xD0^2;int bdata ibase;/*Bit-addressable int*/sbit mybit0=ibase^0;/*bit0of ibase*/6、compact,large,small C51中变量的存储模式选择Small模式用于将所有未指明存储区的变量均保存在data存储区compact模式用于将所有未指明存储区的变量均保存在pdata存储区Large模式用于将所有未指明存储区的变量均保存在xdata存储区例:#pragma small/*Default to small model*/extern int calc(char i,int b)large reentrant;extern int func(int i,float f)large;extern void*tcp(char xdata*xp,int ndx)compact;int mtest(int i,int y)/*Small model*/{ return(i*y+y*i+func(-1,4.75)); }int large_func(int i,int k)large/*Large model*/{ return(mtest(i,k)+2); }7、far far存储区是指许多新的8051扩展地址空间。
C51程序设计第1节 C51对标准C语言的扩展
一、C51关键字
二、存储区域
三、数据变量分类(C51中扩展了若干数据类型)
四、存储器模式(在C51编译器选项中选定的,它决定了没有明确指定存储类型的变量、函数等数据的默认存储区域)
五、绝对地址的访问
在一些情况下,可能希望把一些变量定位在51单片机的某个固定的地址空间上。
C51为此专门提供了一个关键字_at_。
关于该关键字,有两点在使用时需要注意:
•绝对地址的变量是不可以被初始化的
•函数或类型为bit的的变量是不可以被定为成绝对地址的
六、指针
七、函数
在C51中,函数的定义与ANSI C中是相同的,唯一不同的就是可能在函数的后面需要带若干的C51专用的关键字。
函数定义格式:[return_type]funcname([args])[{small|compact|large}][reentrant][interrupt n][using n]
return_type:返回值类型;funcname:函数名;args:函数参数列表;{small|compact|large}:函数模式选择;reentrant:重入函数;interrupt n:中断函数;using n:有code banking是究竟使用哪一块空间。
第2节 C51函数库
第3节 C51程序编写
一、C程序基本结构
C程序共有3种基本结构,分别为顺序、选择和循环。
一般的程序都是这3种基本结构组合的结果。
二、编写高效的C51程序及优化程序。
第四讲C51的运算符,表达式及其规则一、运算符的概念:运算符是完成某种特定运算的符号。
运算符按其表达式中与运算符的关系可分为单目运算符,双目运算符和三目运算符。
单目就是指需要有一个运算对象,双目就要求有两个运算对象,三目则要三个运算对象。
表达式则是由运算及运算对象所组成的具有特定含义的式子。
C 是一种表达式语言,表达式后面加“;”号就构成了一个表达式语句。
二、Cx51算术运算符及其表达式:1.算术运算符:单片机c语言中的算术运算符有如下几个,其中只有取正值和取负值运算符是单目运算符,其它则都是双目运算符:⏹+ 加或取正值运算符⏹- 减或取负值运算符⏹* 乘运算符⏹/ 除运算符⏹% 取余运算符2.算术表达式的形式:⏹表达式1 算术运算符表达式2如:a+b*(10-a), (x+9)/(y-a)等;除法运算符和一般的算术运算规则有所不一样,如是两浮点数相除,其结果为浮点数,如10.0/20.0 所得值为0.5,而两个整数相除时,所得值就是整数,如7/3,值为2。
3.算术运算的优先级与结合性:⏹1)先乘除,后加减,括号最优先;⏹2)一个运算对象两侧的运算符的优先级别相同时的运算顺序;注意:如果一个运算符的两侧的数据类型不同,则必须通过数据类型转换,将其转换成同种类型。
三、Cx51关系运算符及其表达式:1.Cx51提供的六种关系运算符:⏹> 大于⏹>= 大于等于⏹< 小于⏹<= 小于等于⏹== 测试等于(该符号只对等式进行测试,不赋值)⏹!= 测试不等于?2.关系表达式的形式:⏹表达式1 关系运算符表达式2⏹如:c>a+b,a>b!=c等;3.关系运算符的优先级及结合性:⏹1)前四种关系运算符优先级相同,后两种相同,但是前四种要高于后两者;⏹2)关系运算符的优先级低于算术运算符;⏹3)关系运算符的优先级高于赋值运算符;⏹4)关系运算符的结合性为左结合;⏹5)关系表达式的结果总是一个逻辑值,即真(逻辑1)或假(逻辑0);四、Cx51逻辑运算符及其表达式:1.逻辑运算符:⏹&& 逻辑"与"(AND)¦¦逻辑"或"(OR)! 逻辑"非"(NOT)2.逻辑运算符的行式:关系表达式1(或逻辑量1)逻辑运算符关系表达式2(或逻辑量2)如:!a,a¦¦b,!a&&b等;3.逻辑运算符的优先级:⏹1)逻辑表达式的结合性为自左向右;⏹2)逻辑表达式的值应该是一个逻辑量真(逻辑1)或假(逻辑0);3)注意逻辑运算与位逻辑运算是两个不同的概念;五、Cx51位操作及其表达式:1.Cx51提供的六种位操作运算符:& 按位与¦按位或^ 按位异或~ 按位取反<< 位左移>> 位右移2.位运算表达式的形式:⏹整型或字符型数1 位运算符整型或字符型数2⏹如:a&b,~a,a>>2等;六、Cx51自增减运算符及其表达式:1.自增减运算符:⏹++ 自增;⏹-- 自减;2.自增减运算表达式的形式:⏹自增减运算符表达式或是表达式自增减运算符⏹如:++i,--i;⏹i++,i--;等3.自增减运算表达式的结合性:⏹1)自增减运算符的结合方向是“自右向左”;⏹2)值得注意的是,自增减运算表达式只能用于变量,而不能用于常量表达式;七、Cx51复合运算符及其表达式:1.复合运算符(见表4-1所示):2.复合运算符的表达式:⏹表达式1 复合运算符表达式2;⏹如:a+=b,相当于a=a+b等;。
单片机C语言的必备基础对单片机C语言来说,掌握以下几点是必须的,尤其对初学者来讲,更是要熟记的:一、单片机C语言的运算符和表达式1.1运算符的种类、优先级和结合性C语言中运算符和表达式数量之多,在高级语言中是少见的。
正是丰富的运算符和表达式使c语言功能十分完善。
这也是c语言的主要特点之一。
C语言的运算符不仅具有不同的优先级,而且还有一个特点,就是它的结合性。
在表达式中,各运算量参与运算的先后顺序不仅要遵守运算符优先级别的规定,还要受运算符结合性的制约,以便确定是自左向右进行运算还是自右向左进行运算。
这种结合性是其它高级语言的运算符所没有的,因此也增加了c语言的复杂性。
1.2运算符的种类C语言的运算符可分为以下几类:1.算术运算符用于各类数值运算。
包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)、自增(++)、自减(--)共七种。
2.关系运算符用于比较运算。
包括大于(>)、小于(<)、等于(==)、大于等于(>=)、小于等于(<=)和不等于(!=)六种。
3.逻辑运算符用于逻辑运算。
包括与(&&)、或(||)、非(!)三种。
4.位操作运算符参与运算的量,按二进制位进行运算。
包括位与(&)、位或(|)、位非(~)、位异或(^)、左移(<<)、右移(>>)六种。
5.赋值运算符用于赋值运算,分为简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)和复合位运算赋值(&=,|=,^=,>>=,<<=)三类共十一种。
6.条件运算符这是一个三目运算符,用于条件求值(?:)。
7.逗号运算符用于把若干表达式组合成一个表达式(,)。
8.指针运算符用于取内容(*)和取地址(&)二种运算。
9.求字节数运算符用于计算数据类型所占的字节数(sizeof)。
C51关键字C51包含ANSI C关键字的同时,也有针对51单片机扩展的一些关键字。
C51的扩展关键字从某种程度上体现了C51语言与标准C语言的不同。
例如可重入函数、存储模式等等都是标准C中不存在的问题。
ANSI C 关键字∙auto: 自动变量∙double: 双精度类型∙int: 声明整型类型∙struct: 声明结构体类型∙break: 跳出当前循环∙else: 条件语句否定分支(与 if 连用)∙long: 声明长整型类型∙switch :用于开关语句?∙case: 开关语句分支??∙enum: 声明枚举类型∙register: 声明寄存器变量∙typedef: 用以给数据类型取别名(当然还有其他作用)∙char: 声明字符型类型∙extern: 声明变量是在其他文件正声明(也可以看做是引用变量)??∙return: 子程序返回语句(可以带参数,也看不带参数)??∙union: 声明联合数据类型∙const: 声明只读变量∙float: 声明浮点型类型∙short: 声明短整型类型∙unsigned: 声明无符号类型类型∙continue: 结束当前循环,开始下一轮循环?∙for: 一种循环语句(可意会不可言传)∙signed: 生命有符号类型类型∙void: 声明函数无返回值或无参数,声明无类型指针(基本上就这三个作用)∙default: 开关语句中的“其他”分支?∙goto: 无条件跳转语句????∙sizeof: 计算数据类型长度??∙volatile: 说明变量在程序执行中可被隐含地改变?∙do: 循环语句的循环体∙while: 循环语句的循环条件∙static: 声明静态变量∙if: 条件语句C51扩展关键字_at_ 为变量定义存储空间绝对地址alien 声明与PL/M51兼容的函数bdata 可位寻址的内部RAMbit 位类型code ROMcompact 使用外部分页RAM的存储模式data 直接寻址的内部RAMidata 间接寻址的内部RAM interrupt 中断服务函数large 使用外部RAM的存储模式pdata 分页寻址的外部RAM_priority_ RTX51的任务优先级reentrant 可重入函数sbit 声明可位寻址的特殊功能位sfr 8位的特殊功能寄存器sfr16 16位的特殊功能寄存器small 内部RAM的存储模式_task_ 实时任务函数using 选择工作寄存器组xdata 外部RAM。