第4章MCS-51系列单片机 C语言程序设计.ppt

上传人:创****公 文档编号:3903133 上传时间:2020-11-20 格式:PPT 页数:243 大小:2.21MB
返回 下载 相关 举报
第4章MCS-51系列单片机 C语言程序设计.ppt_第1页
第1页 / 共243页
第4章MCS-51系列单片机 C语言程序设计.ppt_第2页
第2页 / 共243页
点击查看更多>>
资源描述

《第4章MCS-51系列单片机 C语言程序设计.ppt》由会员分享,可在线阅读,更多相关《第4章MCS-51系列单片机 C语言程序设计.ppt(243页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、第4章MCS-51系列单片机 C语言程序设计,4.1 MCS-51系列单片机的C编译器 4.2 IAR EW8051的集成开发环境 4.3 IAR EW8051的C语言流程控制语句 4.4 IAR EW8051的C语言数据类型 4.5函数和模块化程序设计 习题四,1Tasking Crossview51 Tasking公司原名为BSO/Tasking,是一家专业开发和销售嵌入式系统软件工具的公司,于1974年创建于荷兰。Tasking公司一直为Intel、LSI、Motorola、Philips、Siemens、Texas Instruments等著名半导体厂商的微处理器、数字信号处理器(DS

2、P)以及单片机编写高级语言编译器等配套软件开发工具,先后开发过8 bit、16 bit、32 bit、64 bit的MCU/DSP/RISC交叉编译程序。该公司生产多种单片机的交叉模拟程序(Simulators),可在无目标机的情况下模拟单片机的运行以及I/O口的行为。,4.1 MCS-51系列单片机的C编译器,Tasking公司还生产基于Windows下的嵌入式系统集成开发环境软件(EDE),使用高级连接定位器。EDE是面向工程(Project)的集成开发环境,能够完成从Edit、Make到Debug的“一条龙”服务。环境可以扩展和配置,支持鼠标,界面友好。EDE除开发工具一条龙服务外,还配

3、套有辅助性服务,如Setup集成化、在线屏幕手册(Manual)集成化、出错管理(Error Handling)集成化、操作记录(Log)集成化。,EDE支持第三方软件的运行,如Intel的Apbuilding,Aisys的DriveWay,INFOM的fuzzyTE、CK和MCU-51逻辑编译器等。Tasking公司具有10年生产Intel 80C51软件开发工具的经验,其主要产品有:ASM51(包括Intel兼容宏汇编,Intel兼容Linker、Make、Converter及PL/M51)和C51 Crossview51调试器(早期名XRAY51,包括ROM Debugger、Ice D

4、ebuggs及Simulator)。其软件工具生成的代码可以在大多数著名的仿真器(如Nohau、Metalink、Ashling等公司的相关产品)上使用,软件格式符合IEEE-695、Intel DMF-51、Intel HEX、Motorola S-records等国际标准。Tasking公司的最新产品为Philips 16位80C51XA应用软件工具套件,包括C编译器、宏汇编、连接器、定位器、Crossview模拟调试器等。,2Keil/ Franklin C51 Franklin的鼻祖是Keil,该编译器在代码生成方面比较有优势,可产生最少的代码。它支持浮点和长整数、重入和递归,不提供库

5、源代码,不能生成能编译的汇编代码,仅产生混合代码,只有修改后才能作为汇编程序编译。若使用汇编语言,必须分开编译程序,然后用手工方式连接。,Keil C51标准C编译器为MCS-51系列单片机的软件开发提供了C语言环境,同时保留了汇编代码高效、快速的特点。Keil C51编译器的功能不断增强,使程序设计者可以更加贴近MCS-51系列单片机本身以及其他的MCS-51单片机衍生产品。Keil C51已被完全集成到uVision2的集成开发环境(IDE)中,这个集成开发环境包含C51编译器、汇编和连接,以及Tiny51实时操作系统(Real-time OS)、项目管理器和调试器。Keil C51是一种

6、高效、灵活的MCS-51系列单片机的C语言开发平台。它可以支持的8051及其衍生产品有上百种之多,也可以支持所有兼容的仿真器,同时支持其他第三方开发工具。Keil C51及相关工具的优点是优化后生成的代码效率可接近汇编,提供对所有硬件功能单元的操作。Keil C51支持Atmel, Dallas,Infineon,Philips,Winbond和Temic等公司生产的8051及其衍生产品。Keil C51指派寄存器变量,在整个应用程序中执行全局寄存器优化,所有工具均可产生详细的警告信息和错误信息,以帮助程序开发者快速查找、排除错误。它支持可重入函数和寄存器区的独立代码,以便于中断服务程序和多任

7、务应用程序的执行。,3IAR EW8051 IAR System 公司是世界著名的软件生产厂家之一,其总部设在瑞典。IAR System公司生产的IAR Embedded Workbench(简称IAR EW)是一整套集成开发环境(IDE),适用于MCS-51系列单片机的IAR Embedded Workbench简称EW8051,EW8051集成开发环境包括嵌入式C/C+编译器、汇编器、连接定位器、库管理、项目管理及调试器等。IAR EW早期主要是为8051、80196系列单片机提供的重要开发、调试工具,今天IAR EW已经可以支持35种以上的832位处理器,它以卓越的性能价格比受到用户的普

8、遍欢迎。IAR公司针对不同的体系结构,只需一个解决方案,旨在为用户提供一套通用的支持多种处理器的IDE。IAR EW当前除了支持8051及其衍生的微处理器外, 还支持Atmel、ARM、Hitachi、Infineon、Intel、Microchip、Mitsubishi、Motorola、National Semiconductor、NEC、OKI、Philips、Samsung、Sharp、TI、Toshiba、Triscend、Western Design Center、Zilog等半导体厂商生产的多种微处理器。可支持的工作平台包括Windows 95/98/2000、NT、UNIX等。

9、,上面提到的这些C51编译器都非常相似,特别是Keil C51和IAR EW8051编译器的集成开发环境的外观和使用方法甚至与可视化C/C+的开发环境相似。它们都支持用户采用模块化结构开发和设计大的、复杂的应用程序,在视窗操作系统中使用集成开发环境编译、汇编、连接多模块结构程序都可以由IDE代理一次性完成。 在开发嵌入式系统应用软件时提倡模块化结构的好处是: 方便分工协作方式完成复杂项目的开发; 开发阶段对部分代码进行单独仿真和跟踪调试; 可更好地发挥C语言的可移植性(Portable),减少不同项目中重复代码的开发; 系统软件功能具有可裁减性(Scalable)。,这些C51的集成开发环境都

10、提供无需硬件仿真器(Hardware Debugger)的模拟仿真器(Simulator),在单片机应用系统的软件中,有些代码与单片机的硬件无关,开发这部分代码时可以利用模拟仿真器实现快速仿真。 本书中的C语言程序源码都是在IAR EW8051集成开发环境下编写的,有关IAR EW8051集成开发环境(IDE)的使用说明请参考下一节的内容,或者直接到IAR System公司的主页()下载IAR EW8051集成开发环境学习版及其用户手册或IAR EW8051 C编译器用户手册。,4.2 IAR EW8051的集成开发环境 4.2.1 IAR Embedded Workbench开发平台的使用方

11、法 IAR Embedded Workbench开发平台能够支持数百种832位微控制器,针对各种不同的微控制器需要不同的编译器,这个平台是一种通用的平台。 IAR Embedded Workbench开发平台的工作窗口如图4-1所示。它在外观上看起来与可视化编程的Visual C/C+非常相似。它包括项目管理器窗口(Project window)、源文件编辑器窗口(Editor window)、信息窗口(Messages window)、二进制编辑器窗口(Binary Editor window)等4个窗口,以及菜单栏(Menu bar)、编辑栏(Edit bar)、项目栏(Project b

12、ar)和状态栏(Status bar),其中编辑栏和项目栏组成了快捷工具栏。,图4-1 IAR Embedded Workbench开发平台的工作窗口,1菜单栏 菜单栏包括IAR Embedded Workbench开发平台的所有操作按钮。所有操作被分为8类: (1) File(文件操作类):包括新创建、打开、保存、另存、打印文件以及打印设置和关闭开发平台等操作。 (2) Edit(编辑操作类):包括剪贴、拷贝、查找、替换等操作。 (3) View(视图控制操作类):包括打开或关闭编辑栏、项目栏和状态栏的控制操作。 (4) Project(项目管理类):提供给项目添加文件、创建工作组、编译和连

13、接当前项目以及在当前项目下运行IAR工具等操作。 (5) Tools(工具类):提供在IAR Embedded Workbench开发平台上增加或删除用户自定义的辅助开发工具的操作,IAR允许用户在IAR EW平台上使用自己更习惯的编辑器等辅助开发工具。,(6) Options(选项类):提供IAR Embedded Workbench开发平台的个性化风格界面的设置操作,允许用户设置自己更习惯的字体、关键字颜色等。 (7) Window(窗口控制类):提供子界面的位置、排列、分割等操作,以及正在被放置在后台的已经打开的文件列表。 (8) Help(帮助类):提供IAR Embedded Wor

14、kbench开发平台的所有帮助操作。,2快捷工具栏 快捷工具栏包括文件编辑器常用操作的快捷按钮和项目管理器常用的操作按钮。文件编辑器常用的快捷工具按钮如图4-2所示。 项目管理器常用的快捷按钮和窗口位置、排列控制的快捷按钮如图4-3所示。,图4-2 文件编辑器常用的快捷工具栏,图4-3 项目管理器和窗口排列的快捷按钮,其中编译器常用的快捷按钮包括: (1) “编译”当前被激活的源文件编辑窗口中的程序。注意,如果当前打开的项目由多个源文件(模块)构成,“编译”按钮仅编译当前被激活的源文件编辑窗口中的一个源文件,项目中的其他源文件不会被编译。 (2) “编译和连接”重新将当前项目中所有被修改过的源

15、文件(模块)进行编译,然后连接,产生项目输出目标文件(如列表文件、MCS-51单片机可执行文件)。 (3) “停止编译”停止当前正在执行的单个源文件或项目编译操作。 (4) “打开C-SPY模拟器”首先编译、连接产生项目输出的目标文件和模拟器文件,然后自动打开IAR EW平台的C-SPY软件模拟器,并自动将当前项目的模拟器文件加载到模拟器,这个过程会因为当前的项目编译或连接失败而停止,用户可以通过信息窗口看到出错的信息。,3项目管理器窗口 项目管理器窗口包括当前项目的名称、工作组子目录结构和项目包含的所有源文件(模块)名称列表。所有列表项前面有“+”的项可以被展开,能够看到该项的子目录项,譬如

16、展开源文件项,可以看到该源文件包含的所有头文件(Head Files),如图4-4所示。 IAR EW为用户提供方便使用的项目管理器快捷菜单功能,在项目管理器窗口的任何地方点击鼠标右键便弹出快捷菜单,如图4-5所示。,图4-4 项目管理器窗口,图4-5 项目管理器快捷菜单,4编辑器窗口 在编辑器窗口中,用户可以修改或编辑源文件(包括*.C、*.h等)。IAR EW开发平台默认的语言为C语言,编辑窗口的源文件中所有C语法关键字、注释等特殊内容都使用不同的字体或颜色以高亮显示(见图4-6),这个特点与其他C语言编辑器非常相似,符合C语言程序员的习惯。,图4-6 源文件编辑窗口,当前的项目如果是一个

17、多模块结构的,IAR EW允许用户在源文件编辑器中打开项目所属的所有源文件,每个源文件使用一个编辑器窗口。但是,任何时刻仅有一个窗口被激活,允许用户在该编辑器窗口修改和编辑某一个源文件,其他源文件被放置在后台。 源文件编辑器需要切换到放置在后台的其他源文件,激活另一个编辑器窗口,可以通过菜单栏的“Window”下拉菜单选择另一个放置在后台的源文件,该源文件编辑窗口被激活并推到编辑器窗口的最上层。,5信息窗口 信息窗口显示IAR EW开发平台对用户各项命令的运行结果。信息窗口包括多个页面,如图4-7所示。 “Build”信息窗口给出用户执行单源文件编译或当前项目编译、连接项目的结果,包括出错信息

18、(Error Message)、警告信息(Warning Message)等,每条信息为1行。如果出错或警告的信息是在编译时产生的,用户可以用鼠标双击某一条Error或Warning信息,IAR EW将自动跳到源文件出错或警告的行位置,IAR EW可以通过这种方法帮助用户快速查找、排除错误或警告。“Find in Files”信息窗口给出编辑菜单下执行“Find in Files”命令查找的结果,给出符合查找条件的所有项,每项1行。用户可以用鼠标双击某一项,IAR EW将自动跳到对应的行位置。“Tool Output” 显示用户在工具菜单中定义的工具给出的输出信息。,图4-7 信息窗口,6二进

19、制编辑窗口 在二进制编辑窗口中将所有被打开的文件以二进制方式码方式显示,并允许用户在该窗口修改和编辑二进制码,显示时按照每8个二进制位组成一个十六进制字节数的方式。该窗口分为两个区域,一个区域是十六进制码显示区,另一个区域是对应的ASCII码显示区,如图4-8所示。对二进制方式打开的文件的修改和编辑可以直接在十六进制显示区进行,也可以在ASCII码显示区进行。 可以在“Tools(工具)”菜单下选择“Binary Editor”来打开二进制编辑窗口,见图4-8。 利用二进制编辑窗口可以打开并查看IAR EW编译、连接产生的项目输出文件,MCS-51单片机能够执行的文件为二进制文件,用户只能通过

20、二进制编辑窗口查看它的内容。,图4-8 二进制编辑窗口,7File(文件操作类)菜单 文件菜单提供了打开和保存各种文件以及退出IAR EW开发平台等操作。点击File的下拉菜单可以看到的具体操作命令如图4-9所示。,图4-9 文件操作类命令菜单,8Edit(编辑操作类)菜单 编辑菜单提供编辑器窗口常用的操作,点击Edit的下拉菜单可以看到图4-10所示的命令菜单。,图4-10 编辑操作类命令菜单,9View(视图类)菜单 视图菜单下的命令可以让用户依据需要打开或关闭快捷工具栏操作按钮。点击View的下拉菜单可以看到图4-11所示的命令菜单。,图4-11 视图类命令菜单,10Project(项目

21、操作类)菜单 项目菜单下的命令可以帮助用户给项目添加文件、创建文件组、确立项目选项,以及在当前项目下运行IAR EW系统高级工具。点击Project的下拉菜单可以看到图4-12所示的命令菜单。,图4-12 项目管理器操作类命令菜单,(1) 利用“Project Files”命令可以为当前的项目添加源文件或将源文件从当前项目中删除。打开的Project Files窗口如图 4-13所示。 用户利用项目管理器的文件管理功能将当前的项目包含的所有源文件添加到项目中,或从项目中删除源文件,在执行项目编译(产生目标文件)、汇编(产生列表文件)和连接(产生二进制可执行文件)操作时,用户不需要干预项目编译、

22、汇编和连接过程,IAR EW开发平台会将项目管理器包含的所有源文件按模块结构分别进行编译和汇编,然后将各模块产生的目标文件连接产生项目的输出文件。譬如在图4-13中显示的这个例子项目至少由7个源文件组成。如果一个项目的源程序代码有数万行之多,把数万行源程序代码放在一个源文件中的做法是蹩脚程序员才使用的方法,而且这种方法不方便调试和维护。根据功能把数万行的源程序分割成多个源文件的做法是聪明的选择。,图4-13 项目管理器的文件管理窗口,(2) 利用“ProjectNew Group”命令可以将多模块结构的项目中的源文件按文件组方式来管理。打开“New Group”窗口可以为当前项目创建新的文件组

23、标识,如图4-14所示。 一旦为当前的项目创建了一个新的文件组标识后,在项目管理窗口就可以看到这个新的文件组标识,然后用户可以利用“Project Files”命令为新创建的文件组添加源文件。,图4-14 创建新的文件组对话框,(3) 利用“Project Targets”命令可以为当前项目添加一个新的目标输出。IAR EW开发平台允许一个项目产生多组输出文件,打开维护当前项目的Targets 对话框,如图4-15所示。,图4-15 项目输出目标维护的对话框,(4) 利用“Project Option”命令可以选择确定当前项目的编译、汇编、连接控制选项。IAR EW允许用户对当前项目的不同“T

24、argets”选择使用不同的编译、汇编、连接选项,图4-16是确定“Release”目标的编译、汇编、连接选择的对话框。,图4-16 输出目标编译、汇编、连接控制选项的维护对话框,用户对当前项目目标的编译、汇编、连接控制选项进行维护操作时,IAR EW开发平台编译、汇编、连接当前项目的所有控制选项都在这里设置。选择不同的选项,编译、汇编、连接当前项目时,可以产生所要求的列表文件、目标文件、输出文件等,包括各源文件对应的汇编文件、MCS-51单片机硬件资源使用的列表文件、出错和警告列表文件、目标文件等,以及产生的项目输出文件名称和格式。IAR EW开发平台允许用户把项目输出文件按照用户的习惯(或

25、要求)命名,输出格式可以选择Debug和Intel-Stand、debug-Intel-Stand、Intel-Extended或debug-Intel-extended等数十种不同的格式。选择Debug格式时,要求IAR EW编译、汇编和连接时仅产生调试、模拟器用的输出文件;用Intel-xxxx格式时,不产生调试和模拟器使用的输出文件,而仅产生Intel格式的可执行文件;用debug-Intel-xxxx格式时,编译、汇编、连接后既产生调试和模拟器用的输出文件,同时也产生Intel格式的可执行文件。对MCS-51单片机来讲,可执行文件的格式一般都使用Intel标准。,确定项目编译、汇编、连

26、接控制选项的详细操作说明非常多,限于篇幅,这里不再详细阐述,请参考IAR EW提供的使用向导“8051 IAR Embedded Workbench User Guide”,这个文件可以在网站免费得到,或者直接向IAR System公司索取。,4.2.2 C-SPY模拟器的使用方法 C-SPY是IAR Embedded Workbench开发平台中一个非常有用的仿真工具,利用这个工具,用户可以在PC上仿真正在开发、设计的应用程序,而且可以在没有专用的硬件仿真器的情况下进行仿真。IAR EW也允许用户使用C-SPY结合ROM-Monitor或INTEL RISM硬件仿真器在线仿真、调试应用程序。

27、 在“Project Option”对话框中选择“C-SPY”选项,在Setup页面中可设置C-SPY的控制参数,如图4-17所示。其中“Driver”选项用于选择C-SPY模拟器使用的仿真器,有三种选择:Simulator、ROM-Monitor和INTEL RISM。这里选择Driver使用Simulator选项,即对当前的项目进行软件模拟调试(不需要硬件仿真器)。,图4-17 C-SPY模拟器的控制选项,在项目管理器的快捷工具栏中点击C-SPY按钮,即可进入模拟调试器窗口调试当前项目,如图4-18所示。 C-SPY模拟器界面包括菜单栏、文件和窗口控制操作常用的快捷工具栏、常用调试控制快捷

28、工具栏和状态栏,以及源文件窗口(Source window)、报告窗口(Report window)、寄存器窗口(Register window)、查看变量窗口(Watch window)和代码及存储器窗口(Memory window)。 当用户打开C-SPY并进入模拟调试器后,光标首先停留在程序中惟一的main()函数的第一句程序,模拟MCS-51单片机被复位后的状态。然后用户可以选择调试模式:手工单步跟踪调试、自动单步跟踪调试、连续运行到指定的行位置、连续运行。,图4-18 C-SPY模拟器窗口,C-SPY模拟器快捷工具栏的按钮及其功能如图4-19所示。 当用户进入模拟器之后,光标所在的行

29、被C-SPY使用特殊颜色“高亮”显示,点击手工单步跟踪调试按钮,光标自动移到下一行,并且这一行也被“高亮”。手工单步跟踪调试每次仅运行一句C语句,而且C-SPY的跟踪调试与可视化Visual C/C+的Debug相似,可以选择进入子程序单步跟踪执行或者不进入子程序的单步跟踪调试,以及由单步转为连续运行到当前的子程序出口,连续运行到最近的断点,自动单步跟踪调试等。C-SPY允许用户采用连续跟踪调试方式模拟程序的执行。 点击“复位”快捷按钮,无论模拟调试器处于任何状态, C-SPY立即终止运行,并将光标移到main()函数的第一句。无论模拟调试器处于任何状态,点击“停止”快捷按钮即可停止模拟调试器

30、跟踪调试,并且光标停止在当前执行的行位置。,图4-19 C-SPY模拟器快捷工具栏,4.3 IAR EW8051的C语言流程控制语句 4.3.1 判断语句 判断选择语句是控制一句或若干句C语句是否被执行的控制语句。C语言支持两种类型的选择语句:if和switch。另外,在某些特殊情况下,操作符“?”可作为if的另一种表示形式。,1if语句 if语句的格式为: if ( 条件表达式 ) C语句;/ 注释 if语句的功能是,当“条件表达式”的值为真(除0外的任何值)时则执行“”里面的语句,否则执行if语句的下一条可执行语句。如果if语句中“”里的可执行语句只有一条,则包围该语句的“”可以略去。if

31、语句的程序结构如图4-20所示。,例4.1 下面的程序对I/O端口P1的第1位(P1.1)进行判断,如果读入值为0(低电平),则将端口1的第0位置为1(高电平)。 if ( P1.1 = 0) P1.0 = 1; 下面的程序与上面的程序完全相同,但是少了“”: if ( P1.1 = 0) P1.0 = 1; 需要注意的是,如果if条件表达式后面没有语句体(多个连续C语句构成C语句体),而只有一个分号“;”,如下面的代码: if ( 条件表达式 ); 语句; 则在执行if语句时首先判断“条件表达式”的结果,无论“条件表达式”的结果是真或假,总是顺序执行if语句后面的可执行C语句。,2ifels

32、e复合语句 ifelse复合语句的格式为: if ( 条件表达式 ) 语句1; else 语句2; ifelse语句的执行过程为:如果if语句的“条件表达式”的值为真,则执行语句1,否则就执行语句2。执行时,每次要么执行与if相关的语句,要么执行与else相关的语句,只能是两者取其一。ifelse语句的程序结构如图4-21所示。,if和else同属于一个if语句,else不能作为语句单独使用,它只是if语句的一部分,与if配对使用。如果两个分支中需要执行的语句不止一条,必须用“”括起来,作为一个复合语句使用。若只有一条C语句,“”可以省略。例如: if ( P3.2 = 0 ) P1= 0 x

33、0; else P1= 0 xFF; 该例程用扫描方式读取MCS-51单片机的P3.2引脚电平,如果P3.2引脚的电平为低电平,那么if语句的“条件表达式”结果为真,执行P1=0 x0,即将P1口的所有位清0;如果P3.2引脚的电平为高电平,那么if语句的“条件表达式”结果为假,执行P1=0 xFF,即P1口的所有位被置位。,3if语句的嵌套 一条if语句只能判断给定条件的两个方面(真或假),当供选择的情况较多时,可以用if语句的嵌套来实现。if语句嵌套的格式为: if (条件表达式1 ) 语句1; else if (条件表达式2 ) 语句2; ,else if (条件表达式3 ) 语句3;

34、else 语句4; 语句5;,上面是一个3级“ifelse”嵌套语句,该嵌套语句从上往下对条件进行判断,如果一个条件为真,就执行与此条件有关的语句,并将越过其余部分而直接转到语句5;如果无一条件为真,那么就执行最后一个else所属的C语句;如果最后一个else不存在,并且所有条件都为假,则什么都不执行。,下例程序以根据键码的值进行不同的处理来说明if语句的嵌套用法: void main(void) unsigned char keypad; unsigned char ascii; / 调键盘扫描程序,得到键码,存放在keypad变量中 keypad = getchar(); if ( key

35、pad = 0 x0 ) ascii = 0; else if ( keypad = 0 x01 ) ascii = 1;,else if ( keypad = 0 x02 ) ascii = 2; else if ( keypad = 0 x03 ) ascii = 3; else if ( keypad = 0 x04 ) ascii = 4; printf(Current Keypad is %c , ascii); ,上例中,由于不同keypad值对应着不同的ascii值,且keypad的值有多种情况,因而使用了两个以上ifelse语句嵌套进行判断。 需要注意的是,在if语句出现嵌套形

36、式时,必须搞清楚if和else的配对关系。C语言规定:else与前面最接近它而又没有和其他else语句配对的if语句配对。,4条件运算符“?” 条件运算符的语法格式为: 变量或表达式 = (条件表达式)?(条件为真时的表达式):(条件为假时的表达式) 其中“?”被称为三目操作符,因为它要求三个操作数。 执行条件运算符“?”语句的过程为,执行时首先判断“条件表达式”的值,当“条件表达式”的值为真时,将“条件为真时的表达式”的值赋给“=”前面的变量或表达式;当“条件表达式”的值为假时,将“条件为假时的表达式”的值赋给“=”前面的变量或表达式。例如: Larger_Value = (a b) ? a

37、 : b;,首先判断“?”前面的条件表达式“a b”的值。如果a 大于 b,则将a的值赋给变量Larger_Value,否则将b的值赋给变量Larger_ Value。若使用if else语句,则与其执行结果完全相同的程序为: if ( a b ) Larger_Value = a; else Larger_Value = b;,5switch语句 if语句是两分支选择控制语句,而switch语句是多分支选择控制语句,使用switch可以使判断更加直观。 switch语句的格式为: switch(表达式) case 常量表达式1:语句组1; break; case 常量表达式2:语句组2; b

38、reak; case 常量表达式n:语句组n; break; default:语句组n+1; ,例4.2 用switch语句编写程序,根据keypad=0 x00 0 x0F的值,对应转换为ASCII码的值ascii,然后利用“printf()”函数将其显示在屏幕上。实现的程序如下: #include #include void main(void) unsigned char keypad; unsigned char ascii; while(1) keypad = getch();/ 读取键码,switch (keypad) case 0 x00:ascii = 0; break; ca

39、se 0 x01:ascii = 1; break; case 0 x02:ascii = 2; break; case 0 x03:ascii = 3; break; case 0 x04:ascii = 4; break; case 0 x05:ascii = 5; break; case 0 x06:ascii = 6; break; case 0 x07:ascii = 7; break; case 0 x08:ascii = 8; break; case 0 x09:ascii = 9; break;,case 0 x0A:ascii = A; break; case 0 x0B:a

40、scii = B; break; case 0 x0C:ascii = C; break; case 0 x0D:ascii = D; break; case 0 x0E:ascii = E; break; case 0 x0F:ascii = F; break; default:ascii = ; printf(Current KeyPad code : %c, ascii); ,switch语句的执行过程为,根据case语句中给出的常量值,按顺序对switch语句的“表达式”的值进行匹配。当常量与表达式相符时,就执行与这个常量所在case语句相关的语句块,直到碰到break或者switch

41、语句执行完为止。若没有一常量与表达式值相符,则执行default语句。default是可选择的,如果default不存在,并且所有的常量表达式都不相符,则不进行任何处理。 break语句是C语言的转移语句之一。它既可用在循环语句中,也可用在switch语句中。如果在switch语句中遇到break,程序就转移执行switch语句后面的可执行C语句。从技术上讲,switch语句中的break语句是可以选择的,它们通常被用来终止与每个常量有关的语句序列。如果break语句被省略了,就继续在下一个case语句中执行,一直到break或者switch的尾部为止。,在同一个switch语句中,任意两个c

42、ase的常量均不允许有相同值。 switch后面括号中的“表达式”结果的数据类型只能是整型、字符型或枚举表达式,case后面的常量表达式的数据类型必须与之匹配。case语句中的常量表达式起标号作用,各常量表达式必须互不相同。 此外,switch语句还可实现嵌套。C编程语言的switch语句与汇编语言中的散转指令应用比较相似。,4.3.2 循环控制语句 在许多实际问题中,需要进行有规律性的重复操作,如求累加和、数据块的移动等。所谓循环,是指任何一种类型的重复性控制结构。这种结构让代码的某一块被重复执行。使用循环是编程时最复杂的情形之一,知道如何及何时使用哪种循环是编写高质量软件的决定性因素。 在

43、C语言中用来实现循环的语句有三种:while语句、do-while语句和for语句。 1while语句 while语句的格式为: while(条件表达式) 语句; ,while语句的执行过程为,首先判断“条件表达式”的值,以便决定是否应当进入、执行循环体语句。在这里,“条件表达式”是while循环能否继续的条件,而语句部分则是循环体,是执行重复操作的部分。只要表达式为真,就执行循环体内的语句,语句执行完毕后,再次判断条件表达式的真假,如果为真就重复上述步骤;反之,则终止while循环,执行循环之外的下一条语句。 while循环语句的执行流程如图4-22所示。,图4-22 while语句的执行流

44、程,例4.3 使用while语句计算12399100的值。程序如下: void main (void ) unsigned int count = 1, sum = 0; while ( count = 100 ) sum += count; count +; printf (Result of sum = %d , sum ); ,该程序的执行结果为sum=5050。 该程序首先初始化循环变量count和累加和sum,然后进入while循环,不断进行累加计算。当count的值为101时,则条件表达式“count = 100”的值为假,退出循环。 while循环结构的最大特点在于,其循环条件测

45、试处于循环体的开头,要想执行重复操作首先必须进行循环条件测试,若条件不成立则循环体内的重复操作一次也不能执行。,在单片机程序中,主程序首先连续执行各个初始化程序,然后必须进入一个无限循环的循环体中执行程序。经常要用到如下形式的while语句格式: void main (void) Init_8051(); / 初始化8051的特殊功能寄存器以及中断 Init_Parament();/ 初始化变量 while(1) / 循环条件永远为真,循环体是一个无限循环 /循环语句 ,在这里,while语句中的条件表达式永远为真,这实际上是设置了一个“死循环”或称之为“无限次循环”,以使程序的主模块在循环里

46、面不断运行。 但有时需要程序在符合某些条件时退出无限循环体,实现的方法是使用break语句。下面的程序是使用break语句计算12399100的值。,void main (void ) unsigned int count = 1, sum = 0; while ( 1 ) if ( count 100) break; sum += count; count +; printf (Result of sum = %d , sum ); ,该程序的执行结果为sum=5050。 在MCS-51单片机系统中,需要等待某事件的发生,需要编写一个循环体实现等待,但是如果发生事件的通道出现了故障,将使得程

47、序无法满足条件而退出循环,使程序陷入“死循环”。为了保证软件具有一定的容错性,需要等待一定时间,在此期间如果仍没有事件发生,那么就退出等待循环。,例4.4 下面是等待P1.0端口电平变化的程序。如果P1.0为低电平,就循环等待P1.0变为高电平,当P1.0为高电平时便退出等待循环。如果等待循环计数器大于10000,则认为等待超时,也退出等待循环。程序如下: #include #include void main(void) unsigned int watCnt = 0; while(P1.0 = 0) watCnt+;/ 循环计数器加1,if ( watCnt 10000) / 判断循环计数

48、器是否大于10000 break; / 如果循环计数器大于10000,则认为等待超时,退出循环 if (watCnt 10000) printf(Wating Overtime! ); else printf(P1.0 to high); ,比较下面的程序: #include #include void main(void) while(P1.0 = 0) ;/ 循环等待P1.0转为高电平 printf(P1.0 to high); ,如果由于MCS-51单片机系统的硬件出现故障,造成P1.0引脚的电平被外部电路钳位在低电平,使P1.0引脚电平无法变为高电平,那么造成“P1.0=0”的条件永远

49、为真,程序的循环中没有容错处理而成为“无限循环”,无法继续运行其他程序。,2do-while语句 do-while语句的格式为: do 语句; while (条件表达式); do-while循环语句的执行过程为:首先执行“”中的循环体语句,然后判断while语句中的“条件表达式”的结果。如果“条件表达式”的结果为真,则继续执行“”中的循环语句,然后再判断while语句中的“条件表达式”的结果,结果为真仍继续循环。只有当“条件表达式”的结果为假时,循环才会终止,并以正常方式执行while语句后面的程序语句。 do-while程序的流程控制如图4-23所示。,图4-23 do-while语句流程,例4.5 使用do-while语句计算12399100的值。程序如下: void main ( void ) unsigned int count = 1, sum = 0; do sum += count; count +; while ( count = 100 ); printf (Result of sum = %d , sum ); ,该程序的执行结果为sum=5050。 使用do-while语句的程序循

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com