单片机C51语言关键字的解释和运算优先级及结合性
C51编译器的扩展关键字

附表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存储器类型说明分。
C51的关键字解释

TL0 8AH 定时器0低8位
TL1 8BH 定时器1低8位
TH0 8CH 定时器0低8位
TH1 8DH 定时器1高8位
带*号的特殊功能寄存器都是可以位寻址的寄存
C51扩展关键字
_at_为变量定义存储空间绝对地址alien声明与PL/M51兼容的函数bdata可位寻址的内部RAMbit位类型codeROMcompact使用外部分页RAM的存储模式data直接寻址的内部RAMidata间接寻址的内部RAMinterrupt中断服务函数large使用外部RAM的存储模式pdata分页寻址的外部RAM_priority_RTX51的任务优先级reentrant可重入函数sbit声明可位寻址的特殊功能位sfr8位的特殊功能寄存器sfr1616位的特殊功能寄存器small内部RAM的存储模式_task_实时任务函数using选择工作寄存器组xdata外部RAM
continue 程序语句 转向下一次循环
default 程序语句 Switch语句中的失败选择项
do 程序语句 构成do..while循环结构
double 数据类型说明 双精度浮点数
else 程序语句 构成if..else选择结构
enum 数据类型说明 枚举
extern 存储种类说明 在其他程序模块中说明了的全局变量
flost 数据类型说明 单精度浮点数
for 程序语句 构成for循环结构
goto 程序语句 构成goto转移结构
if 程序语句 构成if..else选择结构
int 数据类型说明 基本整型数
long 数据类型说明 长整型数
register 存储种类说明 使用CPU内部寄存的变量
单片机基础与应用(C语言版)第3章 C51程序设计基础

选择语句
多分支选择的switch语句, 其一般形式如下: switch(表达式)
{ case常量表达式1: 语句组1;break; case常量表达式2: 语句组2;break; …… case常量表达式n: 语句组n;break; default : 语句组n+1;
} 该语句的执行过程是:首先计算表达式的值,并逐个与case后的常量表达 式的值相比较,当表达式的值与某个常量表达式的值相等时,则执行对应 该常量表达式后的语句组,再执行break语句,跳出switch语句的执行,继 续执行下一条语句。如果表达式的值与所有case后的常量表达式均不相同, 则执行default后的语句组。
位运算
按位或操作符: |
或操作
格式:x|y
规则:对应位均为0时才为0,否则为1 例如, i=i|0x0f; 等同于
i|=0x0f;
主要用途:将1个数的某(些)位置1,其余各位不变
位运算
异或操作
按位异或操作符:^ 格式:x^y 规则:对应位相同时为0,不同时为1
例如, i=i^0x0f; 等同于 i^=0x0f; 主要用途:使1个数的某(些)位翻转(即原来为1的位 变为0,为0的变为1),其余各位不变。
右移运算符“>>”的功能,是把“>>”左边的操作数 的各二进制位全部右移若干位,移动的位数由“>>” 右边的常数指定。进行右移运算时,如果是无符号数, 则总是在其左端补“0”
练习
1 .若x = 10, 则!X的值为真或假? 2. 若a = 3, b = 2, 则if(a&b)的值为真或假? 3. 5 && 0 ||8的值为?
浮点型 指针型 位类型 特殊功能寄存器 16位特殊功能寄存器 可寻址位
KC51基础知识

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所示的关键字。
C51中运算符的优先级

双目运算符
13
?:
条件运算符
表达式1?表达式2:表达式3
右到左
三目运算符
14
=
赋值运算符
变量=表达式
右到左
/=
除后赋值
变量/=表达式
*=
乘后赋值
变量*=表达式
%=
取模后赋值
变量%=表达式
+=
加后赋值
变量+=表达式
-=
减后赋值
变量-=表达式
<<=
左移后赋值
变量<<=表达式
>>=
右移后赋值
变量>>=表达式
C语言中的运算符及其优先级
优先级
运算符
名称或含义
使用形式
结合方向
说明
1
[]
数组下标
数组名[常量表达式]
左到右
()
圆括号
(表达式)/函数名(形参表)
.
成员选择(对象)
对象.成员名
->
成员选择(指针)
对象指针->成员名
2
-
负号运算符
-表达式
右到左
单目运算符
(类型)
强制类型转换
(数据类型)表达式
++
自增运算符
++变量名/变量名++单Biblioteka 运算符--自减运算符
--变量名/变量名--
单目运算符
*
取值运算符
*指针变量
单目运算符
&
取地址运算符
&变量名
单目运算符
!
逻辑非运算符
!表达式
Keil C51基本关键字

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的运算符表达式及其规则

6.复合赋值运算符 赋值号前加上其他运算符构成复合赋值运算 符,c51提供了下列十个复合赋值运算符
+=,一=,*=,/=,%=,&=,1=, ^=,〈〈=,〉〉=
a+=b a=(a+b) x*=a+b x=(x*(a+b)) a&=b a=(a&b) a<<=4 a=(a<<4)
VCC C2 6 XT L 1 3 0P C2 7 2 2u F 9 19 31 39 38 37 36 35 34 33 32 1 2 3 4 5 6 7 8 1 1. 0 59 2M W 7 7E 5 8 RST PSE N X1 X2 EA AL E (AD0 )P0 . 0 (A8 )P2 . 0 (AD1 )P0 . 1 (A9 )P2 . 1 (AD2 )P0 . 2 (A1 0)P2. 2 (AD3 )P0 . 3 (A1 1)P2. 3 (AD4 )P0 . 4 (A1 2)P2. 4 (AD5 )P0 . 5 (A1 3)P2. 5 (AD6 )P0 . 6 (A1 4)P2. 6 (AD7 )P0 . 7 (A1 5)P2. 7 P1. 0 / T 2 P3. 0 / RXD0 P1. 1 / T 2E X P3. 1 / T XD0 P1. 2 / RXD1 P3. 2 / INT 0 P1. 3 / T XD1 P3. 3 / INT 1 P1. 4 / INT 2 P3. 4 / T 0 P1. 5 / INT 3 P3. 5 / T 1 P1. 6 / INT 4 P3. 6 / W R P1. 7 / INT 5 P3. 7 / RD 29 18 30 21 22 23 24 25 26 27 28 10 11 12 13 14 15 16 17 C2 5 3 0P
单片机C51中的关键字

数据类型声明
声明该变量在程序执行中
while
程序语句
构成while 或者do
xdata
存储器类型声明
外部数据存储
说明 用来声明局部变量 可位寻址的内部存储器 退出最内层循环体 位变量值是1或者0 switch语句中的选择项 单字节整数型或字符型数据
程序存储器 在程序执行中不可修改的变量值
退出本循环,进行下一循环 直接寻址的内部数据存储器
声明一个16位的特殊
static
存储器类型声明
静态变量
stuct
数据类型声明
结构类型数
switch
程序语句
构成switch语
typedef
数据类型声明
重新定义数据
union
数据类型声明
联合类型数
unsigned
数据类型声明
无符号数据
using
寄存器组定义
定义芯片的工作
void
数据类型声明
无符号数据
volatile
关键字 auto bdata break bit case char code const continue data default do double else enum extern
用途 存储种类声明 存储器类型声明
程序语句 位变量语句 程序语句 数据类型 存储器类型说明 存储类型声明 程序语句 存储器类型说明 程序语句 程序语句 数据类型 程序语句 数据类型 存储类型声明
定义一个再入函数 函数返回
声明一个可位寻址的变量 短整数型
符号数,二进制的最高位为符号位 计算表达式或数据类型的字节数
声明一个特殊功能寄存器
声明一个16位的特殊功能寄存器 静态变量
C51程序设计基本知识总结

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

其用法:
sfr16 特殊功能寄存器名= 特殊功能寄存器地址常数; 如8052的T2定时器,可以定义为: sfr16 T2 = 0xCC; /*这里定义8052定时器2,地址为T2L= CCH,T2H=CDH*/ 用sfr16定义16位特殊功能寄存器时,等号后面是它的低 位地址,高位地址一定要位于物理低位地址之上。 注意的是不能用于定时器0和1的定义。
{
P1=LIGHT0; }
C51基础
程序中用#define LIGHT0 0xfe 来定义符号LIGH T0 等于0xfe,以后程序中所有出现LIGHT0 的地方 均会用0xfe 来替代。
因此,这个程序执行结果就是P1=0xfe,只有接 在P1.0的LED灯亮引脚上的LED 点亮。
C51基础
2、在程序执行过程中其值可以改变的量称为变量。要在 程序中使用变量必须先用标识符作为变量名,并指出所用的 数据类型和存储模式。 如某仪表有4 位LED数码管,编程时将3CH~3FH 作为显 示缓冲区,当要显示一个字串“1234”时,汇编程序如下:
用可参看附录中“absacc.h”内容便知。
例如: val1=CBYTE[0x0040]; /*指向程序存贮器的0040h字节地址,即变量Val1的地址 用的是程存的0040h地址,也叫绝对地址。*/
C51基础
main()函数
也称为主函数 C语言都是从main()函数开始执行的。 前面加了一个void 是说明该函数是没有返回值的。 如果点量8个灯,可P1=0x00
对引脚送0,则点亮单色灯,0x00对应二进制数值000000 00,所以该条语句是同时点亮了8只单色灯。
整个程序用{}括起来,形成了一个完整的C51程序。
单片机的C51语言基础综述

2019/3/28
1)sbit 位变量名=特殊功能寄存器名^位的位置(0~7) 例如: sfr PSW =0xD0; /*定义PSW寄存器地址为0xd0h*/ sbit OV = PSW^2; /*定义OV位为PSW.2,地址为0xd2*/ sbit CY = PSW^7; /*定义Cy位为PSW.7,地址为0xd7*/ 2)sbit位变量名=字节地址^位的位置 例如: sbit OV =0xd0^2; /*定义OV位的地址为0xd2*/ sbit CF =0xd0^7; /*定义CF位的地址为0xd7*/ 注意:字节地址作为基地址,必须位于0x80~0xff之间。 3)sbit 位变量名=位地址 例如: sbit OV =0xd2; /*定义OV位的地址为0xd2*/ sbit CF =0xd7; /*定义CF位的地址为0xd7*/ 注意:位地址必须位于0x80~0xFF之间。
单字节整型数或字符型数据 在程序执行过程中不可更改的常量值 转向下一次循环 Switch语句中的失败选择项 构成 do…while循环结构 双精度浮点数 构成 if…else选择结构 枚举类型 在其他程序模块中说明了的全局变量 单精度浮点数 构成for循环结构 构成goto转移结构 构成 if…else选择结构 基本整型数 长整型数 使用CPU内部寄存器的变量 函数返回 短整型数 有符号数,二进制数据的最高位为符号位 计算表达式或数据类型的字节数 静态变量 结构类型数据 构成Switch选择结构 重新进行数据类型定义 联合类型数据 无符号数数据 无类型数据 该变量在程序执行中可被隐含地改变 构成while和do…while循环结构
项目4
单片机的C51语言基础
4-1 认识单片机C语言 4-2 认识C51的数据类型 4-3 C51的运算符、表达式及优先级 4-4 C51流程控制语句 4-5 C51的数组 4-6 指针 4-7 C51的函数 4-8 C51与汇编语言的混合编程实例 4-9 任务4 简易密码锁设计 4-10 任务5 LED点阵显示屏的设计
第3章单片机的C51基础知识

(3)数据存储类型:通用计算机采用的是程序和数据统一 寻址的冯洛伊曼结构,而51系列单片机采用哈佛结构,有 程序存储器和数据存储器,数据存储器又分片内和片外数 据存储器,片内数据存储器还分直接寻址区和间接寻址区, 因此C51专门定义了与以上存储器相对应的数据存储类型, 包括code、data、idata、xdata以及根据51系列特点而设 定的pdata类型。 (4)中断处理:标准C语言没有处理中断的定义,而C51为 了处理单片机的中断,专门定义了interrupt关键字。 (5)数据运算操作和程序控制:从数据运算操作和程序控 制语句以及函数的使用上来讲,C51与标准C几乎没有什么 明显的差别。只是由于单片机系统的资源有限,它的编译 系统不允许太多的程序嵌套。同时由于51系列单片机是8位 机,所以扩展16位字符Unicode不被C51支持。ANSI C所具 备的递归特性也不被C51支持,所以在C51中如果要使用递 归特性,必须用REETRANT关键字声明。
表3.2 C51的扩展关键字
关键字 sfr16 small 用途 特殊功能寄存器声明 存储器模式 任务声明 寄存器组定义 存储器类型说明 说明 声明一个16位的特殊功能寄存器 内部RAM的存储模式
_task_ using
表3.1 ANSI C的关键字
关键字
auto break case char const continue default do double else
用途
存储种类说明 程序语句 程序语句 数据类型说明 存储类型说明 程序语句 程序语句 程序语句 数据类型说明 程序语句 退出最内层循环体
说明
用以说明局部变量,缺省值为此 switch语句中的选择项 单字节整型数或字符型数据 在程序执行过程中不可更改的常量值 转向下一次循环 switch语句中的失败选择项 构成do„while循环结构 双精度浮点数 构成if„else选择结构
单片机C51语言基础

signed long
float *
四字节
四字节 1~3 字节
-2147483648~+2147483647
±1.175 494E-38~±3.402 823E+38 对象的地址
bit
sbit sfr sfr16
位
位 单字节 双字节
0或1
0或1 0~255 0~65535
• • • • • • • • • • •
变量应该先定义后使用,定义格式如下: 数据类型 变量标识符[ =初值 ] 变量定义通常放在函数的开头部分,但也可以放在函数的外部或复合语句的 开头。以unsigned int 为例,变量的定义方式主要有以下3 种。 unsigned int k; // 定义变量k 为无符号整型 unsigned int i, j, k; // 定义变量i, j, k 为无符号整型 unsigned int i=6, j; // 定义变量的同时给变量赋初值,变量初始化 当在一个表达式中出现不同数据类型的变量时,必须进行数据类型转换。 C51 语言中数据类型的转换有两种方式:自动类型转换和强制类型转换。 (1) 自动类型转换。 不同数据类型的变量在运算时,由编译系统自动将它们转换成同一数据类型, 再进行运算。自动转换规则如下: bit→char→int→long→float signed→unsigned
bit
sbit sfr sfr16 interrupt reentrant using -at-task定义中断函数 定义再入函数 定义当前工作寄存器组 地址定位 任务声明 定义数据类型
定义一个位变量
定义一个位变量 定义一个8 位的SFR 定义一个16 位的SFR 声明一个函数为中断服务函数 声明一个函数为再入函数 指定当前使用的工作寄存器组 为变量进行存储器绝对地址空间定位 定义实时多任务函数
第四讲 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等;。
第四章_C51语法简介

第十节 中断服务函数与寄存器组定义
中断服务函数的一般形式为: 函数类型 函数名(形式参数表)[interrupt n] [using n]
表4-5
中断号 0 1 2 3 4 5
常用中断号与中断向量
中断向量8n+3 0003H 000BH 0013H 001BH 0023H 002BH(8052系列特有)
bdata
idata pdata xdata code
存储器模式SMALL、COMPACT或LARGE来规定默认存储器类型, 确定变量的存储器空间
第四节 C51中直接对51单片机的SFR 的定义
sfr 特殊功能寄存器名 = 地址常数; 例如: sfr P0 = 0x80 ;//定义I/O口P0,其地址为0x80
第八节 51单片机外扩I/O口的访问
访问外部I/O口的方法有三种。 1.绝对宏 在程序中,用“#include”即可使用其中定义的宏来访问绝对地址,包括:CBYTE,XBYTE PWORD,DBYTE,CWORD,XWORD,PBYTE,DWORD 具体使用可看一看Keil C51 的absacc.h头文件便知。例如: rval=CBYTE[0x0002]; // rval指向程序存储器的0002H地址 rval=XWORD[0x0002]; // rval指向外RAM的2 × sizeof (unsigned int) = 0004H地址 2._at_关键字 直接在数据定义后加上_at_ const 即可,但是注意: (1)绝对变量不能被初始化; (2)bit型函数及变量不能用_at_指定。例如: idata struct link list _at_ 0x40 ; //指定list结构变量从40H开始,其中link 是结构,list是结构变量名 xdata char text[256] _at_ 0xE000;//指定text数组从0E000H开始 特别提示:如果外部绝对变量是I/O端口等可自行变化数据,需要使用volatile关键字进行描 3.宏定义 例:#include <absacc.h> #define rval CBYTE[0x0002] // rval 指向程序存储器的0002H地址 #define rval XBYTE[0x0002] // rval 指向外RAM的2 × sizeof (unsigned int) = 0004H 址.
C51基本语法

最新课件
8
1.2.2 变量 1.2.2.1变量类型 在程序运行中,其值可以改变的量称为变量
一个变量主要由两部分构成:一个是变量名, 一个是变量值。
每个变量都有一个变量名,在内存中占据一 定的存储单元(地址),并在该内存单元中存 放该变量的值。
最新课件
9
C51支持的变量通常有如下类型:
1. 位变量(bit)——位变量的值可以是1(true)或0(false)。与 805l硬件特性操作有关的位变量必须定位在8051CPU片内 存储区(RAM)的可位寻址空间中。
LARGE
参数及局部变量直接放入片外RAM(默认的存储类型是XDATA, 最大64KB);使用数据指针DPTR间接寻址。因此访问效率较低 且直接影响代码长度.
最新课件
16
1.2. 3 8051片内资源及位变量
1.2.3.1 特殊功能寄存器的C51定义
8051单片机的内部高128个字节为专用寄 存器区,其中51子系列有21个(52子系列 有26个)特殊功能寄存器(SFR),它们 离散的分布在这个区中,分别用于CPU并 行口、串行口、中断系统、定时/计数器等 功能单元及控制和状态寄存器。
2.浮点型常量。分为十进制和指数表示形式。十进制由数字 和小数点组成,如0.888,3345.345,0.0等,整数或小数部 分为0时可以省略0但必须有小数点。指数表示形式为: [±]数字[.数字]e[±]数字 [ ]中的内容为可选项,其中内容根据具体情况可有可无, 但其余部分必须有,如123e3,5e6,-1.0e-3。而e3,5e4.0则是 非法的表示形式。
4. 浮点型变量(float)——浮点型变量占4个字节(byte),许多 复杂的数学表达式都采用浮点变量数据类型。它用符号位 表示数的符号,用阶码和尾数表示数的大小。用它们进行 任何数学运算都需要使用由编译器决定的各种不同效率等 级的库函数。(补充存储格式)
单片机C语言必备-运算符与关键字集

单片机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关键字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。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//if
构成 if ..else 选择结构
//return 函数返回
//switch 构成 switch 选择结构
//while 构成 do .. while 循环结构
存储类型说明
//auto
用以说明局部变量
//const 程序执行过程中其值不可变量
//extern 在其他程序模块中说明了的全局变量
//register 定义 CPU 内部寄存器变量
//static 静态变量
数据类型说明
//char
单字节整型数或字符型数据
//double 双字节浮点数
//enum
枚举类型
//float 单字节浮点型
//int
基本整型数
//long
长整型数
//short 短整型数
//signed 有符号数,二进制数据的最高位为符号位
15
逗号
逗号运算
*
从左往右
/
%
+
-
<<
>>
>=
>
<=
<
==
!=
&
^
|
&&
从右至左
||
?;
=
op
,
从左至右
2 逻辑
逻辑非
!
字位
按位取反
~
增量
加1
++
减量
减1
--
指针
取地址
&
从右至左
取内容
*
算术
单目-长度计算长度计算Sizeof
3
算术
乘
除
取模
4
算术和指针运算 加
减
5
字位
左移
右移
6
关系
大于等于
大于
小于等于
小于
7
恒等于
不等于
8
字位
按位与
9
按位异或
10
按位或
11
逻辑
逻辑与
12
逻辑或
13
条件
条件运算
14
赋值
复合赋值
程序语句
//break 退出内层循环
//case
switch 语句中的选择项
//continue 转向下一次循环
//default switch 语句中的失败选择项
//do
构成 do ..while 循环结构
//else
构成 if.. else 选择结构
//for
构成 for 循环结构
//goto
构成 goto 转移结构
//srtuct 结构类型数据、
//typedef 重新进行数据类型定义
//union 联合类型数据
//unsigned 无符号数据
//void
无类型数据
//volatile 该变量在程序执行中可被隐含地改变
运算符
//sizeof 计算表达式或数据类型的字节数
位标量声明
//bit
声明一个位标量或一个位类型的函数
//sbit
声明一个可位寻址变量
特殊功能寄存器
//sfr
声明一个特殊功能寄存器
//sfr16 声明一个 16 位特殊功能寄存器
存储器类型说明
//data
直接寻址的内部数据寄存器
//bdata 可位寻址的内部数据寄存器
//idata 间接寻址的内部数据寄存器
//pdata 分页寻址的内部数据寄存器
//xdata 外部数据存储器
//code
程序存储器
中断函数声明
//interrupt
定义一个中断函数
再入函数声明
//reentrant 定义一个再入函数
寄存器组定义
//using
定义芯片的工作寄存器
运算符优先级及结合性
级别
类型
名称
1 强制转换、数组、结构、 强制类型转换
联合
下标
运算符 结合性 () 从左至右 []
存取机构或联合成员 ->或