《单片机实用教程全套课件完整版电子教案最新板.ppt》由会员分享,可在线阅读,更多相关《单片机实用教程全套课件完整版电子教案最新板.ppt(175页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、基于基于Keil C和和Proteus 双解汇编和双解汇编和C51两种程序两种程序每条指令每条指令/语句均给出注释语句均给出注释编入编入36例例Proteus仿真实验仿真实验 第第1章章 80C51单片机片内结构和工作原理单片机片内结构和工作原理 第第1章章 80C51单片机片内结构和工作原理单片机片内结构和工作原理 电子计算机是二十世纪人类最伟大的发明之一而微型计算机的发展,使人类社会大步跨入电脑时代改变了社会生活的各个方面 1.1 单片机概述单片机概述 另一类是嵌入式微处理器,通常是我们常说的单片机 全力满足测控对象的测控功能,兼顾数据处理能力微型计算机可以分成两大分支:一类是个人计算机,
2、也称为PC机(Personal Computer)全力实现海量高速数据处理,兼顾控制功能同时,两大分支之间串行通信,优势互补 形成了网络控制系统 使功能更强大,更完善 实现了近代计算机技术的突飞猛进 1.1.1 单片机发展概况单片机发展概况 什麽是单片机?什麽是单片机?“Single Chip Micro Computer”忠实地反映了早期单片机的形态和本质现代“单片机”概念:微控制器MCU(Micro Controller Unit)单板机是将微处理器芯片、存储器芯片和输入输出接口芯片 安装在同一块印制电路板上,构成具有一定功能的计算机系统单片机是将微处理器、存储器和输入输出接口电路 集成在
3、一块集成电路芯片上,构成具有一定功能的计算机系统 单片机之前,曾出现过单板机 单片机应用单片机应用 单片机应用领域之广,几乎到了无所不在的地步各领域智能化产品几乎都有“单片机”的影子 单片机应用的意义 不仅在于它的广阔范围及所带来的经济效益更重要的是 从根本上改变了控制系统传统的设计思想和设计方法 单片机发展概况单片机发展概况 探索阶段 以Intel公司MCS-48为代表,属低档型8位机大致可分为四个阶段:完善阶段 以Intel公司MCS-51为代表,属高档型8位机 MCS-51系列后来改进为80C51系列 在世界和我国得到了广泛的应用 Intel公司推出了16位的MCS-96系列单片机 16
4、位机肯定比8位机性能优 但由于价格不菲,其应用面受到一定限制相反,MCS-51系列单片机,由于其性能价格比高 并吸引了世界许多知名芯片制造厂商加盟,竞相使用以80C51为内核 扩展部分测控系统中使用的电路技术、接口技术 推出了许多与80C51兼容的8位单片机 得到了比16位机更广泛的应用 8位机与16位机争艳阶段 微控制器全面发展阶段 随着单片机在各个领域全面深入发展和应用世界各大电气、半导体厂商普遍投入出现了高速、大寻址范围、强运算能力的通用型单片机32位、64位微处理器相继问世 例如ARM(Advanced RISC Machines)系列微处理器内存越来越大,主频越来越高并且驻入嵌入式操
5、作系统 甚至可以直接使用Windows和Linux操作系统高端嵌入式微处理器的功能已经开始接近PC机1.1.2 80C51系列单片机系列单片机 MCS-51单片机是上世纪80年代由Intel公司推出的 最初是HMOS制造工艺,功耗较大 后来推出CHMOS工艺的80C51芯片,大大降低了功耗随后,Intel公司将80C51内核使用权以专利互换或出售形式 转让给世界许多著名IC制造厂商 例如philips、Atmel、Dallas、LG等在保持与80C51兼容的基础上,融入自身的优势 扩展了针对满足不同测控对象要求的外围电路 开发出几百种功能各异的新品种 形成了有众多芯片制造厂商支持的80C51大
6、家族目前我国国内应用最广泛的是 Atmel公司的AT89系列和宏晶公司的STC系列单片机芯片1.2 80C51单片机片内结构和引脚功能单片机片内结构和引脚功能 1.2.1 片内结构片内结构 1.2.2 引脚功能引脚功能 共40个引脚,大致可分为四类:电源、时钟、控制和I/O引脚 电源电源 VCC 芯片电源,接+5V VSS 接地端 时钟时钟 XTAL1、XTAL2 外接石英晶体 控制线控制线 ALE/PROG 地址锁存允许/片内EPROM编程脉冲 ALE功能:用来锁存P0口送出的低8位地址 PROG功能:在EPROM编程期间,此引脚输入编程脉冲 PSEN 外ROM读选通信号 RST/VPD 复
7、位/备用电源 RST(Reset)功能:正常工作时,输入复位信号 在该引脚上连续保持2个机器周期以上高电平,80C51复位 VPD功能:在VCC掉电情况下,该引脚可接上备用电源 EA/VPP 内外ROM选择/片内EPROM编程电源 功能:正常工作时,用于选择内外ROM EA=0,只访问外ROM EA=1,先访问内ROM,超过4kB时,自动转向外ROM VPP功能:在EPROM编程期间,用于施加编程电源VPP I/O线线 有4个8位并行I/O端口:P0、P1、P2和P3口,每口8位,共32个引脚 4个I/O口,各有各的用途在并行扩展外存储器时 P0口专用于分时传送低8位地址信号和8位数据信号 P
8、2口专用于传送高8位地址信号 P3口根据需要常用于特殊信号输入输出和控制信号1.3 存储空间配置和功能存储空间配置和功能 80C51可分为3个不同的存储空间:64kB程序存储器(ROM),包括片内ROM和片外ROM 64kB外部数据存储器(简称外RAM)256B(包括特殊功能寄存器)内部数据存储器(简称内RAM)3个不同的存储空间用不同的指令和控制信号实现读、写功能操作:(1)ROM空间用MOVC指令实现只读功能操作,用PSEN信号选通读外ROM。(2)外RAM空间用MOVX指令实现读写功能操作 用RD信号选通读外RAM,用WR信号选通写外RAM。内RAM(包括特殊功能寄存器)用MOV指令实现
9、读、写功能操作。1.3.3 内部数据存储器(内内部数据存储器(内RAM)可分成三个物理空间:工作寄存器区、位寻址区和数据缓冲区 1.3.4 特殊功能寄存器(特殊功能寄存器(SFR)特殊功能寄存器(Special Flag Register,缩写为SFR)共有21个,离散地分布在高128B片内RAM 80HFFH中 累加器ACC(Accumulator)ACC是80C51单片机中最常用的寄存器 许多指令的操作数取自于ACC 许多运算的结果存放在ACC中 乘除法指令必须通过ACC进行 ACC的指令助记符为A 寄存器B 乘除法指令中要用到寄存器B 此外,B可作为一般寄存器用 程序状态字寄存器PSW(
10、Program Status Word)存放当前指令执行的状态和各有关标志 Cy 进位标志 加减法运算时,若最高位有进位或借位,Cy置1,否则清0 位操作时,Cy是位操作累加器,指令助记符用C表示 AC 辅助进位标志 加减运算时,若ACC.3向ACC.4有进(借)位,AC置1,否则清0 RS1、RS0 工作寄存器区选择控制位 工作寄存器区有4个,但当前工作的寄存器区只能打开一个 RS1、RS0的编号用于选择当前工作的寄存器区 RS1、RS0=00 0区(00H07H)RS1、RS0=01 1区(08H0FH)RS1、RS0=10 2区(10H17H)RS1、RS0=11 3区(18H1FH)O
11、V 溢出标志 用于表示ACC在有符号数算术运算中的溢出 溢出和进位是两个不同的概念 进位是指ACC.7向更高位进位,用于无符号数运算 溢出是指有符号数运算时,运算结果数超出+127-128范围 发生溢出时OV置1,否则清0 P 奇偶标志 表示ACC中“1”的个数的奇偶性 F0 用户标志 可作位寄存器用 数据指针DPTR(Data Pointer)16位的特殊功能寄存器,由两个8位寄存器DPH、DPL组成 主要用于存放一个16位地址,作为访问外部存储器的地址指针 堆栈指针SP(Stack Pointer)堆栈是CPU用于暂时存放特殊数据的“仓库”例如子程序断口地址,中断断口地址和其他需要保存的数
12、据 堆栈指针SP专用于指出堆栈顶部数据的地址 堆栈中数据存取按先进后出、后进先出的原则1.5 时钟和时序时钟和时序 1.5.1 时钟电路和机器周期时钟电路和机器周期 时钟电路时钟电路 时钟周期和机器周期时钟周期和机器周期 时钟周期 是80C51振荡器产生的时钟脉冲频率的倒数,是最基本最小的定时信号 机器周期 是80C51单片机工作的基本定时单位 机器周期是时钟周期的12倍 当时钟频率为12MHz时,机器周期为1s 当时钟频率为6MHz时,机器周期为2s1.5.2 时序时序 时序是执行指令的操作节拍步骤每一条指令的执行都可以包括取指和执行两个阶段可分为:单机周指令、双机周指令和四机周指令 只有乘
13、除法指令执行时间是4机周。其余指令执行时间为12个机器周期1.6 复位和低功耗工作方式复位和低功耗工作方式 80C51单片机的工作方式共有四种:复位方式、程序执行方式、低功耗方式和片内ROM编程方式 程序执行方式是单片机的基本工作方式 CPU按照PC所指出的地址从ROM中取指并执行 每取出一个字节,PC+1PC 当调用子程序、中断或执行转移指令时 PC会相应产生新的地址 片内ROM编程一般由专门的编程器实现,用户不需了解1.6.1 复位复位 复位条件复位条件 必须使RST引脚(编号9)保持2个机器周期以上的高电平 复位电路复位电路 复位后复位后CPU状态状态 基于基于Keil C和和Prote
14、us 双解汇编和双解汇编和C51两种程序两种程序每条指令每条指令/语句均给出注释语句均给出注释编入编入36例例Proteus仿真实验仿真实验 第第4章章 C51语言及程序设计语言及程序设计 80C51单片机实用教程单片机实用教程基于基于Keil C和和Proteus配套配套Proteus虚拟仿真虚拟仿真36例目录(免费下载)例目录(免费下载)对照书中程序,演示运行理解,增强教学效果对照书中程序,演示运行理解,增强教学效果 C语言概述语言概述第第4章章 C51语言及程序设计语言及程序设计 4.1 C51概述概述 C语言是一种结构化语言,简洁、紧语言是一种结构化语言,简洁、紧凑,层次清晰,便于按模
15、块化方式编写凑,层次清晰,便于按模块化方式编写程序;有丰富的运算符和数据类型,能程序;有丰富的运算符和数据类型,能适应并实现各种复杂的数据处理;能实适应并实现各种复杂的数据处理;能实现位(现位(bit)操作,生成目标代码效率)操作,生成目标代码效率较高,可移植性好,兼有高级语言和低较高,可移植性好,兼有高级语言和低级语言的优点。级语言的优点。因此,因此,C语言应用范围越来越广泛。语言应用范围越来越广泛。目前,各种操作系统和单片机,都可以目前,各种操作系统和单片机,都可以用用C语言编程,语言编程,C语言是一种通用的程语言是一种通用的程序设计语言,在大型、中型、小型和微序设计语言,在大型、中型、小
16、型和微型计算机上都得到了广泛应用。型计算机上都得到了广泛应用。用于用于80C51系列单片机编程的系列单片机编程的C语言,通常称为语言,通常称为C51C51实际上是一个编译系统实际上是一个编译系统能将能将C语言程序转换成语言程序转换成80C51可执行代码可执行代码 C51编程的主要特点编程的主要特点 编程相对方便。编程相对方便。能自动完成对变量存储单元的分配和使用能自动完成对变量存储单元的分配和使用 仅在调用时临时分配存储单元,使用完毕即行释放仅在调用时临时分配存储单元,使用完毕即行释放 大大提高了大大提高了80C51片内有限存储空间的使用效率片内有限存储空间的使用效率 使用者不需过多关注涉及的
17、具体存储单元及其操作指令使用者不需过多关注涉及的具体存储单元及其操作指令 便于实现各种复杂的运算和程序便于实现各种复杂的运算和程序 具有丰富且功能强大的运算符具有丰富且功能强大的运算符 可方便地调用各已有程序模块可方便地调用各已有程序模块 可读性较好可读性较好 实时性较差实时性较差4.2 C51数据与运算数据与运算 4.2.1 数据与数据类型数据与数据类型 数据类数据类型型 数据的不同格式称为数据类型数据的不同格式称为数据类型字符型、整型和长整型数据字符型、整型和长整型数据还又可分别分为有符号还又可分别分为有符号signed和无符号和无符号unsigned 数据长度和值域数据长度和值域表表4-
18、1 C51数据长度和值域数据长度和值域 标识符标识符 数据、变量、数组、函数等常用标识符表示数据、变量、数组、函数等常用标识符表示实际上标识符就是一个代号、代名字实际上标识符就是一个代号、代名字C51标识符命名规定:标识符命名规定:只能由字母、数字和下划线三种字符组成只能由字母、数字和下划线三种字符组成 且须以字母或下划线开头。且须以字母或下划线开头。不能与不能与“关键词关键词”同名同名 ANSI C和和Keil C51的关键词分别如的关键词分别如表表4-2和和表表4-3所示所示 英文字母区分大小写英文字母区分大小写标识符命名宜简单而含义清晰标识符命名宜简单而含义清晰4.2.2 变量及其定义方
19、法变量及其定义方法C51数据可分为常量和变量数据可分为常量和变量程序运行过程中,其值可以改变的量称为变量程序运行过程中,其值可以改变的量称为变量变量名按标识符规则定义变量名按标识符规则定义变量值存储在存储器中变量值存储在存储器中变量必须先定义,后使用变量必须先定义,后使用程序运行中,通过变量名引用变量值程序运行中,通过变量名引用变量值可分为:可分为:字符型变量字符型变量 整型变量整型变量 实型变量实型变量 位变量位变量 指针变量指针变量 变量的存储区域变量的存储区域常量和变量必须定位在常量和变量必须定位在80C51不同的存储区域不同的存储区域存储区域按存储器类型分类存储区域按存储器类型分类 不
20、同的存储器类型,其访问方式和速度也就不同不同的存储器类型,其访问方式和速度也就不同在已知变量长度及变量为正整数的情况下在已知变量长度及变量为正整数的情况下 应尽量采用应尽量采用8bit无符号格式:无符号格式:unsigned char 存储器类型存储器类型表表4-5 C51存储器类型与存储器类型与80C51存储空间的对应关系存储空间的对应关系 不同性质的数据应区别对待不同性质的数据应区别对待 位变量只能定位在片内位变量只能定位在片内RAM位寻址区位寻址区 使用使用bdata存储器类型存储器类型 常用的数据应定位在片内常用的数据应定位在片内RAM中中 使用使用data和和idata存储器类型存储
21、器类型 不太常用的数据可定位在片外不太常用的数据可定位在片外RAM中中 使用使用pdata和和xdata存储器类型存储器类型 常量可采用常量可采用code存储器类型存储器类型 编译模式编译模式 若用户不对变量的存储器类型作出定义若用户不对变量的存储器类型作出定义系统将由编译模式默认存储器类型系统将由编译模式默认存储器类型编译模式由源程序、函数或编译模式由源程序、函数或C51编译器设置编译器设置表表4-6 C51存储器编译模式存储器编译模式 局部变量和全局变量局部变量和全局变量变量按使用范围可分为局部变量和全局变量变量按使用范围可分为局部变量和全局变量 局部变量局部变量 局部变量是某个函数内部定
22、义的变量局部变量是某个函数内部定义的变量 使用范围仅限于该函数内部使用范围仅限于该函数内部 不同函数中允许使用相同的局部变量名不同函数中允许使用相同的局部变量名 函数运行结束,即释放局部变量存储单元函数运行结束,即释放局部变量存储单元 可大大提高可大大提高80C51内存单元的利用率内存单元的利用率 全局变量全局变量 全局变量在整个文件或程序中有效,可供各函数共用全局变量在整个文件或程序中有效,可供各函数共用 使用全局变量可以增加各函数间数据联系的渠道使用全局变量可以增加各函数间数据联系的渠道 使用全局变量的缺点:使用全局变量的缺点:始终占用一个固定的存储单元始终占用一个固定的存储单元 降低了内
23、部存储单元的利用率降低了内部存储单元的利用率 降低了函数的通用性降低了函数的通用性 函数移植到其他文件时需同时将全局变量一起移植函数移植到其他文件时需同时将全局变量一起移植 因此,应尽量减少全局变量,能不用就尽量不用因此,应尽量减少全局变量,能不用就尽量不用 变量的定义方式变量的定义方式 定义格式:定义格式:数据类型数据类型 存储器类型存储器类型 变量名表变量名表带中括号带中括号 者为非必需项,缺省时由者为非必需项,缺省时由C51编译器默认编译器默认例如:例如:unsigned int a;char b=100,c;char data var;float idata x,y,z;unsigne
24、d int pdata sum;char code text=CHINA;unsigned char xdata *ap;定义定义80C51特殊功能寄存器及其可寻址位特殊功能寄存器及其可寻址位C51虽可用关键词定义虽可用关键词定义80C51特殊功能寄存器特殊功能寄存器 体现了体现了C51编译功能的多样性和完整性编译功能的多样性和完整性 但编者还是建议读者不要去重新定义但编者还是建议读者不要去重新定义直接使用预处理命令:直接使用预处理命令:#include 即可在程序中直接引用即可在程序中直接引用21个特殊功能寄存器个特殊功能寄存器 及其可位寻址并有专用位定义名称的位变量及其可位寻址并有专用位定
25、义名称的位变量既省事又不易出错既省事又不易出错 位变量定义方式位变量定义方式 定义定义128位可寻址位的位变量位可寻址位的位变量 定义格式:定义格式:bit 位变量名位变量名 例如:例如:bit u,v;/定义位变量定义位变量u,v 定义定义ACC、B、P0、P1和和P2中的位变量中的位变量 这些位变量没有专用的位定义名称,只有位编号这些位变量没有专用的位定义名称,只有位编号 但这些位编号不符合但这些位编号不符合ANSI C标识符要求标识符要求 应重新定义。其格式如下:应重新定义。其格式如下:sbit 位变量名位变量名=位地址常数位地址常数 例如:例如:sbit P10=P10;/定义定义P1
26、0为为P1.0 绝对地址变量定义方式绝对地址变量定义方式绝对地址变量需要指定变量的存储单元地址绝对地址变量需要指定变量的存储单元地址 属全局变量,定义方法有两种:属全局变量,定义方法有两种:应用关键词应用关键词 _at_ 数据类型数据类型 存储器类型存储器类型 变量名变量名_at_绝对地址绝对地址 例如:例如:unsigned char xdata PA_at_0 x7fff;应用绝对地址访问应用绝对地址访问#include 需引用需引用C51库函数库函数absacc.h表表4-15 绝对地址绝对地址 4.2.3 运算符和表达式运算符和表达式 赋值运算符赋值运算符 一般格式:一般格式:变量表达
27、式变量表达式 由赋值运算符组成的表达式称为赋值表达式由赋值运算符组成的表达式称为赋值表达式 算术运算符算术运算符表表4-7 C51算术运算符表算术运算符表 自增自增1和自减和自减1有两种写法:有两种写法:i和和i:i先加(减)先加(减)1,后使用,后使用 i和和i:i先使用,后加(减)先使用,后加(减)1 除法运算的结果与参与运算数据的类型有关除法运算的结果与参与运算数据的类型有关 若两个数据都是整数,则运算结果也为整数若两个数据都是整数,则运算结果也为整数 即使有余数,也只取整数,舍去小数即使有余数,也只取整数,舍去小数 例如:例如:7/3,运算结果为,运算结果为 2 求余运算要求参与运算的
28、数据都是整型求余运算要求参与运算的数据都是整型 运算结果为两数相除的余数运算结果为两数相除的余数 例如:例如:73,运算结果为,运算结果为 1算术运算符说明算术运算符说明 关系运算符关系运算符表表4-8 C51关系运算符表关系运算符表 用于两个数据之间进行比较判断用于两个数据之间进行比较判断运算的结果只能有两种:运算的结果只能有两种:条件满足,运算结果为条件满足,运算结果为1(真)(真)条件不满足,运算结果为条件不满足,运算结果为0(假)(假)注意,不要混淆注意,不要混淆“”与与“的区别的区别 “用于给变量赋值用于给变量赋值 “”用于判断是否相等用于判断是否相等 逻辑运算符逻辑运算符表表4-9
29、 C51逻辑运算符逻辑运算符 一般形式为:一般形式为:逻辑与:逻辑与:(条件表达式(条件表达式1)&(条件表达式(条件表达式2)逻辑或:逻辑或:(条件表达式(条件表达式1)|(条件表达式(条件表达式2)逻辑非:逻辑非:!(条件表达式)(条件表达式)用于求条件表达式整体之间逻辑运算的逻辑值用于求条件表达式整体之间逻辑运算的逻辑值 条件表达式的值只有两种:条件表达式的值只有两种:1或或0 运算结果也只有两种:运算结果也只有两种:1或或0 位逻辑运算符位逻辑运算符表表4-10 C51位逻辑运算符表位逻辑运算符表 用于变量数据本身按位进行逻辑运算用于变量数据本身按位进行逻辑运算例如,若例如,若a=21
30、1,b=185 “a&b”的结果是的结果是145 “a&b”的结果却是的结果却是1 位左移时,低位移进位左移时,低位移进0,移出位作废,移出位作废 位右移时,无符号数和正数高位移进位右移时,无符号数和正数高位移进0 负数补码移进负数补码移进1,移出位作废,移出位作废 有符号数无论位左移右移,符号位均不参与移位有符号数无论位左移右移,符号位均不参与移位 复合赋值运算符复合赋值运算符表表4-11 C51复合赋值运算符表复合赋值运算符表 复合赋值运算符由运算符和赋值运算符叠加组合复合赋值运算符由运算符和赋值运算符叠加组合复合赋值运算符是先进行运算符所要求的运算复合赋值运算符是先进行运算符所要求的运算
31、 再把运算结果赋值给复合赋值运算符左侧的变量再把运算结果赋值给复合赋值运算符左侧的变量例如,例如,x+=y等同于等同于x=x+y x/=y+10等同于等同于x=x/(y+10)4.3 C51基本语句基本语句 4.3.1 语句基本概念语句基本概念 语句是用来向计算机系统发出的操作指令语句是用来向计算机系统发出的操作指令一条一条C51语句编译后会产生若干条机器操作码语句编译后会产生若干条机器操作码有表达式语句、复合语句、选择语句和循环语句有表达式语句、复合语句、选择语句和循环语句 表达式语句表达式语句 在表达式后面加上在表达式后面加上“;”就构成表达式语句就构成表达式语句 例如:例如:a=b+c;
32、复合语句复合语句 由若干条单语句组合而成的语句称为复合语句由若干条单语句组合而成的语句称为复合语句 局部变量定义局部变量定义;语句语句1;语句语句2;语句语句n;单一语句,可不用花括号单一语句,可不用花括号括起括起 复合语句,必须用花括号复合语句,必须用花括号括起括起 且每个单语句后须有且每个单语句后须有“;”复合语句允许嵌套复合语句允许嵌套 即在复合语句中引入另一条复合语句即在复合语句中引入另一条复合语句4.3.2 选择语句选择语句 选择语句是根据给定的条件是否成立选择语句是根据给定的条件是否成立 判断并选择相应的操作判断并选择相应的操作 if语句语句 C51中的中的if语句可分为语句可分为
33、3种形式:种形式:图图4-5 if语句流程图语句流程图 条件成立就选择,否则就不选择条件成立就选择,否则就不选择 if(条件表达式条件表达式)内嵌语句内嵌语句;例如:例如:if(xy)m=x;/若若xy,最大值,最大值m=x max=m;/最大值最大值max=m 不论条件成立与否,总要选择一个不论条件成立与否,总要选择一个 if(条件表达式条件表达式)内嵌语句内嵌语句1;else 内嵌语句内嵌语句2;例如:例如:if(xy)max=x;/若若xy,最大值,最大值max=x else max=y;/否则,最大值否则,最大值max=y 也可以用条件运算符也可以用条件运算符“?:”实现实现 表达式表
34、达式1?表达式?表达式2:表达式表达式3;例如:例如:max=(xy)?x:y;/若若xy,max=x;否则,;否则,max=y 串行多分支结构串行多分支结构 如图如图4-5c所示所示 if(条件表达式条件表达式1)内嵌语句内嵌语句1;else if(条件表达式条件表达式2)内嵌语句内嵌语句2;else if(条件表达式条件表达式n)内嵌语句内嵌语句n;else 内嵌语句(内嵌语句(n+1);【例例4-6】要求实现双键控要求实现双键控4灯灯 K0、K1均未按下,均未按下,VD0亮,其余灯灭;亮,其余灯灭;K0单独按下,单独按下,VD1亮,其余灯灭;亮,其余灯灭;K1单独按下,单独按下,VD2亮
35、,其余灯灭;亮,其余灯灭;K0、K1均按下,均按下,VD3亮,其余灯灭。亮,其余灯灭。图图4-6 信号灯电路信号灯电路 演示演示Keil C51调试和调试和Proteus仿真(见仿真(见实验实验5)双键控双键控4灯程序灯程序 if语句嵌套语句嵌套【例例4-7】试用试用if语句嵌套实现双键控语句嵌套实现双键控4灯灯演示演示Keil C51调试和调试和Proteus仿真(见仿真(见实验实验5)switch语句语句 switch语句是一种并行多分支选择语句,也称为散转语句是一种并行多分支选择语句,也称为散转 图图4-7 switch语句流程图语句流程图【例例4-8】试用试用switch语句实现双键控
36、语句实现双键控4灯灯 演示本例演示本例Keil C51调试和调试和Proteus仿真(见仿真(见实验实验5)4.3.3 循环语句循环语句 while循环语句循环语句 根据判断语句在流程中执行的先后根据判断语句在流程中执行的先后 可分为可分为while循环和循环和do-while循环循环图图4-8 循环语句流程图循环语句流程图 while循环循环while(条件表达式条件表达式)循环体语句循环体语句;【例例4-9】试求:试求:sum=n=1+2+100 演示本例本例演示本例本例Keil C51调试调试 最后显示:最后显示:n=101,sum=5050表示表示n=101时停止累加时停止累加之前累加
37、值之前累加值sum=5050 do-while循环循环do 循环体语句循环体语句;while(条件表达式)(条件表达式);【例例4-10】用用do-while循环语句实现循环语句实现n最后显示:最后显示:n=101,sum=5050表示表示n=101时停止累加时停止累加之前累加值之前累加值sum=5050演示本例本例演示本例本例Keil C51调试调试while循环与循环与do-while循环的区别:循环的区别:先判断后执行先判断后执行 还是还是 先执行后判断先执行后判断当第一次判断为真时当第一次判断为真时 两者的执行结果是完全相同两者的执行结果是完全相同但若第一次判断为假时但若第一次判断为假
38、时 两者的执行结果就不同两者的执行结果就不同 while循环一次也没执行循环一次也没执行 do-while循环至少执行了一次循环至少执行了一次 for循环语句循环语句 for(表达式表达式1;表达式;表达式2;表达式;表达式3)循环体语句循环体语句;首先对循环变量(表达式首先对循环变量(表达式1)赋初值)赋初值 判断表达式判断表达式2 是否满足给定的循环条件是否满足给定的循环条件 若满足循环条件(值为非若满足循环条件(值为非0)则执行循环体语句则执行循环体语句 若不满足循环条件(值为若不满足循环条件(值为0)则结束循环则结束循环 在满足循环条件(值为非在满足循环条件(值为非0)的前提下)的前提
39、下 执行循环体语句;执行循环体语句;计算表达式计算表达式3,更新循环变量;,更新循环变量;返回判断表达式返回判断表达式2,重复,重复及以下操作及以下操作 直至跳出直至跳出for循环语句。循环语句。图图4-9 for循环流程图循环流程图【例例4-11】用用for循环语句实现循环语句实现n最后显示:最后显示:n=101,sum=5050表示表示n=101时停止累加时停止累加之前累加值之前累加值sum=5050演示本例本例演示本例本例Keil C51调试调试 循环嵌套循环嵌套 在一个循环体内包含另一个循环,称为循环嵌套在一个循环体内包含另一个循环,称为循环嵌套 循环嵌套常用于延时程序循环嵌套常用于延
40、时程序【例例4-12】要求要求8个发光二极管循环点亮个发光二极管循环点亮 每次点亮时间约为每次点亮时间约为0.5秒。秒。演示本例演示本例Keil C51调试和调试和Proteus仿真(见仿真(见实验实验6)4.4 C51构造类型数据构造类型数据 4.4.1 数组数组数组是一组具有相同类型数据的有序集合数组是一组具有相同类型数据的有序集合数组可分为一维和多维,常用的是一维数组数组可分为一维和多维,常用的是一维数组 一维数组一维数组 定义格式定义格式 数据类型数据类型 存储器类型存储器类型 数组数组名名元素个数元素个数 例如:例如:unsigned int code a10;引用格式引用格式 数组
41、名数组名下标下标 注意:数组下标是从注意:数组下标是从0开始编开始编号的号的 数组赋值数组赋值 一般在数组初始化时(即数一般在数组初始化时(即数组定义时)赋值组定义时)赋值在单片机应用中,数组的主要功在单片机应用中,数组的主要功能是查表能是查表【例例4-15】循环灯电路,要求实现流水循环循环灯电路,要求实现流水循环演示本例演示本例Keil C51调试和调试和Proteus仿真(仿真(实验实验6)花样循环灯电路花样循环灯电路,要求按下列顺序循环,要求按下列顺序循环:全亮,全暗,并重复一次;全亮,全暗,并重复一次;从上至下,每次亮从上至下,每次亮2个;个;从下至上,每次亮从下至上,每次亮2个;个;
42、从上至下,每次亮从上至下,每次亮4个,并重复一次;个,并重复一次;从上至下,每次间隔亮从上至下,每次间隔亮2个;个;每次间隔亮每次间隔亮4个,并重复一次;个,并重复一次;返回返回,不断循环。,不断循环。演示本例演示本例Keil C51调试和调试和Proteus仿真(仿真(实验实验6)实际上是按花样循环码数组依次运行实际上是按花样循环码数组依次运行4.4.2 指针指针 指针和指针变量指针和指针变量 指针就是地址指针就是地址 变量的指针就是变量的地址变量的指针就是变量的地址 存放指针的变量称为指针变量存放指针的变量称为指针变量 指针变量定义方式指针变量定义方式数据类型数据类型 数据存储器类型数据存
43、储器类型 *指针存储器类型指针存储器类型 指针变量名指针变量名 取地址运算符和指针运算符取地址运算符和指针运算符&:取地址运算符:取地址运算符 例如:例如:y=&a;*:指针运算符:指针运算符 例如:例如:z=*ap;用指针实现例用指针实现例4-15花样循环电路花样循环电路演示本例演示本例Keil C51调试和调试和Proteus仿真(仿真(实验实验6)说明:本程序书中没有说明:本程序书中没有4.5 C51函数函数函数是函数是C程序的基本单位程序的基本单位即即C51程序主要是由函数构成的程序主要是由函数构成的 4.5.1 函数概述函数概述 可分为主函数可分为主函数main()和普通函数和普通函
44、数一个一个C51源程序必须有也只能有一个源程序必须有也只能有一个main函数函数而且是整个程序执行的起始点而且是整个程序执行的起始点普通函数是被主函数调用的子函数普通函数是被主函数调用的子函数普通函数又可分为标准库函数和自定义函数普通函数又可分为标准库函数和自定义函数标准库函数是由标准库函数是由C51编译系统的函数库提供的编译系统的函数库提供的用户自定义函数就是用户根据自己的需要编写的函数用户自定义函数就是用户根据自己的需要编写的函数 函数的分类函数的分类 函数的定义方式函数的定义方式返回值类型是指本函数返回值的数据类型,返回值类型是指本函数返回值的数据类型,若无返回值,则成为无类型,用若无返
45、回值,则成为无类型,用void表示;表示;若该项要素缺省,则若该项要素缺省,则C51编译系统默认为编译系统默认为int类型。类型。函数名除了函数名除了main函数有固定名称外,函数有固定名称外,其他函数由用户按标识符的规则自行命名。其他函数由用户按标识符的规则自行命名。形式参数用变量名(标识符)表示,没有具体数值;形式参数用变量名(标识符)表示,没有具体数值;可以是一个,或多个(中间用逗号可以是一个,或多个(中间用逗号“,”分隔),或没有形式参数。分隔),或没有形式参数。编译属性是指定该函数采用的存储器编译模式,编译属性是指定该函数采用的存储器编译模式,有有Small、Compact和和Lar
46、ge 3种选择,缺省时,默认种选择,缺省时,默认Small模式。模式。中断属性是指明该函数是否中断函数;中断属性是指明该函数是否中断函数;寄存器组属性是指明该函数被调用时准备采用哪组工作寄存器。寄存器组属性是指明该函数被调用时准备采用哪组工作寄存器。局部变量是仅应用于本函数内的变量,局部变量是仅应用于本函数内的变量,在执行本函数时临时开辟存储单元使用,本函数运行结束即予释放;在执行本函数时临时开辟存储单元使用,本函数运行结束即予释放;局部变量说明是说明该变量的数据类型、存储器类型等。局部变量说明是说明该变量的数据类型、存储器类型等。不能颠倒局部变量说明与函数体语句的次序,否则不能颠倒局部变量说
47、明与函数体语句的次序,否则C51编译器将视作出错。编译器将视作出错。一对花括号是必须的。一对花括号是必须的。4.5.2 函数的参数和返回值函数的参数和返回值 函数的参数函数的参数函数的参数有形式参数和实际参数函数的参数有形式参数和实际参数 形式参数是定义函数名后面括号中的变量形式参数是定义函数名后面括号中的变量 实际参数是主调用函数调用被调用函数时实际参数是主调用函数调用被调用函数时 赋给形式参数的实际数值赋给形式参数的实际数值 形参与实参之间的传递是单方向的形参与实参之间的传递是单方向的 只能是主调用函数向被调用函数传递只能是主调用函数向被调用函数传递 其好处是:其好处是:提高了函数的通用性
48、与灵活性提高了函数的通用性与灵活性 提高提高80C51内存空间的使用率内存空间的使用率 函数的返回值函数的返回值 功能是把程序运行的结果返回给主调用函数功能是把程序运行的结果返回给主调用函数return 表达式;表达式;【例例4-22】根据根据n值计算值计算 n例例4-9已给出计算已给出计算n程序,本例程序,本例n不定,由外部输入不定,由外部输入 演示本例演示本例Keil C51调试调试 若输入若输入n=100,程序运行结果:,程序运行结果:sum=5050。数组作为函数的形式参数数组作为函数的形式参数 用数组作函数的参数时用数组作函数的参数时 并不是把数组值传递给形参并不是把数组值传递给形参
49、 而是将实参数组起始地址传递给形参数组而是将实参数组起始地址传递给形参数组 使两个数组占用同一段存储单元使两个数组占用同一段存储单元一旦形参数组某元素值发生变化一旦形参数组某元素值发生变化 将会导致实参数组相应元素值随之变化将会导致实参数组相应元素值随之变化数组参数传递属于地址传递数组参数传递属于地址传递 能得到多于一个的函数返回值能得到多于一个的函数返回值指针变量作为函数的形式参数时指针变量作为函数的形式参数时 也可起到地址传递的作用也可起到地址传递的作用【例例4-24】对对n个数组元素(随机输入)从大到小排序个数组元素(随机输入)从大到小排序设数组:设数组:a16=11,99,66,22,
50、111,55,0,222,44,155,77,255,133,100,88,33演示本例演示本例Keil C51调试调试 Serial#1窗口窗口立刻显示数组立刻显示数组原始数据和原始数据和排序后的数据排序后的数据 4.5.4 常用库函数常用库函数 库函数是库函数是C51在库文件中已经定义好的函数在库文件中已经定义好的函数 若需调用,应在源程序的开头采用预处理指令若需调用,应在源程序的开头采用预处理指令 将有关的库函数包含进来将有关的库函数包含进来格式如下:格式如下:#include 常用库函数主要有:常用库函数主要有:访问访问80C51特殊功能寄存器库函数特殊功能寄存器库函数reg51.h