




已阅读5页,还剩118页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
单 片 机 实 验 指 导 书 张玉杰编写电信学院电信实验室实验1 Keil软件的使用1.1 创建一个Keil C51应用程序开发单片机的第一步就是用Keil C51软件编写程序,并形成最终的“*.hex”目标文件,然后用编程器将该文件烧写到单片机中,最后将烧写好的单片机插到电路板上,接通电源就可以工作了。 在 Keil C51集成开发环境下使用工程的方法来管理文件的,而不是单一文件的模式。所有的文件包括源程序(包括 C 程序,汇编程序)、头文件、甚至说明性的技术文档都可以放在工程项目文件里统一管理。在使用 Keil C51 前,用户应该习惯这种工程的管理方式。对于使用 Keil C51 的用户来讲,一般可以按照下面的步骤来创建一个自己的 Keil C51 应用程序。1新建一个工程项目文件;2为工程选择目标器件(例如选择SST的SST89C58);3为工程项目设置软硬件调试环境;4创建源程序文件并输入程序代码; 5保存创建的源程序项目文件;6把源程序文件添加到项目中。下面以创建一个新的工程文件 Led_Light.V2 为例,详细介绍如何建立一个Keil C51的应用程序。(1) 双击桌面的 Keil C51 快捷图标,进入如图1.1所示的 Keil C51 集成开发环境。或许打开 Keil C51 界面有所不同,这是因为启动Vision2 后,Vision2 总是打开用户前一次正确处理的工程,可以点击工具栏的 Project 选项中的 Close Project 命令关闭该工程。图 1.1 Keil C51 集成开发界面(2)点击工具栏的 Project 选项,在弹出如图1.2 所示的下拉菜单中选择New Project命令,建立一个新的Vision2 工程,这时可以看到如图 2.10 所示的项目文件保存对话框。图 1.2新建工程项目下拉菜单在这里需要完成下列事情:为工程取一个名称,工程名应便于记忆且文件名不宜太长;选择工程存放的路径,建议为每个工程单独建立一个目录,并且工程中需要的所有 文件都放在这个目录下;选择工程目录 F:示范程序Led_Light 和输入项目名 Led_Light 后,点击保存返回。点击选择工程存放路径 填写新建工程的名称 图1.3 新建工程项目对话窗口在工程建立完毕以后,Vision2 会立即弹出如图1.4 所示的器件选择窗口。器件选择的目的是告诉Vision2 最终使用的 80C51 芯片的型号是哪一个公司的哪一个型号, 因为不同型号的 51 芯片内部的资源是不同的。,Vision2 可以根据选择进行 SFR 的预定义, 在软硬件仿真中提供易于操作的外设浮动窗口等。图1.4 器件选择窗口由图1.4可以看出,Vision2 支持的所有 CPU 器件的型号根据生产厂家形成器件组,用户可以根据需要选择相应的器件组并选择相应的器件型号,如 Philips 器件组内的 P80/P87C52X2 CPU。另外,如果用户在选择完目标器件后想重新改变目标器件,可点击工具栏project选项,在弹出的如图 1.5 所示的下拉菜单中选择是select device for target target 1命令。也将出现如图 1.4所示的对话窗口后重新加以选择。由于不同厂家的许多型号性能相同或相近,因此如果用户的目标器件型号在Vision2 中找不到, 用户可以选择其它公司的相近型号。图1.5器件选择命令下拉菜单(4)到现在用户已经建立了一个空白的工程项目文件,并为工程选择好了目标器件,但是这个工程里没有任何程序文件。程序文件的添加必须人工进行,但如果程序文件在添加前还没有建立,用户还必须建立它。点击工具栏的File选项,在弹出的如图 1.6所示的下拉菜单中选择New命令。这时在文件窗口会出现如图1.7所示的新文件窗口Text1,如果多次执行New命令则会出现 Text2,Text3等多个新文件窗口。图 1.6新建源程序下拉菜单图 1.7源程序编辑窗口(5)现在 Led_Light.V2 项目中有了一个名为 Text1 新文件框架,在这个源程序编辑 框内输入自己的源程序 Led_Light.asm。下面是完整的 Led_Light.asm 源程序代码,用户可以输入。ORG0000HJMPMAINORG0100HMAIN:MOVA,#0FEH;流水灯向左移动 LEFT_MOV:MOVP1,ACALLDELAYRLACJNEA,#0FEH,LEFT_MOVMOVA,#7FH;流水灯向右移动RIGHT_MOV:MOVP1,ACALLDELAYRRACJNEA,#7FH,RIGHT_MOVJMPMAIN;-延时子程序-DELAY:MOVR2,#250DEL:MOVR3,#250NOPDJNZR3,$DJNZR2,DELRETEND(6) 输入完毕后点击工具栏的File选项,在弹出的下拉菜单中选择是save命令存盘源程序文件。这时会弹出如图1.8所示的存盘源程序文件画面,在文件名栏内输入源程序的文件名,在此示范中把Text1 保存成 Led_Light.asm。注意文件的扩展名不能省略,而且必须是.asm(如果是C则保存为*.c)。保存完毕后请注意观察,保存前后源程序有哪些不同,关键字变成蓝颜色了吗?这也是用户检查程序命令行的好方法。图1.8 源程序存盘对话框(7) 需要特别提出的是,这个程序文件仅仅是建立了而已,Led_Light.asm 文件到现在为止跟 Led_Light.V2 工程还没有建立起任何关系。此时用户应该把 Led_Light.asm源程序填加到Led_Ligh. V2工程中,构成一个完整的工程项目。在project window窗口内,选中source group1后点击鼠标右键,弹出如图1.9所示的快捷菜单中选择Add Files to GroupSource Group1(向工程中加入源程序)命令。图1.9添加源程序快捷菜单此时会出现如图1.10所示的添加源程序文件窗口,选择刚才创建编辑的源程序文件Led_Light.asm。单击Add命令即可把源程序文件添加到项目中。由于添加源程序文件窗口中的默认文件类型是C Source File(*.c),这样在搜索显示区中则不会显示刚才创建的源程序文件( 由于它的文件类型是 *.asm) 。改变搜索文件类型为 All File(*.*),选择 Led_Light.asm 源程序文件后点击Add命令将弹出如图1.11所示的文件类型确认窗口,在type下拉菜单中选择assembly language file后确认返回图1.10添加源程序文件窗口,此时点Add命令即可将源程序添加进项目工程中。图1.10 添加源程序文件窗口图1.11 文件类型确认窗口1.2 程序文件的编译、连接(1) 编译环境的设置工程建立好后,还要对工程进行进一步的设置,以满足要求。首先单击左边窗口的Target,然后选择options for TargetTarget1 参考图1.12。这时即出现如图1.13所示的调试环境设置窗口。图1.12 调试环境设置窗口下拉菜单点击 Output 选项卡在出现的窗口中选中 Create Hex File 选项,在编译时系统将自动生成目标代码文件*.HEX。选择 Debug 选项会出现如图1.14所示的工作模式选择窗口,在此窗口中我们可以设置不同的仿真模式。图1.13 Keil C51 调试环境设置窗口图1.14 Debug 设置窗口从图1.14可以看出,Vision2 的 2 种工作模式分别是:Use Simulator(软件模拟) 和 Use(硬件仿真)。其中 Use Simlator 选项是将Vision2 调试器设置成软件模拟仿真模式,在此模式下不需要实际的目标硬件就可以模拟 80C51 微控制器的很多功能,在准备 硬件之前就可以测试您的应用程序,这是很有用的。(2)程序的编译、连接、运行完成以上的工作就可以编译程序了。点击如图1.15所示的Rebuild All Target Files 命令,对所有的工程文件进行重新编译,此时会在“Output windows”信息输出窗口输出一些相关信息,如图1.16所示。图1.15 编译命令菜单图1.16 输出提示信息其中第二行 assembling Led_Light.asm 表示此时正在编译 Led_Light.asm 源程序,第三行 linking表示此时正在连接工程项目文件,第五行 Creating hex file fromLed_Light说明已生成目标文件 Led_Light.hex,最后一行说明 Led_Light.V2 项目 在编译过程中不存在错误和警告,编译链接成功。若在编译过程中出现错误,系统会给出错 误所在的行和该错误提示信息,用户应根据这些提示信息,更正程序中出现的错误,重新编译直至完全正确为止。对源程序进行编译之后,还需要实际的运行来验证程序的正确性。点击如图1.17所示的start/stop debug session命令,将程序与硬件进行连接,如果与硬件连接正确,会在Output windows窗口出现如图1.18所示的提示信息,如果连接不正确,会出现如图1.19所示的信息,此时请复位硬件,然后重新编译、连接。图1.17 start/stop debug session命令窗口图1.18 与硬件连接正确提示信息图1.19 与硬件连接不正确提示信息完成以上步骤,与硬件连接正确之后,用户就可以按图1.20所示的运行命令进行在线仿真了。图 1.20 运行命令窗口以下与实验内容无关,作为了解,可以跳过。 在调试环境设置窗口的target页面下,(参考图1.13),xtal后面的数值是晶振频率值,默认值是所选目标CPU的最高频率值。一般将其设置成为实际所使用的晶振频率值。Memory Model用于设置RAM使用情况,有3个选择项。I small :是所有变量都在单片机的内部RAM中,如果内部RAM空间不够,才会存到外部RAM中。这种数据存储方式的好处在于运算速度最快,也是我们一般常选择的方式。II Compact :变量存储在外部RAM里,使用8位间接寻址。即将变量放在外部RAM的前256个字节里。IIILarge: 变量放在外部RAM里,使用16位间接寻址。Code Rom size用于设置ROM空间的使用,也有3个选项。I Small:只用低于2K的程序空间,适用于AT89C2051这些芯片。IICompact:单个函数的代码量不能超过2KB,整个程序可以使用64KB的程序空间。IIILarge:可用全部64KB的空间,表示程序和子函数代码都可以大到64KB。Operating项是操作系统选择项,Keil C51提供了两种操作系统:Rtx tiny和Rtx full。通常不使用任何操作系统,用该项的默认值:None(不使用任何操作系统)。Use on-chip ROM(0x0-0xfff)选择项,表示使用片上的ROM。该选项取决于单片机应用系统,如果单片机的EA接高电平,则选中,表示使用内部的ROM,如果单片机的EA接低电平,则不选中该选项,表示使用外部的ROM。Off-chip Code memory:表示片外ROM的开始地址和大小。如果没有外接程序存储器,那么不需要填任何数据。Off-chip Xdata memory:用于确定系统扩展RAM的地址范围,可以填上外接Xdata外部数据存储器的起始地址和大小。这些选择项必须根据所用硬件来决定。 在Output页面下,见图1.21。select Folder for objects:用来选择最终的目标文件所在的文件夹,默认则表示与工程文件在同一个文件夹中。Name of Executable:设置生成的目标文件的名字,默认情况下与项目的名字一样。Creat Executable:creat hex用于生成可执行代码文件,默认情况下该项未选中,如果要烧录芯片做硬件实验,就必须选中该项。图1.21 output设置窗口(3) 本实验当中编译环境的设置说明1在调试环境设置窗口的Device选项卡中器件选择SST89C58。(参考图1.4)2. 在调试环境设置窗口的Target选项卡中xtal(Mhz)项填写12。选中Use on-chip ROM。其它项不必改动,具体设置参考图1.13。3 在调试环境设置窗口的debug设置窗口中选择keil monitor-51 drive仿真设置。(参考图1.14)用鼠标点击keil monitor-51 drive后的setting,将弹出1.22所示的窗口。在实验当中根据与计算机连接情况选择串口,波特率固定选择38400。图1.22 串口设置窗口实验2 基本算术运算 本章内容采用软件仿真,请在图1.14中选择左边use simulator项,其余设置采用默认项即可。2.1 二进制加法设在内部RAM的40H44H单元开始有一组无符号数据块,值分别为从15,编程求无符号数据块的和,将结果放入45h(低位)、46H(高位)中。实现程序为: datastart DATA 40H ;数据块开始地址 SUML DATA 45H ;累加和低位地址定义 SUMH DATA 46H ;累加和高位地址定义 datanum DATA 48H ;保存数据个数的地址 ORG 0000H ;程序上电或复位入口 JMP start ORG 0100Hstart: MOV SP,#60h ;设置堆栈 MOV datastart, #01H ;求和数据初始化 MOV datastart+1,#02H MOV datastart+2,#03H MOV datastart+3,#04H MOV datastart+4,#05H ; MOV datanum,#05H ;数据个数 CALL SUM ;调用求和子程序 JMP $ ;停机;=;无符号数据块求和子程序;影响资源:R0;=SUM: PUSH ACC ;保护ACC中值 PUSH PSW ;保护PSW MOV SUML,#00H MOV SUMH,#00H ;累加和单元清零 MOV R0,#datastart ;数据块起始地址送R0 SUMLOOP: MOV A,R0 ;将R0指向地址中的数据放入A中。 ADD A,SUML MOV SUML,A JNC NEXT ;如果发生进位,SUMH单元+1 INC SUMH ;NEXT: INC R0 ;R0指向下一个地址 DJNZ datanum,SUMLOOP POP PSW POP ACC ;恢复现场 RETEND对于程序运行结果的观察,可参考如下步骤:I 在图1.14中选择use simulator。II 在程序JMP $ 处设立一个断点。III 在对源程序进行编译、连接、运行之后(参考第一章1.2(2)节),为观察程序运行结果,点击图2.1所示的memory window命令,将出现图2.2所示的数据观察窗口。图 2.1 memory windows 命令图2.2 数据观察窗口III 在数据观察窗口的Address项中输入 d:0x49,即可观察内部RAM中0x49地址开始单元中的数据。以下几个运算程序调试方法与此类似。2.2 双字节除单字节除法设在内部RAM的45H46H(45h中是低位数据、46H中是高位数据)单元存有一组无符号数据。编程求此组数据除以一个单字节数据的结果,将结果放入49H单元中。实现程序为: SUML DATA 45H ;被除数低子节 SUMH DATA 46H ;被除数高字节 datanum DATA 48H ;保存数据个数的地址 average DATA 49H ;除的结果存放单元ORG 0000H JMP startORG 0100Hstart: MOV SP,#60H MOV SUML,#0FH MOV SUMH,#00H MOV datanum,#05H ;初始化 MOV R4,SUMH MOV R5,SUML ;装入被除数 MOV R7,datanum ;装入除数 CALL AVER ;调用求平均值子程序 MOV average,R3 ;结果放入average单元中 JMP $;=;双字节二进制无符号数除以单字节二进制数;输入参数: 被除数在R4、R5中,除数在R7中;输出参数: 结果在R3中; 如果结果溢出,则0v=1.反之为0;影响资源: R3 R4 R5 R7;=AVER: CLR C MOV A,R4 SUBB A,R7 JC DV50 SETB OV ;;商溢出RETDV50: MOVR6,#8 ;;求平均值(R4R5R7R3)DV51:MOVA,R5RLC AMOVR5,AMOVA,R4RLC AMOVR4,AMOVF0,CCLR CSUBBA,R7ANLC,/F0JC DV52MOVR4,ADV52:CPL CMOVA,R3RLC AMOVR3,ADJNZR6,DV51MOVA,R4 ;;四舍五入ADDA,R4JC DV53SUBBA,R7JC DV54DV53:INC R3DV54: CLR OVRETEND 2.3 二进制转BCD码设在内部RAM的49H单元存有一个二进制数据。编程求将该数据转换成BCD 码,将结果放入4AH为起始的连续单元中。实现程序为: average DATA 49H ;欲转换的二进制数存放单元 displaydata DATA 4AH ;转换后的BCD码存放单元 ORG 0000H JMP start ORG 0100Hstart: MOV SP,#60H MOV average,#0x0ff MOV A,average CALL HBCD JMP $;=;单字节十六进制整数转换成单字节码整数;入口 : ACC - 欲转换的十六进制数;出口 : displaydata - 转换后的数据存放地址; displaydata - 百位 ; dispalydata+1 - 十位 ; displaydata+2 - 个位 ;=HBCD:MOVB,#100 ;分离出百位,存放在R3中DIV ABMOVdisplaydata,AMOVA,#10 ;余数继续分离十位和个位XCHA,BDIV AB MOV displaydata+1,A MOV displaydata+2,B RET END实验3 分支和循环程序设计实验1 实验目的(1)熟悉分支程序的编写方法(2)掌握循环程序设计技巧。2实验内容(1)散转程序设计(2)求最小值程序设计3 实验要求(1)画出程序流程图 (2)编写实验程序4 实验步骤(1)散转程序试编一个能根据20h中的数i(i3) 进行循环散转的程序。该程序要能该据i值转移到相应处理程序BRi,BRi处理程序功能是能使Ri加1,然后实现(20H)+103H 20H操作,以便重复根据20H中的内容散转。程序流程如图所示。(2)求最小值程序编一个能在内部RAM 20H为始址的连续10个存储单元中找出最小值并存入1FH单元的程序。编译、连接、进入调试状态。程序流程如图所示。在数据存储器窗口,使用d:0x20显示片内ram20H开始数据,修改从20H开始的连续10个单元,并记住最小的数。执行程序,检查结果是否正确,若不正确,可单步运行、断点运行排除错误。 实验4 汇编基本指令和片内RAM操作实验1 实验目的(1)熟悉单片机片内RAM的结构和操作方法(2)掌握单片机的基本指令系统2实验内容(1)片内RAM数据传送指令操作(2)清零子程序操作子程序设计(3)BCD码减法子程序设计4 实验步骤(1)数据块传送程序设计编写程序将40H开始的16个数据送到90H开始的16个单元中,程序如下:ORG 0000HJMP 100HORG 100HMOV R0,#40HMOVR1,#90HMOVR7,#16MOVA,R0LOOP: MOVR1,AINCR0INCR1DJNZR7,LOOPSJMP$END(2)清零程序编写程序将20H开始的32个单元清零,程序如下ORG 0000HJMP 100HORG 0100HMOV R0,#20HMOVA,#0MOVR7,#32LOOP: MOVR0,AINCR0DJNZR7,LOOPSJMP$END(3)BCD码减法已知在20h中有一个BCD码91H和21H中有一个BCD码36H,如下BCD键发程序可以完成91-36并把差送到21H中。ORG0000HJMPMAINMAIN:CALLBCD_SUBSJMP$BCD_SUB:CLRCMOVA,#9AHSUBBA,21HADDA,20HDAAMOV21H,ACLRCRETEND4 思考题(1)BCD减法中,对减法球部和二进制数的球部有何差别(2)体会设置断点和断点次数对于调试程序的作用实验5 C语言基本指令及程序设计1 实验目的(1)熟悉C语言基础知识(2)掌握单片机的C语言的编程方法2实验原理(1)C语言中的数据 1.数据类型 1)char:字符型数据,占一个字节,分为有符号数和无符号数,有符号数的表示范围为-128 +127,采用二进制补码的表示形式,无符号数的表示范围为0255 2)int:整型数据,占两个字节。分为有符号数和无符号数,有符号数表示范围为-32768+32767,采用补码表示,无符号数表示范围为065535 3)long:长整型,4个字节,分为有符号数和无符号数 4)float:浮点型,f占用4个字节,符合IEEE标准 5)bit:位变量,用于进行位操作 6)sbit:定义位变量 7)sfr:单字节变量,范围为0255 8)sfr16:双字节变量,范围为065535 9)*:对象指针,13字节2.数据的存储类型 1)片内数据存储器 片内RAM最大可达到256字节,可分为3个区域 Data:片内直接寻址去,位于片内RAM低128字节 Bdata:片内位寻址区,位于片内RAM位寻址区 Idata:片内间接寻址区,片内RAM所有字节 2)片外数据存储器 Xdata:外部存储器,为片外RAM的64KB空间 Pdata:外部存储器,片外RAM中的一页,为156字节在程序中定义变量类型是编程中首先遇到的问题。一个程序中肯定会有数据,首先要选择数据类型,一个变量可能有最大的数据,到底有几个字节才可以存下,这就要根据情况分析而定。在够用的情况下,尽量选则8位即一个字节的char类型。数据的存储类型是一个值得深讨的话题,只要条件满足尽量选择内部直接寻址的存储器类型data,然后选择idata即内部间接寻址,对于经常使用的变量要使用内部寻址。在内部寄存器数量有限或不能满足要求的情况下才使用外部存储器,选择外部存储器时可先选择pdata类型,最后选择xdata类型。存储器的选择关系到程序的执行效率问题,在选择时要多加考虑。(2) C语言中的函数 函数是指程序中的一个模块,c语言就是由一个个的模块化函数构成的,main() 函数为程序的主函数,其他若干函数可以理解为一些子程序。Main()函数是程序运行的起点,程序员的任务就是编写一些列函数模块,并且在适当那个时候调用这些函数,实现程序所要实现的功能。1. 函数 在C语言中编写的函数包括函数声明和函数体。 (1)函数声明格式为: 函数返回值类型函数名(形式参数1,形式参数2,); (2)函数体格式为: 函数返回类型函数名(形式参数1,形式参数2,) 对于无返回值的函数,函数返回类型就是void,否则就根据返回值的类型确定函数返回类型,例如int型、char型。如果函数没有参数,在函数声明中参数写为void。下面是两个函数声明示例:bit busychk(char busybuf ) 函数返回值类型是bit型,参数类型为charvoid keyin(void) 函数无返回值,也没有参数 2. 函数调用 (1)简单调用 调用格式:函数名(实际参数1,实际参数2,) (2)嵌套式调用 嵌套式调用就是调用的函数中又调用其它函数的语句。 (3)递归调用 函数的递归调用就是一个函数在其函数体内又调用自身,递归调用是一种特殊的循环结构。 注:在调用一个函数时要保持与该函数声明和函数体格式的一致:包括函数返回值类型、参数类型和个数。 (3) C语言中的运算操作 1赋值、指针、取指运算符运算符的类型可以分为:单目,双目,多目。单目运算符只有一个操作数,双目运算符有两个操作数,多目运算符则有多个操作数。符号运算符类型运算符注解=双目赋值*单目取指针&单目取地址 关于赋值、指针、取指运算可以举如下的例子供用户参考学习: #includevoid main()int data nvar1,nvar2,*pvar,nresult;nvar1=5;nvar2=3;pvar=&nresult; /除法运算*pvar=nvar1*nvar2; /取模运算while(1);运行结果如下: 2. 算术运算符 符号运算符类型运算符注解+双目加法运算-双目减法运算*双目乘法运算/双目除法运算%双目取模运算 以上的运算符,对于+,-,*的操作比较熟悉,但是对于除法和取模运算就比较陌生,下面就一个例子来对这两种运算进行解释:#includevoid main()char datanvar1,nvar2,nresult1,nresult2;nvar1=5;nvar2=3;nresult1=nvar1/nvar2; /除法运算nresult2=nvar1%nvar2; /取模运算while(1);运行后的结果是: “/”为除法运算,“%”为取模运算,运算符左侧为被除数,右侧为除数。5/3结果为1,而5%3结果为2,其实这两种运算可以理解为,“/”为取商,“%”为取余。 3. 关系运算符 符号 运算符类型 运算符注解 双目大于= 双目大于或等于3显然是成立的,结果为真,返回值为1,而33不成立,结果为假,返回值为0.最应该注意的是=和=3在关系上是对的,这些细节读者应该多多注意。void main()int data nvar1,nvar2,nvar3,nvar4,nvar5,nvar6;nvar1=(53);nvar2=(33);nvar3=(5=3);nvar4=(3=3);nvar5=(5= =3);nvar6=(3= =3);while(1);运行结果如下: 4. 逻辑运算符 符号 运算符类型 运算符注解& 双目逻辑与| 双目逻辑或! 双目逻辑非 在逻辑运算中,最基本的是二值逻辑即真和假,而逻辑运算是以真假逻辑为对象的运算。 对于与运算,只有二者都为真时,结论才为真 对于或运算,只有二者都为假时,结论才为假 对于非运算,取反,真的非即为假,假的非即为真 具体的例子不再在这陈述,读者可仿照上面的例子,自行设计程序对逻辑运算进行测试。 5. 位运算符号 运算符类型 运算符注解& 双目按位与| 双目按位或 双目按位异或 双目按位取反 双目按位右移 这里的位指的是二进制位,计算机中的数据都是以二进制存放的,对于数据的操作也是按位进行的。 6. 复合运算符 符号运算符类型运算符类型+=双目加-=双目减*=双目乘/=双目除%=双目模&=双目与|=双目或=双目非=双目取反=双目右移?:双目问号运算为了方便书写,C语言中有符合运算,使得语句的书写更加简洁,符号左边的变量既为源操作数也为目的操作数。复合运算测试程序如下:void main()int xdata nvar1=1,nvar2=2,nvar3=3,nvar4=4,nvar5=5,nvar6=6,nvar7=7,nvar8=8;nvar1*=3;/nvar1乘以3再放到nvar1中去nvar2*=nvar1;/nvar2乘以nvar1再放到nvar1中去nvar3=2;/nvar3左移2位再放到nvar3中去nvar45? nvar5:nvar6;/35为假,故nvar6放到nvar7中去nvar8=53? nvar5:nvar6;/53为真,故nvar5放到nvar8中去while(1);运行结果是: 这段程序选择的变量存储类型为xdata,即变量存储在外部数据存储区,这与运行结果无关,只是在程序内部变量的操作上可能比较费时。 其它的复合运算符应该比较好理解,在此只对问号运算符做一解释:如果问号关系式是真的,那么就将“:”前的数据放入目的操作数,如果问号关系式为假,则将“:”后的放入目的操作数。 (4) 基本的程序设计结构 在结构上,可以吧程序分为三类:顺序、分支、循环结构。顺序结构是程序的基本结构,程序自上而下,从main()函数开始一致运行到结束;分支结构,相对顺序结构有较多的分支结构可以选择,满足某个条件时就执行对应的一段程序;程序需要反复执行某一个操作时,循环语句为程序设计提供方便。1. 顺序结构程序设计大多数的程序体现了明显的顺序性,先做什么,再作什么,正如流程图中的先后顺序,依次向下执行,这个读者应该容易理解,就不再赘述。2. 分支结构程序设计1) 只有两只分支的时候用if(条件)分支1else 分支2 当条件为真时执行分支1,否则,执行分支22) 在多分支的时候用在分支比较多的情况下使用switch语句,格式如下:Switch(表达式)Case(常量表达式1):语句1; Break;Case(常量表达式2):语句2; Break;Case(常量表达式n):语句n; Break;Default:语句n+1;Break; Switch语句又称开关语句,switch语句的执行流程是:首先计算switch后面圆括号中表达式的值,然后用此值依次与各个case的常量表达式比较,若圆括号中表达式的值与某个case后面的常量表达式的值相等,就执行此case后面的语句,直到遇break语句就退出switch语句;若圆括号中表达式的值与所有case后面的常量表达式都不等,则执行default后面的语句n+1,然后退出switch语句,程序流程转向开关语句的下一个语句。 需要注意的是:default总是放在最后,这时default后可以不要break语句.并且,default部分也不是必须的,如果没有这一部分,当switch后面圆括号中表达式的值与所有case后面的常量表达式的值都不相等时,则不执行任何一个分支直接退出switch语句.此时,switch语句相当于一个空语句 。每一个分支语句后的break语句是必不可少的,否则程序并不能跳出switch,会继续执行case后面的case语句。3. 循环结构程序设计1)for循环 格式:for(循环体初始化;循环体执行条件;循环体执行后的操作) 循环体; 2)while循环 格式:while(循环体) 循环体; 3)do while循环 格式:do循环体内容 While(循环体执行条件) 需要注意的是:前两种循环是先进行条件是否满足的判断,才决定循环体是否执行;而do while循环是先执行循环体,再判断条件是否满足,再决定循环体是否再继续执行。(5)子程序设计 当一段代码需要经常被调用或是在不同的地方使用时,通常将该段代码编制成子函数的形式以方便调用。 程序执行过程往往要调用其它函数以实现一些特定的功能,在程序中函数调用的执行流程图如下所示: 通常在进行函数调用时,调用函数与被调用函数之间有数据的传递,这种数据的传递是通过函数的参数实现的。在定义一个子函数时,位于函数名括号内的变量是形式参数,而在调用函数的语句中函数名后的括号里的变量实际参数,参数传递中只能由实际参数传递给形式参数,而不能由形式参数传递给实际参数。 需要读者注意的是,当程序代码比较多的时候,通常主程序和子函数是分别在不同的文件中的,同时子程序也是按照功能分别存放在不同的文件中的,方便查阅。这时,如果要调用子程序,如果该子程序不在此文件中,就要事先声明将被调用的子函数。为了方便使用,也可以对每个文件做一个.h文件,.h文件包括对端口的定义、变量的定义、常量的定义、子函数的声明等。每次需要调用相关子函数时,只要直接调用这个.h文件就可以了。 例如,在后面按键的程序设计中,可以将按键扫描分为三个子函数,读按键、按键去抖、键值转换,保存在一个文件中,方便以后其它代码中的调用。一种主程序设计格式为: #include void Keyin (void) ; /调用函数 void Keychk(void); void Keycvt(void); void main() / 主函数 While(1) Keyin(); Keychk(); Keycvt(); 另外一种设计方法就是事先设计好key.h文件,在主程序中包含就好了:key.h文件格式: #include 端口定义; 变量定义; 常量定义; void Keyin (void) ; /函数声明 void Keychk(void); void Keycvt(void);完成key.h文件设计后,主程序为:#include #include “key.h”void main() / 主函数 While(1) Keyin(); Keychk(); Keycvt(); 从上
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 大同市人民医院注射并发症预防与处理应急考核
- 晋中市人民医院国际10-20系统电极安放考核
- 中国纤维素纤维项目投资计划书
- 中国石油项目创业投资方案
- 中国活性碳项目投资计划书
- 农村水利设施建设可行性分析报告
- 如何利用数据可视化提升学生思维能力
- 小学数学课堂思维训练课题研究方案5范文
- 中国涂料消泡剂项目商业计划书
- 中国羧酸项目商业计划书
- 2025年中国大唐集团置业有限公司招聘笔试冲刺题(带答案解析)
- 一+职场应用写作与交流(一):求职和应聘(教学设计)-【中职专用】高二语文上(高教版2023职业模块)
- 小学生旅游课件
- 《民营经济促进法》全文学习解读
- 高速公路隧道工程项目施工组织设计
- 华为交付流程管理制度
- 初中数学基础必刷题
- 康复医院介绍课件教学
- 人教版数学九年级上册第一单元测试卷(附答案)
- 自媒体账号转让合同协议
- 2025年中考语文作文中考12大主题作文模板!-分步详解+例文示范
评论
0/150
提交评论