1、单 片 机 实 验 指 导 书实验1 Keil软件的使用1.1 创建一个Keil C51应用程序开发单片机的第一步就是用Keil C51软件编写程序,并形成最终的“*.hex”目标文件,然后用编程器将该文件烧写到单片机中,最后将烧写好的单片机插到电路板上,接通电源就可以工作了。 在 Keil C51集成开发环境下使用工程的方法来管理文件的,而不是单一文件的模式。所有的文件包括源程序(包括 C 程序,汇编程序)、头文件、甚至说明性的技术文档都可以放在工程项目文件里统一管理。在使用 Keil C51 前,用户应该习惯这种工程的管理方式。对于使用 Keil C51 的用户来讲,一般可以按照下面的步骤
2、来创建一个自己的 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 总是打开用户前一次正确处理的工程,可以点击工具栏的
3、 Project 选项中的 Close Project 命令关闭该工程。图 1.1 Keil C51 集成开发界面(2)点击工具栏的 Project 选项,在弹出如图1.2 所示的下拉菜单中选择New Project命令,建立一个新的Vision2 工程,这时可以看到如图 2.10 所示的项目文件保存对话框。图 1.2新建工程项目下拉菜单在这里需要完成下列事情:为工程取一个名称,工程名应便于记忆且文件名不宜太长;选择工程存放的路径,建议为每个工程单独建立一个目录,并且工程中需要的所有 文件都放在这个目录下;选择工程目录 F:示范程序Led_Light 和输入项目名 Led_Light 后,点击
4、保存返回。点击选择工程存放路径 填写新建工程的名称 图1.3 新建工程项目对话窗口在工程建立完毕以后,Vision2 会立即弹出如图1.4 所示的器件选择窗口。器件选择的目的是告诉Vision2 最终使用的 80C51 芯片的型号是哪一个公司的哪一个型号, 因为不同型号的 51 芯片内部的资源是不同的。,Vision2 可以根据选择进行 SFR 的预定义, 在软硬件仿真中提供易于操作的外设浮动窗口等。图1.4 器件选择窗口由图1.4可以看出,Vision2 支持的所有 CPU 器件的型号根据生产厂家形成器件组,用户可以根据需要选择相应的器件组并选择相应的器件型号,如 Philips 器件组内的
5、 P80/P87C52X2 CPU。另外,如果用户在选择完目标器件后想重新改变目标器件,可点击工具栏project选项,在弹出的如图 1.5 所示的下拉菜单中选择是select device for target target 1命令。也将出现如图 1.4所示的对话窗口后重新加以选择。由于不同厂家的许多型号性能相同或相近,因此如果用户的目标器件型号在Vision2 中找不到, 用户可以选择其它公司的相近型号。图1.5器件选择命令下拉菜单(4)到现在用户已经建立了一个空白的工程项目文件,并为工程选择好了目标器件,但是这个工程里没有任何程序文件。程序文件的添加必须人工进行,但如果程序文件在添加前还
6、没有建立,用户还必须建立它。点击工具栏的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;流水灯向左移动
7、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.a
8、sm。注意文件的扩展名不能省略,而且必须是.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
9、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下拉菜单中选择as
10、sembly 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 选项,在编译时系统将自动生成目标代码文件*.
11、HEX。选择 Debug 选项会出现如图1.14所示的工作模式选择窗口,在此窗口中我们可以设置不同的仿真模式。图1.13 Keil C51 调试环境设置窗口图1.14 Debug 设置窗口从图1.14可以看出,Vision2 的 2 种工作模式分别是:Use Simulator(软件模拟) 和 Use(硬件仿真)。其中 Use Simlator 选项是将Vision2 调试器设置成软件模拟仿真模式,在此模式下不需要实际的目标硬件就可以模拟 80C51 微控制器的很多功能,在准备 硬件之前就可以测试您的应用程序,这是很有用的。(2)程序的编译、连接、运行完成以上的工作就可以编译程序了。点击如图1
12、.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 项目 在编译过程中不存在错误和警告,编译
13、链接成功。若在编译过程中出现错误,系统会给出错 误所在的行和该错误提示信息,用户应根据这些提示信息,更正程序中出现的错误,重新编译直至完全正确为止。对源程序进行编译之后,还需要实际的运行来验证程序的正确性。点击如图1.17所示的start/stop debug session命令,将程序与硬件进行连接,如果与硬件连接正确,会在Output windows窗口出现如图1.18所示的提示信息,如果连接不正确,会出现如图1.19所示的信息,此时请复位硬件,然后重新编译、连接。图1.17 start/stop debug session命令窗口图1.18 与硬件连接正确提示信息图1.19 与硬件连接不
14、正确提示信息完成以上步骤,与硬件连接正确之后,用户就可以按图1.20所示的运行命令进行在线仿真了。图 1.20 运行命令窗口以下与实验内容无关,作为了解,可以跳过。 在调试环境设置窗口的target页面下,(参考图1.13),xtal后面的数值是晶振频率值,默认值是所选目标CPU的最高频率值。一般将其设置成为实际所使用的晶振频率值。Memory Model用于设置RAM使用情况,有3个选择项。I small :是所有变量都在单片机的内部RAM中,如果内部RAM空间不够,才会存到外部RAM中。这种数据存储方式的好处在于运算速度最快,也是我们一般常选择的方式。II Compact :变量存储在外部
15、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
16、(不使用任何操作系统)。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 Fold
17、er 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。
18、其它项不必改动,具体设置参考图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(
19、低位)、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,#
20、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指向下一
21、个地址 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地址开始单元中的数据。以下几个
22、运算程序调试方法与此类似。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,#05
23、H ;初始化 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)
24、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 ;欲转换的二进制数
25、存放单元 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中D
26、IV 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 20
27、H操作,以便重复根据20H中的内容散转。程序流程如图所示。(2)求最小值程序编一个能在内部RAM 20H为始址的连续10个存储单元中找出最小值并存入1FH单元的程序。编译、连接、进入调试状态。程序流程如图所示。在数据存储器窗口,使用d:0x20显示片内ram20H开始数据,修改从20H开始的连续10个单元,并记住最小的数。执行程序,检查结果是否正确,若不正确,可单步运行、断点运行排除错误。实验4 基本指令和片内RAM操作实验1 实验目的(1)熟悉单片机片内RAM的结构和操作方法(2)掌握单片机的基本指令系统2实验内容(1)片内RAM数据传送指令操作(2)清零子程序操作子程序设计(3)BCD码减
28、法子程序设计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中
29、有一个BCD码91H和21H中有一个BCD码36H,如下BCD键发程序可以完成91-36并把差送到21H中。ORG0000HJMPMAINMAIN:CALLBCD_SUBSJMP$BCD_SUB:CLRCMOVA,#9AHSUBBA,21HADDA,20HDAAMOV21H,ACLRCRETEND4 思考题(1)BCD减法中,对减法球部和二进制数的球部有何差别 (2)体会设置断点和断点次数对于调试程序的作用实验5 流水灯控制实验1 实验目的(1)熟悉并行接口P0P3的内部结构(2)掌握I/O口的基本控制。2实验原理P0P3接口的功能及内部结构查阅课本相关内容。本实验流水灯控制相关硬件电路如图所
30、示 a. LED电路 b. 跳线电路有LED电路可看出要是该灯亮,就必须将其对应的发光二极管负端拉低。而由跳线电路可见发光二极管的负端是由P1口的,如要是LED1亮,则需P1.0置“0”,即完成给P1.0端口写“0”操作。但是由于发光二极管的控制端与A,BDP复用P1口,所以要用跳线帽短接LED端与P1口。3 实验内容编写程序实现8个二极管的轮流点亮。org0000hjmpmainorg0100hmain:movp1,#55hcalldelaymovp1,#0aahcalldelayjmpmaindelay:movr2,#255del:movr3,#255djnzr3,$djnzr2,delr
31、etend4 实验步骤(1)在keil集成开发环境下,编写并输入程序,保存为light.asm;(2)新建工程LIGHT,并添加文件light.asm;(3)编译、连接并生成目标文件;(4)进入调试状态,单步运行程序,查看片内片外存储器对应单元的数据变化情况。(5)全速运行程序,观察运行结果。5 思考题1.在实验1的范例程序也是一个流水灯控制的程序,它是一个点亮的灯从左向右,再从右向左的循环,那么还有其他的循环方式,请同学们自己练习。2.上面的延时程序的作用是什么,将255改成300可以吗,为什么?实验6 显示和键盘1 硬件电路显示电路采用动态扫描方法,使用P0口低4位作为位选码控制端,P1口
32、作为段选码控制端。图1 显示电路图键盘电路如图2所示,P2口8位分别用来检测8个键的状态,当有键按下对应的该I/O口为低电平,无键按下该端口为高电平。图2 键盘电路图2 显示程序本程序的现象将是在数码管上显示1234。为了便于在本实验中程序的通用性,实验中所有程序均采用模块化设计,即将程序设计成子程序形式,方便各模块间子程序的调用。为此,我们定义了一个显示数据缓冲区displaydata,地址范围从40H43H。程序中即将把该显示缓冲区中的数据显示到数码管上。 另外程序中要注意的是:I. 该缓冲区范围内地址不能被其它的资源占用,只能是显示程序或改变显示数据的程序可以访问。II. 显示缓冲区中不
33、能存在LED显示码表中显示段码不能表示的非法字符。III由于人眼的视觉惰性,当选中某个数码管并送上显示段码,在选择下一个数码管之前,必须要让显示数据在选择的数码管上停顿一定的时间。这正是本程序在显示程序当中加入了一段延时程序的原因。显示程序的源码如下:displaydatadata40hORG0000HJMPSTARTORG0100HSTART:MOVdisplaydata,#01H;显示初始化,装显示初志,显示1234MOVdisplaydata+1,#02HMOVdisplaydata+2,#03HMOVdisplaydata+3,#04HMAIN:CALLDISPLAY;调显示自程序JM
34、PMAIN;-显示子程序-DISPLAY:MOVR2,#0FEHMOVR1,#displaydataDIS0:MOVA,R1MOVDPTR,#TABMOVCA,A+DPTRMOV P1,AINCR1MOVP0,R2MOVA,R2RLAMOVR2,ACALLDELAY;调延时子程序CJNER1,#44H,DIS0RET;-延时子程序-DELAY: MOV R7,#02HDL: MOV R6,#0FFHDL6: DJNZ R6,DL6 DJNZ R7,DL RET;-LED显示码表-TAB: DB 0c0H, 0f9H, 0a4H, 0b0H, 99H, 92H; 0 1 2 3 4 5; 00H
35、 01H 02H 03H 04H 05H; DB 82H, 0f8H, 80H, 90H, 88H, 83H; 6 7 8 9 A b; 7DH 07H 08H 09H 0AH 0BH; DB 0c6H, 0a1H, 86H, 8eH, 8cH, 0c1H; C D E F P U; 0CH 0DH 0EH 0FH 10H 11H; DB 89H, 0c7H,0bfH, 91H,00H,0ffH; H L - y ON OFF; 12H 13H 14H 15H 16H 17H; DB 92H, 77H, 8bH, 0afH, 0a3H, 0a1H; S t h r o d; 18H 19H 1
36、AH 1BH 1CH 1DH; DB 0f0H, 0FH, 8bH, 0afH, 0a3H, 0a1H; S t h r o d; 1EH 1FH 20H 21H 22H 23H End3.2 键盘程序我们将实验板上按键按从左到右,从上到下的顺序定义键号为KEY0KEY7。各键对应的键值列表如下:键号KEY0 KEY1KEY2KEY3KEY4KEY5(KEY6KEY7键值FEHFDHFBHF7HEFHDFHBFH7FH为了直观的观察按键效果,在键盘程序中加入了显示程序,最终我们程序的效果是按键KEY0,显示缓冲区displaydata处数据加一,按键KEY1,显示缓冲区displaydata+
37、1处数据加1,依次类推。当显示数据超10时,对应缓冲区数据清零。对于KEY6、KEY7、KEY5、KEY4键在本程序中将不起作用。主程序的流程图为:键盘程序的流程图为:程序中要注意的是:I 为了避免外界干扰带来的按键误判,必须要有一个延时去抖动(一般100ms),然后再次判断是否有键被按下。这样做的目的是为了保证键盘工作的可靠性。II由于程序当中采用的是循环扫描的显示方式,为了保证显示的稳定性,不出现数码管闪烁、亮度不均匀的问题,因该在程序中的适当多调用显示程序。本程序中的解决办法是在延时消抖动期间再次调用了显示程序,避免了可能存在的问题。实现的程序代码如下:dis_datadata40h;显
38、示数据首地址key_holdbit20h.0ORG0000HJMPSTARTORG0100HSTART:MOV SP,#60HMOVdis_data,#00HMOVdis_data+1,#01HMOVdis_data+2,#02HMOVdis_data+3,#03H ;显示数据初始化;主程序MAIN:CALLDISPLAYCALLKEY_WORKJMPMAIN;-显示子程序-DISPLAY:MOVR2,#0FEHMOVR1,#dis_dataDIS0:MOVA,R1MOVDPTR,#TABMOVCA,A+DPTRMOV P1,AINCR1MOVP0,R2MOVA,R2RLAMOVR2,ACALLDELAY;调延时子程序CJNER1,#44H,DIS0RET;-延时子程序-