1、1 C51 程序流程与控制C 语言是一种结构化的编程语言。其基本元素是模块,它是程序的一部分,只有一个入口和一个出口,不允许有中途插入或从模块的其它路径退出。C 语言有 3 种基本结构: 顺序结构; 选择结构; 循环结构;1.1 顺序结构程序顺序结构的程序是最简单、最基本的程序结构,其特点是按指令的排列顺序一条条地执行,如图所示,程序先执行 A 操作,再执行B 操作,两者是顺序执行的关系。1.2 选择结构程序此结构中必包含一个判断框,根据给定的条件 P 是否成立而选择执行 A 框或 B 框。选择结构由条件语句构成。条件语句 条件语句又被称为分支语句,其关键字是由 if 语句或 switch/c
2、ase 构成。C 语言提供了 3 种形式的 if 语句结构:用法 1:if (条件表达式 ) 语句描述:当条件表达式的结果为真时,就执行语句,否则就跳过。例:if(a=3)b=0;用法 2:if (条件表达式 ) 语句 1else 语句 2描述:当条件表达式成立时,就执行语句 1,否则就执行语句 2。例:if (a=b)a+;else a-;当 a 等于 b 时, a 加 1,否则 a-1。1用法 3:if (条件表达式 1) 语句 1;else if (条件表达式 2) 语句 2;else if (条件表达式 3) 语句 3;else if (条件表达式 n) 语句 n;else 语句 m;
3、描述:如果表达式 1 为“真” ,则执行语句 1,退出 if 语句;否则去判断表达式2,如果为“真” ,则执行语句 2,退出 if 语句;否则去判断表达式 3最后,如果表达式 n 也不成立,则执行 else 后面的语句 m。else 和语句 m 也可省略不用。例:if (a=3) b=10;else if (a=2) b=20;else if (a=1) b=30;else b=0;switch/ case 语句结构我们学习了条件语句,用多个条件语句可以实现多方向条件分支,但是可以发现使用过多的条件语句实现多方向分支会使条件语句嵌套过多,程序冗长,这样读起来也很不好读。这时使用开关语句同样可以
4、达到处理多分支选择的目的,又可以使程序结构清晰。它的语法为下:switch (表达式)case 常量表达式 1: 语句 1; break;case 常量表达式 2: 语句 2; break;case 常量表达式 3: 语句 3; break;case 常量表达式 n: 语句 n; break;default: 语句 m描述:运行中 switch 后面的表达式的值将会做为条件,与 case 后面的各个常量表达式的值相对比,如果相等时则执行后面的语句,再执行 break(间断语句)语句,跳出switch 语句。如果 case 没有和条件相等的值时就执行 default 后的语句。当要求没有符合的条
5、件时不做任何处理,则可以不写 default 语句。21.3 循环结构程序 循环程序的作用就是用来实现需要反复执行某一部分程序行的操作,有如下两类循环结构。 当型循环在这种结构中,当判断条件 P 成立时,执行循环体 A 部分。执行完毕回来再一次判断条件P。如果条件成立则继续循环 A,否则退出循环。通常用 while 循环语句来实现,其形式如下:While(表达式)循环语句;描述:当表达式为非 0(“真” )时,执行while 中的内嵌循环语句。 直到型循环在这种结构中,先执行循环 A 部分,然后判断条件P 成立时,执行循环体 A 部分。执行完毕回来再一次判断条件 P。如果条件成立则继续循环 A
6、,否则退出循环。通常用 do-while 循环语句来实现,其形式如下:do循环语句;while(表达式)描述:先执行 do-while 中的内嵌循环语句,再判断表达式表达式为非 0(“真” )时,继续执行内嵌循环语句。 for 循环语句for 语句的一般形式为:for(表达式 1;表达式 2;表达式 3)循环语句;描述: 先求解表达式 1; 求解表达式 2,其值为 “真”时,则执行 for 语句中的循环语句,然后执行第步,如果表达式 2,其值为“假”时,则结束循环,转到第步。 求解表达 3; 转回第步继续执行;退出 for 循环。3表 1-1 C51 中的关键字关键字 用 途 说 明auto
7、存储种类说明 用以说明局部变量,缺省值为此break 程序语句 退出最内层循环case 程序语句 Switch 语句中的选择项char 数据类型说明 单字节整型数或字符型数据const 存储类型说明 在程序执行过程中不可更改的常量值continue 程序语句 转向下一次循环default 程序语句 Switch 语句中的失败选择项do 程序语句 构成 dowhile 循环结构double 数据类型说明 双精度浮点数else 程序语句 构成 ifelse 选择结构enum 数据类型说明 枚举extern 存储种类说明 在其他程序模块中说明了的全局变量flost 数据类型说明 单精度浮点数for
8、程序语句 构成 for 循环结构goto 程序语句 构成 goto 转移结构if 程序语句 构成 ifelse 选择结构int 数据类型说明 基本整型数long 数据类型说明 长整型数register 存储种类说明 使用 CPU 内部寄存的变量return 程序语句 函数返回short 数据类型说明 短整型数signed 数据类型说明 有符号数,二进制数据的最高位为符号位sizeof 运算符 计算表达式或数据类型的字节数static 存储种类说明 静态变量struct 数据类型说明 结构类型数据swicth 程序语句 构成 switch 选择结构typedef 数据类型说明 重新进行数据类型定
9、义union 数据类型说明 联合类型数据unsigned 数据类型说明 无符号数数据void 数据类型说明 无类型数据volatile 数据类型说明 该变量在程序执行中可被隐含地改变while 程序语句 构成 while 和 dowhile 循环结构表 1-2 存储器类型存储器类型 说 明data 直接访问内部数据存储器(128 字节),访问速度最快bdata 可位寻址内部数据存储器(16 字节),允许位与字节混合访问idata 间接访问内部数据存储器(256 字节),允许访问全部内部地址pdata 分页访问外部数据存储器(256 字节),用 MOVX Ri 指令访问xdata 外部数据存储器
10、(64KB),用 MOVX DPTR 指令访问code 程序存储器(64KB),用 MOVC A+DPTR 指令访问4表 1-3 C51 编译器的扩展关键字关键字 用 途 说 明bit 位标量声明 声明一个位标量或位类型的函数sbit 位标量声明 声明一个可位寻址变量Sfr 特殊功能寄存器声明 声明一个特殊功能寄存器Sfr16 特殊功能寄存器声明 声明一个 16 位的特殊功能寄存器data 存储器类型说明 直接寻址的内部数据存储器bdata 存储器类型说明 可位寻址的内部数据存储器idata 存储器类型说明 间接寻址的内部数据存储器pdata 存储器类型说明 分页寻址的外部数据存储器xdata
11、 存储器类型说明 外部数据存储器code 存储器类型说明 程序存储器interrupt 中断函数说明 定义一个中断函数reentrant 再入函数说明 定义一个再入函数using 寄存器组定义 定义芯片的工作寄存器表 1-4 常用转义字符表转义字符 含义 ASCII 码(16/10 进制)o 空字符(NULL) 00H/0n 换行符(LF) 0AH/10r 回车符(CR) 0DH/13t 水平制表符(HT) 09H/9b 退格符(BS) 08H/8f 换页符(FF) 0CH/12 单引号 27H/39“ 双引号 22H/34 反斜杠 5CH/92表 1-5 KEIL uVision2 C51
12、编译器所支持的数据类型数据类型 长 度 值 域unsigned char 单字节 0255signed char 单字节 -128+127unsigned int 双字节 065535signed int 双字节 -32768+32767unsigned long 四字节 04294967295signed long 四字节 -2147483648+2147483647float 四字节 1.175494E-383.402823E+38* 13 字节 对象的地址bit 位 0 或 1sfr 单字节 0255sfr16 双字节 065535sbit 位 0 或 15表 1-6 运算符优先级和结合
13、性级 别 类 别 名 称 运算符 结合性强制类型转换 ( )下标 1 强制转换、数组、结构、联合 存取结构或联合成员 -或.右结合增 量 加一 +减 量 减一 -取地址 &指 针取内容 *算 术 单目减 -2长度计算 长度计算 sizeof左结合乘 *除 /3 算 术取模 %加 +4 算术和指针运算减 -左移 大于等于 =大于 小于等于 =小于 恒等于 =6 关系不等于 !=7 按位与 &8 按位异或 9 按位或 |10字 位按位取反 右结合11 逻辑与 &12 逻辑或 |13逻 辑逻辑非 !14 条 件 条件运算 ?:赋值 =15 赋 值复合赋值 Op=左结合16 逗 号 逗号运算 , 右结
14、合6表 1-7 AT89C51 特殊功能寄存器列表(适用于同一架构的芯片)序号 符 号 地 址 注 释1 *ACC E0H 累加器2 *B F0H 乘法寄存器3 *PSW D0H 程序状态字4 SP 81H 堆栈指针5 DPL 82H 数据存储器指针低 8 位6 DPH 83H 数据存储器指针高 8 位7 *IE A8H 中断允许控制器8 *IP D8H 中断优先控制器9 *P0 80H 端口 010 *P1 90H 端口 111 *P2 A0H 端口 212 *P3 B0H 端口 313 PCON 87H 电源控制及波特率选择14 *SCON 98H 串行口控制器15 SBUF 99H 串行数据缓冲器16 *TCON 88H 定时器控制17 TMOD 89H 定时器方式选择18 TL0 8AH 定时器 0 低 8 位19 TL1 8BH 定时器 1 低 8 位20 TH0 8CH 定时器 0 低 8 位21 TH1 8DH 定时器 1 高 8 位带*号的特殊功能寄存器都是可以位寻址的寄存器