第2章C51编程基础
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
⒍ 位变量定义方式
⑴ 定义128位可寻址位的位变量 bit 位变量名 ⑵ 定义11个特殊功能寄存器可寻址位的位变量
sbit 位变量名=位地址常数
2.3 C51运算符和表达式
表示各种运算的符号称为运算符。 由运算符和运算对象组成的具有特定含义的运算式称为表达式。
⒈ 赋值运算符 ⒉ 算术运算符
变量=表达式
3)串行多分支结构。 if (条件表达式1 ) {内嵌语句1;} else if (条件表达式2 ) {内嵌语句2;} „ else if (条件表达式n ) {内嵌语句n;} else {内嵌语句(n+1);} 串行多分支语句运行时,依次计算并判断条件表达式, 若成立(或值为非0),则执行相应的内嵌语句; 若不成立(或值为0),计算并判断下一条件表达式,直至整个if语句结束。 4)if语句嵌套 在if语句中又包含一个或多个if语句,称为if语句嵌套。 if (条件表达式0) if (条件表达式1 ) {内嵌语句11;} else {内嵌语句12;} else if (条件表达式2 ) {内嵌语句21;} else {内嵌语句22;} 内嵌if语句1 内嵌if语句2
2.2 C51变量及其定义方法
⒈ 变量及其存储区域
C51程序中使用的常量和变量必须定位在80C51不同的存储区域。
由于80C51片内RAM空间有限,不同性质的数据应区别对待。 位变量只能定位在片内RAM位寻址区,使用bdata存储器类型; 常用的数据应定位在片内RAM中,使用data和idata存储器类型; 不太常用的数据可定位在片外RAM中,使用pdata和xdata存储器类型; 常量可采用code存储器类型。 若用户不对变量的存储器类型作出定义, 系统将采用由源程序、函数或C51编译器设置的编译模式默认存储器类型。
C51要求,所有变量均应先定义,后使用。其格式如下: 数据类型 [存储器类型] 变量名表
⒌ 80C51特殊功能寄存器定义方式
在C51的文件夹里,有一个取名reg51.h的库函数文件, 对80C51片内21个特殊功能寄存器按MCS-51中取的名字(必须大写) 全部作了定义,并赋予了既定的字节地址。 只需在程序开头的头文件部分写一条预处理命令: #include <reg51.h>,既可调用该库函数reg51.h
80C51单片机主要用于实时控制, 变量一般为8bit无符号格式,16bit较少, 有符号和有小数点的数值计算也很少。 因此,在已知变量长度及变量为正整数的情况下, 应尽量采用8bit无符号格式:unsigned char。
⒊ 标识符
在C语言程序中, 数据、数据类型、变量、数组、函数和语句等常用标识符表示, 实际上标识符就是一个代号, 是上述这些数据和函数的名字。 C语言标识符命名规定: ⑴ 标识符只能由字母、数字和下划线三种字符组成, 且须以字母或下划线开头。 ⑵ 标识符不能与“关键词”同名。 ⑶ 英文字母区分大小写。即标识符中的英文字母大小写不能通用。 ⑷ 有效长度随编译系统而异,一般多于32个字符,已足够用了。
⒈ 表达式语句
在表达式后面加上“ ; ”就构成表达式语句。 需要注意的是,编写语句时,不能忽略语句的有效组成部分“ ; ”, 一条语句,应以“ ; ”结束。
⒉ 复合语句
由若干条单语句组合而成的语句称为复合语句。 复合语句,必须用花括号{}括起,且每个单语句后须有“;”。 花括号的功能是把复合语句中若干单语句组成一条语句, C51将复合语句视为一条“单”语句。 复合语句允许嵌套,即在复合语句中引入另一条复合语句。
⑴ 自增1和自减1有两种写法: ① 双加(减)号写在前面:++i和--i。此时,变量先加(减)1,后使用; ② 双加(减)号写在后面:i++和i--。此时,变量先使用,后加(减)1。
⑵ 除法运算的结果与参与运算数据的类型有关。 若两个数据都是浮点数,则运算结果也为浮点数。 若两个数据都是整数,则运算结果只取整数,舍去小数。
⒋ 循环语句
⑴ while循环语句 while循环根据判断语句在流程中执行的先后可分为: while循环(也称为当型)和do-while循环(也称为直到型)。 1)while循环 while (条件表达式) {循环体语句;} 2)do-while循环 do {循环体语句;} while(条件表达式); while循环(当型)与do-while循环(直到型)的区别是, “先判断后执行”还是“先执行后判断”? 当第一次判断为真时,两者的执行结果是完全相同的。 但若第一次判断为假时,两者的执行结果就不同: while循环一次也没执行,do-while循环至少执行了一次。
C51编译模式选项有3种:Small、Compact和Large 。 一般,应尽量选择Small模式。缺省时,系统默认的模式为Small。
⒉ 局部变量和全局变量
变量按使用范围可分为局部变量和全局变量。 ⑴ 局部变量 局部变量是某个函数内部定义的变量,其使用范围仅限于该函数内部。
C51程序在一个函数开始运行时才对该函数的局部变量分配存储单元, 函数运行结束,即释放该存储单元。 这正是C语言的优点之一,可大大提高内部存储单元的利用率。 不同函数中允许使用相同的局部变量名, 其含义可以不同,不会相互干扰。
③ 全速运行。 运行前先设置,全速运行后 ,观测程序运行结果。
任务4.3 键控信号灯Proteus虚拟仿真运行
⒈ 画Proteus虚拟仿真电路
⒉ 虚拟仿真运行
设置带锁按钮SW0、SW1四种不同的状态 (鼠标左键点击按钮右侧小红点,按钮闭合;再次点击,按钮断开), 信号灯会按题目要求随之变化。 可打开本书配套的<单片机项目式教程仿真50例>项目4,直接操作。
C51编程基础知识准备 2.5 C51函数
函数是C程序的基本单位,即C51程序主要是由函数构成的。
⒈ 函数的分类
分为主函数和普通函数两种。 主函数就是主程序,一个C51源程序必须有也只能有一个main函数, 而且是整个程序执行的起始点。 普通函数是被主函数调用的子函数。 普通函数又可分为标准库函数和自定义函数。
if语句嵌套实际上是用另一个if-else语句替代原if语句中的普通内嵌语句。
⑵ switch语句 switch语句是一种并行多分支选择语句,其作用为散转。 与嵌套的if语句相比,更直接,层次更清晰, 特别适用于分支较多时。
switch (表达式) {case 常量表达式1: {语句1;} break; case 常量表达式2: {语句2;} break; … case 常量表达式n: {语句n;} break; default: {语句(n+1);}} case后的各常量表达式值不能相同, 否则会引起混乱, 导致同一值有多种不同响应。 允许不写break语句。 default后可不加执行语句
⑵ 全局变量 全局变量定义在函数外部,在整个文件或程序中有效,可供各函数共用, 可起到各函数间数据交换的作用。 全局变量始终占用一个固定的存储单元,降低了内部存储单元的利用率 ; 降低了函数的通用性 。因此,应尽量减少全局变量的使用 。 全局变量定义应放在所有函数(包括主函数)之外。
⒋ 变量的定义方式
⑵ for循环语句 for循环是循环结构中语句最简洁、功能最强大的一种。
for (表达式1;表达式2;表达式3) {循环体语句;}
for循环语句括号内三个表达式之间必须用分号“;”分隔。 三个表达式中允许有一个或多个缺位,
1)三个表达式全部为空。 表示无初值、无判断条件、无循环变量更新, 此时将导致一个无限循环, 2)表达式1缺位。 表示在for语句体内未设定初值。有两种情况: 一是在for语句之前未赋初值,则C51默认初值为0; 二是在for语句之前已赋初值,可使for语句应用更灵活。 例如,有些用for语句构成的延时程序, 在for语句体外改变初值就可改变延时时间。
任务4.2 键控信号灯Keil编译调试
⑴ 打开μVision,建立工程项目,设置工程属性。 ⑵ 编写和输入源程序。 ⑶ 程序编译链接及纠错。 ⑷ 调试设置准备。 ① 打开P1口; ② 在if语句和else if语句行设置断点。 ⑸ 程序调试。 ① 断点运行; 在断点处设置 P1.7、P1.6(s0、s1)的状态 全速运行后,观测P1.3~P1.0状态(VD0~VD3灯的亮灭状态 ) ② 单步运行; 删除断点,单步运行,过程较慢,但可观测程序运行全过程。 设置不同,不但程序运行最终结果不同,而且程序运行路径也不同。
单片机应用 项目式教程
——基于Keil和Proteus
配套<单片机项目式教程仿真50例 >
50例全部取自于本书项目和练习题,免费下载
机械工业出版社同名教材配套电子教案 张志良主编 Email:zzlls@
第 2章
C51编程基础
第2章 目录
C51编程基础知识准备 2.1 C51数据与数据类型 2.2 C51变量及其定义方法 2.3 C51运算符和表达式 2.4 C51基本语句 项目4 键控信号灯 任务4.1 编制键控信号灯程序 任务4.2 键控信号灯Keil编译调试 任务4.3 键控信号灯Proteus虚拟仿真运行 C51编程基础知识准备 2.5 C51函数 2.6 C51数组和指针 项目7 花样循环灯 任务7.1 编制花样循环灯程序 任务7.2 花样循环灯Keil编译调试 任务7.3 花样循环灯Proteus虚拟仿真
⑶ 求余运算时,“%”符左侧为被除数,右侧为除数。 且要求参与运算的数据都是整型,运算结果为两数相除的余数。
⒊ 关系运算符
关系运算符用于两个数据之间进行比较判断, 关系表达式运算的结果只能有两种: 条件满足,运算结果为1(真); 条件不满足,运算结果为0(假)。
⒋ 逻辑运算符
逻辑运算符用于求条件表达式整体之间逻辑运算的逻辑值。 条件表达式的值只有两种:1(非0或真)或0(假); 运算结果也只有两种:1(真)或0(假)。
3)无循环体语句。 通常用作延时程序,但语句末尾的“;”不能少。
项目4 键控信号灯
任务4.1 编制键控信号灯程序
键控信号灯电路如图所示,要求实现: ① S0、S1均未按下,VD0亮,其余灯灭; ② S0单独按下,VD1亮,其余灯灭; ③ S1单独按下,VD2亮,其余灯灭; ④ S0、S1均按下,VD3亮,其余灯灭。 根据按键状态控制信号灯亮灭, 应用选择语句。 C51选择语句有多种形式, 因此,编制键控信号灯程序也有多种形式。
⒌ 位逻辑运算符
位逻辑运算是变量数据本身(值可以是任意整常数)按位(化为二进制数) 进 复合赋值运算符
复合赋值运算符由运算符和赋值运算符叠加组合
2.4 C51基本语句
C51语句是组成程序的基本成分,是学习C51编程的基础。 C51基本语句主要有表达式语句、复合语句、选择语句和循环语句。
C51编程基础知识准备
2.1 C51数据与数据类型 ⒈ 数据类型和数据长度
基本类型:位型bit、字符型char、整型int、长整型long和浮点型 float; 还有数组array(属构造类型)和指针 根据有、无符号,又可分别分为signed和unsigned, 有符号时,signed一般可省略不写。 无符号时全部为正值;有符号时,其值域有正有负, 最高位用于表示正负,“0”表示正,“1”表示负。
⑴ if-else语句
⑵ if语句嵌套
⑶ switch语句
上述switch语句程序中, 第6行“P1&0xc0”是屏蔽P1口后6位,单取P1.7、P1.6键状态值; 第8~11行中“P1&0xf0|0x××”是保留P1口高4位状态 (P1.5、P1.4可能还有他用,不能随意改变), 改变低4位VD3~VD0亮灭状态, 高4位先“与”1,后“或”0,低4位先“与”0,后“或”灯亮灭状态值。
⒊ 选择语句
选择语句是根据给定的条件是否成立进行判断,从而选择相应的操作。 选择语句具有一定的逻辑分析能力和选择决策功能, 按结构可分为单分支选择结构和多分支选择结构, 主要有if语句和switch语句。 ⑴ if语句 1)条件成立就选择,否则就不选择。 if (条件表达式) {内嵌语句;} 2)不论条件成立与否,总要选择一个。 if (条件表达式) {内嵌语句1;} else {内嵌语句2;}