51系列单片机实验系统指导书 电子工程系 目 录 前言 第1章 下载式实验系统的使用方法 1.1 软件安装与启动 1.1.1 1.1.2 文件操作 1.1.3 建立工程项目(汇编) 1.1.4 调试程序 第2章 软件实验 2.1 数据传送实验 2.2 清0实验 2.3 数据转换实验 2.4 拆字、拼字实验 2.5 散转程序实验 2.6 时钟实验 2.7 计数器实验 2.8 无符号十进制数加法实验 2.9 数据排序实验 2.10 单字节BCD码除法实验 2.11 查找相同个数实验 第3章 硬件实验 3.1 P1口彩灯控制实验 3.2 数码管显示实验 3.3 顺序控制实验 3.4 8031和8155接口扩展与数码管显示实验 3.5 键盘、数码管显示综合实验 3.6 A/D转换实验 3.7 D/A转换实验 3.8 A/D与D/A转换综合实验 第4章 89C51系列实验 4.1 顺序控制实验 4.2 数码管显示实验 4.3 键盘、数码管显示综合实验 4.4 A/D转换实验 4.5 D/A转换实验 前 言 目前,51系列单片机在我国的各行各业得到了广泛应用,各大专院校、 职业培训学校,均开设了单片机原理与应用方面的课程,这是一门技术性和实践性很强的学科,必须通过一系列的软硬件实验、理论联系实际,才能学好、学懂,取得较好的学习效果。为了适应这一学习上的要求,国内外厂家开发了多种实验、开发系统,但普遍存在集成度高,严重脱离实际的情况。作者集多年理论教学、实验教学、产品开发的经验,完全摒弃了以前各种实验设备的那种思维模式,重新开发出一种实验、开发系统,专从产品开发角度出发,安排各种硬件实验,并且做到每一个实验就是一个小产品,每个实验就是一个产品开发的过程,从单片机最小系统开始,逐步扩展功能,从单一功能到功能多样,从小到大,从简单到复杂,自成系统给人一种完整的学习思路,让学习者概念清晰、直观明了、易学易懂,特别是加强了硬件故障排除方法的指导,解决了学习者中普遍对硬件故障排除难的问题;其次是加强了软件调试的指导,提供了一些软件调试方法和步骤,帮助初学者很快入门,帮助熟练者更加深化。 本实验系统采用模块式设计,为各学校单片机的课程设计、学生的毕业设计、提供了硬件设备,该模块可反复使用、任意组合、方便经济,解决了各单位研究与实验经费不足的问题。特别在开发产品中更加适用,一个产品谈妥后厂家往往要求几天之内拿出产品样机,你可用此系统很快拼装成一个产品样机,供编程人员仿真,同时进行印制板设计。若出现问题,硬件可及时修改、添加,一切开发成功后,再作印制板,一次成功,减少经费损失,缩短了开发周期,为产品开发提供了方便。 本实验指导书分四章:第1章,下载式实验系统的使用;第2章,软件实验;第3章, 硬件实验;第4章,89C51单片机实验, 特别第4章完全讲解的是一个产品开发的全过程,力求使学习者获得更大的收益。 第1章 下载式实验系统的使用方法 1.1 软件安装与启动 下载式实验系统,是一套既可脱离硬件仿真又可与实验系统联机仿真的实验装置,对于硬件实验,只要将软件调试好后就可将程序用串行口直接在线写入芯片,再不必象以前那样要专用的编程器来固化程序。 1.1.1 软件安装 1. 为使 QTH 调试器能够正常运行,您必须提供以下软硬件环境: 586 以上的 PC 及兼容机;100M 以上的剩余硬盘空间;分辨率为 800×600 以上的显示器;具有SPP功能的打印机接口;使用符合 Intel 标准的汇编器、编译器和连接器。如 Franklin/Keil V3.2 或 keil V6.02 及以上版本。 2.使用:单击开始/程序,在程序条中选QTH2008XS下载式单片机实验仪V2004.1或直接双击桌面上QTH-2008XS 快捷图标。 图1-1连机出错提示框 如果已经连接仿真器或实验仪,则直接进入 QTH 调试器窗口。如果没有连接仿真器,等一下屏幕上会出现图1-1所示的连机出错提示框:可以选择是否进入模拟调试:“是”——进入调试;“否”——请检查并使仿真器正常工作后,再按调试菜单上的复位钮,进入仿真调试。出现如图1-2所示的模拟调试器窗口:  图1-2模拟调试器窗口 1.2 系统使用方法 学习单片机的最终目的是开发单片机产品或维修单片机产品,开发一个产品必须经历硬件设计和软件设计两个阶段。而实验系统是将一些简单的实用电路已设计好。再在该系统中编写程序,调试程序,编写调试程序又必须经历写程序;编译程序;调试程序三个大的过程,每一个过程又有很多步骤和方法。写程序有程序输入、程序修改、程序保存。编译程序有成功与否,不成功要反复修改,成功后会自动生成列表文件(.LST)和目标文件(.OBJ),可进行调试程序,调试过程较复杂,下面分别叙述。 首先在图1-2所示的窗口中可进行程序编写或打开已编好的程序,若编写新的程序则在主菜单中单击“文件/新建”,若打开编好的程序,则在主菜单中单击“文件/打开”,现打开一个编好的文件(P1.ASM),出现如图1-3所示的模拟调试器窗口:  图1-3模拟调试器窗口 在主菜单中有9项,即文件、编辑、查看、项目、调试、设置、外设、窗口、帮助下面将每一项及每一项的子菜单分别叙述,其中文件和编辑菜单内容一般会用,重点讨论查看、项目、调试、设置、外设、窗口,帮助一项也可自已随时使用。 1.2.1 查看 主菜单的“查看”下拉菜单中的内容有:工具栏、状态栏、寄存器窗口、程序寄存器窗口、数据寄存器窗口、逻辑分析窗口、跟踪记录窗口、变量表、项目管理器窗口、信息窗口、观察窗口。这些窗口和工具条显示在屏幕或关闭的方法都是第一次选中且单击打开(关闭)对应的选项,第二次选中且单击关闭(打开)对应的选项。将全部打开后的屏幕窗口显示如图1-4所示: 号窗口为综合窗口,单击本窗口下面的标签,此窗口会变换成项目管理器窗口,特殊功能寄存器窗口,内部数据存储器(00H-FFH)窗口,内部位(20H-2FH范围内的00-7F之间共计128个位)显示窗口。随着程序的不同可以任意选择其中的一个窗口。在项目管理器窗口和内部数据存储器(00H-FFH)窗口中单击鼠标右键有对应的浮动菜单出现,选中且单击选项可进行对应的操作。后面的3个窗口可直接改变单元中的数值(赋值)。 ②号窗口为信息窗口,该窗口是显示所有操作的信息内容,特别是在将程序进行编译或编译连接装载后,显示程序出错与否的信息,主要看错误(ERROR)和警告(WARNING)两项,特别是错误项有一个错误就不能编译通过,调试就不能进行,有警告无错误还可通过,最好显示是“0”个错误,“0”个警告。 ③号窗口也是一个综合窗口,单击本窗口下面的标签,此窗口会变换成代码(Code)窗口,外部程序(XData)存储器窗口,数据(Data)存储器窗口。随着程序的不同可以任意选择其中的一个窗口进行观察。  图1-4模拟调试器窗口 在每一个窗口中单击鼠标右键有对应的浮动菜单出现,选中且单击选项可进行对应的操作。例如在外部程序(XData)存储器窗口中单击鼠标右键出现浮动菜单,要看指定的单元中的内容,选中浮动菜单中“选择显示地址”且单击出现地址对话窗口,在窗口中输入要看的地址,对应的地址项马上出现在本窗口中,解决了查找之苦。所有窗口可直接改变单元中的数值(赋值)。 ④号窗口为观察窗口,有时要观察的值太多,可将要观察的值选定到此窗口中进行观察,方法是:在此窗口中单击鼠标右键出现浮动菜单,选中浮动菜单中“增加观察项”且单击出现如图1-5所示的对话窗口,按窗口中的要求选中对应的各项,选中的变量  图1-5模拟调试器窗口 马上出现在④号窗口中。 ⑤主窗口,程序所在的窗口,也有浮动菜单,为调试程序提供了方便。 从上可见观察内容很多,一个屏幕上不可能容纳这么多内容, 有的时候窗口很大,就需要用窗口调整指令来调整好各个窗口位置大小。窗口整体移动的方法是用鼠标单击上边框条,上边框变蓝,将鼠标左键按住整体移动,鼠标整个窗口一起移动,放到合适位置,松开鼠标就行。窗口四边分别收缩或放大的方法是,将鼠标点击窗口边线,出现左右或上下形式的箭头(注意此箭头一晃而过要认真捕捉),马上按住鼠标左键整体移动鼠标,边线就跟着移动,移至合适位置,松开鼠标就行,有些窗口为竖式长方形,有些窗口为横式长方形,若要调整它的形状,用窗口命令就行。 1.2.2 项目 项目菜单为解决多个程序组合或混合编程(汇编语言C语言)的问题而设置。单击主菜单中项目,出现下拉菜单,在下拉菜单中有新建项目、打开项目、关闭项目、项目属性、编译当前文件、编译连接装载、加入模块文件、加入库文件、装入调试信息。下面重点讨论几项,其他的自已照着操作不再一一叙述。 1.新建项目 单击“项目/新建项目”,出现对话框,在框重输入文件名字,新的项目就建立了。若有原项目,只是打开就行了(但源文件修改以后,每次就在“文件”菜单中选“保存”或用保存工具图标保存文件)。 2.编译文件 单击“项目/编译当前文件”或 “项目/编译连接装载”(两种方式的区别在于前者只编译,后者既编译又将编译后的代码下载到CPU中)将新编写的或打开的程序进行编译,编译成功的话,下面的信息窗口(Massage)会出现新创建的文件名,且在窗口中出现组装完成(ASSEMBLY COMPLETE),“0”个错误(ERROR)“0”个警告(WARNING) 。系统会自动生成列表文件和目标文件。若编译有错,信息窗口会指出错误在什么地方,反复修改,直至编译通过为止。 注意:若有一项错误,目标文件和列表文件就不能自动生成。 3.项目属性 单击“项目/项目属性”出现对话框,框中第一页如图1-6所示 ⑴ C编译器页  图1-6工程设置对话框 SMALL、COMPACT、LARGE这些指令控制存储器模式选择。存储器模式对不同的变量定义有所影响。 SMALL:小模式,所有函数和过程的变量及局部数据段被定义在8051片内数据存储区。 COMPACT:紧凑模式,所有函数和过程的变量及局部数据段被定义在8051片外数据存储区中256字节。这种模式使用(@R0、@R1)访问外部数据存储器。 LARGE:紧凑模式,所有函数和过程的变量及局部数据段被定义在8051片内数据存储区中64K字节空间。这种模式通过数据指针(DPTR)访问外部数据存储器。 CODE/NOCODE:CODE指令在列表文件后附加上一个汇编记忆表,源程序中的每个函数被表示为汇编代表。 OPTIMIZE(n):括号内n为一个0-5的十进制数,另外可选OPTIMIZE(SIZE) 和OPTIMIZE(SPEED),以决定优化重点是放在代码长度上还是执行速度上。 RAM(SMALL、COMPACT、LARGE) RAM指令用来决定程序内存的大小,它影响跳转指令的编码。 RAM(SMALL): CALL和JMP指令作为ACALL和AJMP指令的编码,最大程序空间可达2K字节,整个用户程序必须分布在这2K字节空间内。 ROM(COMPACT):CALL指令以LCALL编码,函数内JMP指令以AJMP编码,因此函数长度不得超过2K字节,而整个程序长度不得超过64K字节,这种用法必须根据不同的目的而决定,看其是否比标准设置ROM(LARGE)效果更佳。 ROM(LARGE):将CALL和JMP指令以LCALL和LJMP编码。这样就允许不加限制地使用整个地址空间,用户程序最大可达64K字节。 ⑵PL/M编译器页  图1-7工程设置对话框 CODE/NOCODE:CODE控制表明开始列出生成标准汇编语言格式地目标代码,这些汇编语言目标代码紧随源程序列表清单之后,NOCOD控制是在出现CODE控制之前,不列出所生成地目标代码清单。注意:NOPRINT控制不能对CODE控制有抑制作用,而且NOOBJECT中也隐含了NOCODE功能。 INTVECTOR/NOINTVECTOR 在INTVCTOR控制下,编译程序可为模块中每个中断过程产生一个字节入口的中断向量。对中断n,中断向量入口的绝对地址为8n+3。当然,可以用ASM51单独建立中断向量。在选用NOINTVECTOR控制时,编译程序将不产生任何中断向量。 RAM(SMALL、MEDUIM、LARGE) RAM指令用来决定程序内存的大小,它影响跳转指令的编码。 RAM(SMALL): CALL和JMP指令作为ACALL和AJMP指令的编码,最大程序空间可达2K字节,整个用户程序必须分布在这2K字节空间内。8051为提高编码密度,仅在2K块内转移和调用,尽可能不使用3个字节的调用和转移指令。 ROM(MEDUIM):将正在进行编译的模块适合INBLOCK,而其他模块(包括来自PLM51.LIB的那些模块)可以任意安放,这样就需使一些调用成为长调用(3个字节)。但是大多数的转移和大部分调用,仍能保持短编码形式。 ROM(LARGE):将CALL和JMP指令以LCALL和LJMP编码。这样就允许不加限制地使用整个地址空间,用户程序最大可达64K字节。 OPTIMIZE(n):括号内n的可取值为一个0-3的十进制数,在产生目标代码中,该控制实现各种优化处理。每一优化级包含了比优化级别低的所有优化处理功能。 REGISTERBANK(寄存器组控制) 其中,寄存器组值为0、1、2或3。在代码生成中,REGISTERBANK控制将确定选用其四个8051寄存器组中的一个。对一个含有USING属性的控制,能够由一个过程所替代,PL/M51认为,一个过程中断总是与他所中断的过程使用不同的寄存器组,因而如果在一个独立模块中为每个中断编译代码,则应在REGISTERBANK控制下编译所有非中断代码,所有的低级中断和高级中断分别处在各自寄存器组的设置下。因此,不用USING属性也能避开引起的麻烦。 ⑶连接器页  图1-8工程设置对话框 该页中其它各项已介绍,下面只讲述定位控制项: BIT:起始地址/段名,定位BIT段。 DATA:起始地址/段名,定位DATA段。 IDATA: 起始地址/段名,定位IDATA段。 STACK:段名,定位STACK段。 CODE: 起始地址/段名,定位CODE段。 XDATA: 起始地址/段名,定位XDATA段。 PDATA: 起始地址,为PDATA类型的段定义起始地址。 PRECODE:起始地址,在寄存器和位存储区中定位段。 1.2.3.调试程序 调试程序是使用该软件的最复杂、最关键的一步,在调试之前, 要进行各项操作与设置,不然下拉菜单中的各项打不开(没有从白色变成黑色)。 1.装载:装入当前程序的调试信息。该命令的快捷键为Ctrl+L,工具图标见由“查看/工具栏/调试工具”打开的工具条。 2.源程序调试:进入源程序调试方式。 3.混合码调试:对 C 程序进入源与汇编码的混合状态调试方式。 4.单步执行:跟踪运行程序,在反汇编窗口下执行一条指令,如果当前是调用指令,则进入所调用的子程序;如果在源程序窗口下,执行当前文本下的一条语句,如果是调用指令则进入所调用的子程序。该命令的快捷键为F8,工具图标见由“查看/工具栏/调试工具”打开的工具条。 5.宏单步执行:单步运行程序。反汇编窗口下如果是调用指令,则越过所调用的子程序;源程序窗口下,如果是调用语句,则越过所调用的子程序。该命令的快捷键为F10,工具图标见由“查看/工具栏/调试工具”打开的工具条。 6.连续单步:连续单步操作。该命令的快捷键为Ctrl+F8。 7.连续宏单步:连续宏单步操作。该命令的快捷键为Ctrl+F10。 8.连续执行:全速运行,遇断点停止。该命令的快捷键为F5,工具图标见由“查看/工具栏/调试工具”打开的工具条。 9.执行到光标处:全速运行到光标处。该命令的快捷键为F7,工具图标见由“查看/工具栏/调试工具”打开的工具条。 10.跳出子程序:当前执行在子程序处时,执行该命令跳出子程序。该命令的快捷键为Shift+F11,工具图标见由“查看/工具栏/调试工具”打开的工具条。 11.设置断点:单击“调试/设置断点”出现断点设置窗口,可设置或清除断点;设置断点属性等。该命令的快捷键为F9。 12. 复位:复位仿真器, 该命令的快捷键为Ctrl+R。 13. 屏蔽断点全速运行 该命令的快捷键为Ctrl+F5。 1.2.4设置(S) 仿真器设置: 单击“设置/仿真器设置”出现如图1-9所示的对话框,在该对话框中可设置仿真器的仿真模式。 ⑴ 8052 模式 选择 8052 仿真模式,(EA=0)。 在此模式下可仿真采用 8031/8032、80C31/80C32、8051/8052、78C32 单片机的应用系统。仿真程序存贮器模式选择栏中,可选择四种仿真存贮器模式之一: ① 内程序存贮器 内数据存贮器 仿真程序存贮器在仿真器上。数据存贮器也在仿真器上,该模式在无目标板时,最初调试软件用以排除软件中的故障。 图1-9仿真模式设置对话框 ② 内程序存贮器 外数据存贮器 仿真程序存贮器在仿真器上,数据存贮器及 I/O 口在用户板上。一般采用该模式。通过该模式进行在线测试,可排除目标板上硬件故障,并进行软件调试。 ③ 外程序存贮器 内数据存贮器 程序存贮器在用户板上(EPROM),数据存贮器在仿真器上。该模式很少使用。主要用于目标板缺少数据存贮器,将仿真器上数据存贮作临时使用。 ④外程序存贮器 外数据存贮器 程序存贮器在用户板(EPROM)上,数据存贮器及 I/O 口在用户板上。该模式可进行反汇编跟踪分析目标板程序,或调试目标板上 EPROM 中程序。 ⑵ 8752 模式 当选择8752仿真模式,(EA=1)。可仿真采用 87C51/87C52 、W78E5X、AT89C5X、LG90C5X 单片机的应用系统。仿真程序存贮器模式选择栏中,可选择四种仿真存贮器模式之一: ① 内程序存贮器 内数据存贮器 例如:仿真 89C52 8K 程序存贮器,大于 8K 程序存贮器在仿真器上,扩展的外部数据存贮器在仿真器上。该模式在无目标板时调试软件,用于排除软件中的故障。 ② 内程序存贮器 外数据存贮器 例如:仿真89C52 8K 片内程序存贮器,大于 8K 程序存贮器在仿真器上,扩展的外部数据存贮器及I/O 口在用户板上。一般采用该模式。通过该模式进行在线测试,可排除目标板上硬件故障,并进行软件调试。 ③ 外程序存贮器 内数据存贮器 例如:仿真 89C52 8K 片内程序存贮器,大于 8K 程序存贮器在用户板上。扩展的外部数据贮器在仿真器上。该模式很少使用。主要用于目标板缺少数据存贮器时,将仿真器上数据存贮作临时使用。 ④ 外程序存贮器 外数据存贮器 例如:仿真 89C52 8K 片内程序存贮器,大于 8K 程序存贮器在用户板上。扩展的外部数据存贮器及 I/O 口在用户板上。 ⑶ 仿真器存贮空间选择 当选择 8752 模式时,跟据 CPU 片内存贮器空间有四种选择: 87C51/78E51 4K 片内程序存贮器 87C52/78E52 8K 片内程序存贮器 87C54/78E54 16K 片内程序存贮器 87C58/78E58 32K 片内程序存贮器 ⑷ 主频选择 主频分仿真主频及逻辑主频两类。仿真主频是指仿真器的仿真频率;逻辑主频是指带逻辑分析仪仿真器的采集频率。有四种频率选择:6MHz、12MHz、24MHz对于(QTH-8052F+ 其频率选择为:2.7648MHz、5.5296MHz、11.0592MHz)及外晶振,当选择外晶振时,由目标板或仿真头提供振荡频率(即用户自己选择的晶振)。 ⑸ 外复位选择 该功能允许用户板的复位引入仿真器内仿真 CPU,可调试外部复位电路及实时仿真外部看门狗电路及自复位电路。 2.设置PC值:设置当前程序计数器值。 3.设置文本编辑器:单击“设置/设置文本编辑器”弹出设置文本编辑器对话框,可设置环境参数,如字体、颜色等。 4.项目属性:设置源程序的编译/连,在前面已讲述 1.2.5外设(O) 1. 端口:端口设置窗口,显示或改变端口的状态。如图1-10所示。 2. 定时/计数器 0:定时器/计数器 0 模式和控制窗口,其 TMOD 和 TCON 的值,可以作为定时器0初始化的编程依据,如图1-10所示。 图1-10 外设图示 3. 定时/计数器 1:定时器/计数器 1 模式和控制窗口,其 TMOD 和 TCON 的值,可 图1-11外设图示 以作为定时器1初始化的编程依据。 4. 定时/计数器 2:定时器/计数器 0模式和控制窗口,其中 T2CON 的值,可以作为定时器 2 初始化的编程依据。 5. 串行口:串行口工作模式和控制窗口,其 SMOD 和 SCON 的值,可以作为串行口初始化的编程依据。如图1-11所示。 6. 中断:中断状态窗口,包括 INT0,INT1,T0,T1,T2 和 UART 中断状态以及优先级和允许设置。设置或清除相应的标志,可以改变中断的状态,也可以通过相应的值,作为中断初始化的编程依据。如图1-11所示。 1.2.6 QTH 集成开发实验系统使用 QTH 集成开发环境提供了以下两种方式开发应用程序: 不使用QTH 集成开发环境项目管理方式——对源程序文件直接进行汇编/连接方式,兼容传统开发习惯。 使用 QTH 集成开发环境项目管理方式——可进行多模块、混合语言编程的方式,也同样适合单模块程序的开发。 1.不使用项目管理方式开发应用程序 不使用 QTH 集成开发环境项目管理方式,只能进行单模块方式下的应用程序开发,具有很大的局限性。以下是不使用 QTH 集成开发环境项目管理方式开发应用程序的步骤。 ⑴ 关闭当前项目 单击“项目/关闭项目” 此时 QTH 集成开发环境关闭界面上所有的窗口。 不使用 QTH 集成开发环境项目管理方式开发应用程序,用户必须关闭已经打开的项目,因为当打开项目文件后,QTH集成开发环境默认所有编译/汇编、产生代码的过程都是对项目或项目所包含的文件进行的。 ⑵ 在文件菜单下打开应用程序 单击“文件/新建”或“文件/打开”,出现如图1-12所示的对话框。 单模块方式下的文件调试可以按照以下方法新建或打开文件: ●单击“文件/新建”,输入文件名和扩展名,新建文件 ●单击“文件/打开”,选择文件选取框中的文件将其打开 图1-12 打开对话框 ⑶ 编译/汇编 单击“项目/编译” QTH 集成开发环境根据文件的扩展名,自动对当前激活的文件选择调用外部编译器或汇编器: 图1-13 信息框 ① 如果当前文件的扩展名为 ASM,“编译/汇编”命令调用外部汇编命令对当前文件汇编。 ② 如果当前文件的扩展名为 C,“编译/汇编”命令调用外部 C编译命令对当前文件编译。 执行“项目/编译”命令后产生的结果显示在如图1-13所示的信息框中: ⑷错误信息关联 QTH 集成开发环境调用外部命令编译后产生的结果,显示在信息窗口中。信息窗口中,当编译发生错误时,信息窗口中的错误信息自动与源文件关联,提示出错的位 置。在信息窗口中错误提示处双击鼠标左键,也可将错误信息与源文件的错误位置关联,如图1-14所示。 图1-14 信息关联框 如果编译没有错误,可进入第⑸步操作 如果编译出现错误,在修改文件后重复进行第⑶步操作 ⑸ 产生代码并装入仿真器调试 单击“项目/装入调试信息”或“调试/装入” 装入调试信息或装入命令对编译连接无误后产生的 OBJ 文件进行连接,产生用于下载的代码。此命令自动地对修改过的源程序进行编译或汇编,对没有修改过的程序将越过编译或汇编过程,然后连接所有的 OBJ,LIB 文件,再装载代码到仿真器,完成调试程序所需的准备工作。装载完成后,调试器窗口调试工具条所有命令钮变亮。 2.使用项目管理方式开发应用程序 使用 QTH 集成开发环境项目管理方式,可以对单模块和多模块方式应用程序进行开发。以下是使用 QTH 集成开发环境项目管理方式开发应用程序的步骤: 建立一个新的项目进入第⑴步——新建项目 打开已经存在的项目文件进入第⑶步——打开项目 图1-15新建项目对话框 ⑴ 新建项目 单击“项目/新建项目”出现图1-15所示的对话框 项目名称栏:QTH 集成开发环境的项目文件是按项目名称管理的,项目管理器内的项目名称不可以相同。在项目名称输入栏内,项目名称用户必须输入,并且项目名称不得超过 8 个字符,不可以使用汉字以及“-,?,*,/”等 DOS 文件所不可以使用的字符。 图1-16打开对话框 立即加入模块文件:选择立即加入模块文件,表示在项目建立后,会自动打开文件选取框,供用户选择文件添加到项目管理器。 ⑵ 加入模块文件 单击“项目/加入模块文件”出现“打开”窗口,选择文件在当前新建或打开的项目中添加源程序文件。 注意:必须逐个加入模块文件,并且把主模块第一个加入其中。 ⑶ 打开项目 单击“项目/打开项目” 出现“打开”窗口。对于调试已经存在的项目,可以直接打开项目文件进入第四步操作。 ⑷ 设置项目属性 设置当前项目的编译及连接控制属性。 ⑸ 编译/汇编/连接 单击“项目/编译连接装载”,QTH 集成开发环境根据文件的扩展名,自动对激活的文件选择调用外部编译器或汇编器进行编译。 如果当前文件的扩展名为ASM,编译/汇编命令调用外部汇编命令对当前文件汇编。 如果当前文件的扩展名为 C,编译/汇编命令调用外部 C 编译命令对当前文件编译。 文件编译/连接的命令行参数由“项目/项目属性”确定。 ⑹ 错误信息关联 文件经过编译/连接后的结果显示于信息窗口,出现错误后错误信息与文件关联。在信息窗口中错误之处双击鼠标左键,可将错误与文件关联: ● 如果没有错误,进入第⑹步操作 ● 如果出现错误,修改文件后重复第⑸步操作 ⑺ 装入调试信息 单击“项目/编译连接装载” 单击“项目/装入调试信息” 单击“调试/装入” 编译连接装载命令对经过编译/汇编无误后产生的 OBJ 文件进行连接产生用于下载的代码。此命令对修改过的源程序自动进行编译或汇编,否则将越过编译或汇编过程进行连接并装载代码到仿真器,完成调试文件所需的准备工作,并自动装入调试信息到仿真器。 使用编译连接装载命令,命令管理器会自动判别文件是否需要重新编译/汇编,提高调试效率,对编译连接通过的程序自动装入调试信息到仿真器。 使用重新装入信息或装入命令,直接装入调试信息到仿真器。 1.2.7 调试举例 例1-1:单模块汇编语言源程序(不使用项目管理方式开发应用程序) 程序用已编好的文件,存于QTH\ASM文件夹中,文件名:P1.ASM ⑴ 关闭项目文件 关闭当前已经打开的项目,保证编译/汇编连接都是对当前激活的文件进行操作。 ⑵ 打开文件掌握数据转换方法程序编写方法 点击“文件/打开”,在文件选取框中选择文件 P1.ASM。 ⑶ 编辑修改文件 对打开后的文件进行编辑修改。 ⑷ 编译连接装载 单击“项目/编译连接装载”命令P1.ASM 文件汇编,编译/汇编后产生的结果出现在 QTH 集成开发环境信息窗口。如果程序存在错误,集成开发环境将自动关联到源程序的错误处,转到第⑶步操作;如果正确,则装入调试信息到仿真器可进行第⑹步。 ⑸ 装入代码到仿真器 使用[项目|装入调试信息]命令,将产生代码装入仿真器,此时 QTH 集成开发环境进入调试状态。QTH 集成开发环境的文件窗口 P1.ASM 的左侧出现了一列小圆点,表示当前程序计数器 PC。如图1-17所示。 图1-17 ⑹ 调试应用程序. 经过前面操作,为 QTH 集成开发环境调试应用程序提供了所有准备工作。您可以开始对源程序进行调试。 例1-2:多模块汇编语言源程序(使用项目管理方式开发应用程序) 多模块程序 AMPLE1.C,SAMPLE2.ASM,假定已存于 C:\QTH\C51和 C:\QTH\C51目录内,当建立项目时,项目文件也存放在该目录内。 ⑴ 建立新的项目文件 选择[项目|新建项目]命令,根据提示输入、设置以下项目: 在项目名称框中输入 SAMPLE,此时项目名称为 SAMPLE。 选择立即加入模块文件,表示在项目建立后将自动打开文件捡取框,供用户选择文件添加到项目管理器。 在项目属性项内将 C 编译器其它选项内选择 “NOREGPARMS” 控制项。 ⑵ 编辑修改文件 对打开后的文件进行编辑修改。 ⑶ 编译连接装载 使用[项目|编译连接装载]或热键 F4 命令对当前多模块文件编译/汇编,编译/汇编后产生的结果出现在 QTH 集成开发环境信息窗口。如果程序存在错误,集成开发环境将自动关联到源程序的错误处,转到第⑶步操作;如果正确,则装入调试信息到仿真器可进行第⑸步。 ⑷ 错误信息关联 文件经过编译/汇编后的结果显示于信息窗口,出现错误后错误与文件关联。在信息窗口中错误之处双击鼠标左键,可将错误与文件关联: 如果没有错误,可进入第⑸步操作。 如果出现错误,修改文件后重复进行第⑵步操作。 ⑸ 调试应用程序 使用[项目|装入调试信息]命令,将产生代码装入仿真器,此时 QTH 集成开发环境进入调试状态。QTH 集成开发环境的文件窗口的左侧出现了一列小圆点,表示当前程序的有效行,即此时存在相应的代码,键入 F8 跟踪运行键,程序运行到 main 函数的第一条语句,并在该行的左侧出现绿色的小手,表示当前的程序计数器 PC。到此,QTH 集成开发环境提供应用程序的所有准备工作。 1.2.8 断点 QTH 集成开发环境配合 QTH 系列仿真器,具有强大的断点功能:可以在编辑和调试状态下设置或清除断点,并且在退出集成开发环境时自动保存断点信息。 1.断点标记 QTH 集成开发环境的断点标记,根据系统状态和所处窗口类型,标记如下: 在编辑或调试状态下,源程序窗口内绿色小手——无效断点或临时断点,退出进不保存。 在调试状态下,源程序窗口内的红色小手——有效地址断点,退出时保存。 在反汇编窗口内设置的断点,标记为红色光——地址断点,退出时保存。 2.断点变化规律 在编辑或调试状态下源程序窗口内没有断点处设置断点,标记为绿色小手;再次设置断点,标记被清除。 在调试状态下源程序窗口内有效程序执行处设置断点,标记为红色空心小手,再次设置断点,标记被清除。 在调试状态下与源程序断点关联的反汇编窗口红色光带处设置断点,在反汇编窗口内清除断点,同时将源程序窗口断点标记清除;再次设置断点,反汇编窗口标记为红色光带,源程序窗口的对应行再次标记为断点行。 3.源程序文本上设置断点 ⑴ 编辑状态设置断点 当用户在编写源程序的过程中,根据调试需求,可以直接在源程序文本的任何地方设置或清除断点。如果设置了断点,将以绿色小手标记在源程序文本左侧的灰色状态栏内,断点属性为无效断点。当编译连接装载通过后,自动转化为有效断点,对于在源程序文本上设置的无效断点,系统退出时不保存。 ⑵ 调试状态设置的断点 在调试状态下,可以直接在源程序文本上设置断点(当文本左侧的灰色状态栏内时,表示当前程序为有效行)。设置后,断点以红色小手标记在文本左侧的灰色状态栏内;如果没有出现小圆点,则不可以设置有效断点。在编辑状态下设置的断点,通过编译连接后,如果预设的断点编译后是有效行,则断点标记为有效断点;如果不是有效行,则仍为无效断点。对于在源程序文本上设置的断点,系统退出的全部自动保存。 ⑶ 在反汇编窗口设置的断点 断点在反汇编窗口内以红色光带表示,可以任意设置地址断点,如果设置的断点与源程序有效地址关联,则与源程序相关联的地址处设置断点,在源程序窗口内出现红色小手。 图1-18 断点设置窗口 如果在源程序断点相关联的反汇编窗口红色光带处设置断点,将清除窗口内的断点光带,同时清除源程序断点标记;再次设置断点,反汇编窗口标记为红色光带,源程序对应行再次标记为断点。 ⑷ 断点设置窗口 通过断点设置可执行增加断点,删除断点等操作。设置断点属性——禁止或允许断点,断点的过点次数等。 1.2.9 具体调试方法 1.调试判位变量转移指令AD0:JB P1.3,AD0的方法。 不管用单步还是全速运行,碰到此句时,若P1.3≠0就停止执行,只有当P1. 3=0时,才接着向下执行,调试时没有硬件,本仿真系统提供了硬件接口,只要在主菜单View的下拉菜单中,选Hardware就弹出对话窗口,在窗口中选P1口,弹出P1口结构图,赋值使P1.3=0,此时再运行,程序就往下执行。 同样可调试,判位变量转移指令,AD0:JNB P1.3 AD0 ,只是赋值时,使P1.3=1。 2.调试外部中断程序 外部中断0(),请示端口为P3.2,中断入口地址为0003H,低电平有效。外部中断1(),请示端口为P3.3,低电平有效,中断入口地址为0013H。在编写程序时,只要在中断服务程序之前(或开头)安排两条语句,ORG 0003H, AJMP INTP0就行,INTP0为中断服务子程序的标号,当P3.2为低电平时, 执行到开外部中断指令,SETB EA;SETB EX1,程序就进入中断服务子程序。若P3.2不为低电平, 程序就不进入中断服务程序,调试时使P3.2为0的方法,是在主菜单View 的下拉菜单中,选Hardware,弹出对话窗口,在窗口中选P3口,对P3.2赋值为0 就行,同样可调试外部中断1()。 3.定时器中断调试方法 51系列有两个16位的定时/计数器,当用作定时器时,由单片微机内部的时钟脉冲,经12分频后,送加1 计数器, 当用作计数器时, 由外部提供计数脉冲,通过引脚P3.4(T0)和P3.5(T1)端口送计数器,端口出现,由“1”(高电平)到“0”(低电平)的负跳变脉冲时,计数器则加1,计数器不断加1计数到FFFF时,16 位计数器将由全“1”回归全“0”,计数器产生回“0”溢出脉冲,置位中断系统的中断请求标志位, 请求主机进行中断处理,即溢出中断。若用外部脉冲计数,所对应的引脚应有负跳变脉冲,有一个计一个,无脉冲就停止计数。若用内部时钟脉冲时, 就与外端口无关。 T0的中断入口地址是000Bh ,T1的中断入口地址是001BH。编程时,只要在中断服务程序之前或程序开头安排两条语句,ORG 000BH;AJMP CONT0 ,CONT0为中断服务子程序的标号,当程序执行SETB EA , SETB TR0 ,若有溢出时,程序就进入中断服务程序, 否则就不进入中断服务程序。若要溢出快,就将初值TL0 、TH0两单元的值设置大一些, 例如TH0的值设置为FF ,TL0的值设置为FE或FD,这样程序运行一次或两次就溢出,很好调试,若初值设置为0000,从0000到FFFF要运行65536次,若用单步运行就要很长时间。同样,可调试外部脉冲计数器。 4.下面以跳“彩灯左移”为例具体说明 ⑴ 单击“ 文件(File)/新建”,并编写程序,跳“彩灯左移”源程序,程序的功能是使接于P1口的8个指示灯顺次点亮,反复循环。 ORG 0000H /*指定下面所编的程序固化到ROM中的起始地址*/ LOP: MOV P1,#0FEH /*第1个指示灯亮*/ ACALL DEL /*调用延时子程序延时*/ MOV P1,#0FDH /*第2个指示灯亮*/ ACALL DEL MOV P1,#0FBH /*第3个指示灯亮*/ ACALL DEL MOV P1,#0F7H /*第4个指示灯亮*/ ACALL DEL MOV P1,#0EFH /*第5个指示灯亮*/ ACALL DEL MOV P1,#0DFH /*第6个指示灯亮*/ ACALL DEL MOV P1,#0BFH /*第7个指示灯亮*/ ACALL DEL MOV P1,#7FH /*第8个指示灯亮*/ ACALL DEL AJMP LOP /*反复循环*/ DEL: MOV R7,#0FFH DEL1:MOV R6,#0FFH DEL2:DJNZ R6,DEL2 DJNZ R7,DEL1 RET END ⑵ 单击“文件/另存为”保存文件。将刚编好的跳“彩灯左移”源程序存盘,取名为P1.AMS。 ⑶ 编译(汇编)。单击“项目(Project)/编译连接下载”系统自动编译程序。编译通过后,自动生成OBJ文件和列表文件,名字分别为P1.OBJ和 P1.LST。 ⑷ 进行各项设置, 设置为仿真调试;仿真模式为8052;频率为12M晶振;内数据存储器,内程序存储器。 ⑸ 打开数据存贮空间(Data dump)中的CPU内部数据RAM窗口、特殊功能寄存器窗口和外设P1端口。 ⑹ 调试运行。全速运行,用工具条中连续运行图标或快捷键F5。单步运行,用F8或工具条中单步图标。单步越过,用F10或工具条中单步越过图标。 调试时, 一般是先用全速命令运行一次, 看是不是程序功能达到了,若不是你想要的结果,就要反复修改程序,调试程序,调试时一般将几个方法综合使用,如先用单步运行程序,边运行边观察结果,开始时,用↑↓键将光带置于第2条指令处,一般是光标移过后才有结果。 当光带在第2条指令时,按一下F8,光带移动至第3条指令。此时P1 的内容应变为FE, 再按一下F8 ,光带移动到第19 条指令,调用延时子程序,再按一下F8,光带移动至第20条,此时R7 的内容应改变为FF ,再按一下F8 ,光带移动至第21条, R6单元中的内容应改变为FF,再按一下F8,光带不动,进入循环,再按F8,FF递减,一直要按住F8,让FF减为0,再跳出第一循环,然后进入第二循环,执行DJNZ R6,DEL1 ,R6-1后就又跳出DEL1,进入第一循环,一直循环下去,直到第二循环R6的FF减为0 时,再执行第23条,返回到第4条指令去执行。所以碰到循环, 若用单步就要很长时间来执行几条指令,解决的办法:一是用断点;二是将R6、R7的数据改为01H就行了,这里介绍改数字方法来跳出循环,只要R6,R7的值改为02H,单步运行后, 程序有两种结果:一是进入死循环, 说明循环部分有问题,修改程序后,重新仿照上面运行,一直到第二种情况出现为止。二是运行到第23 条返回指令,返回到第4条指令,此时,查P1中的值应为FE,还未变,再按一下F8,光带运行到第5条指令,此时P1的内容应为FD,再按下 F8 ,光带运行到第19条指令,又一次进入延时程序,如此反复,一止至P1中的内容依次出现FE、FD、FB、F7、EF、DF、BF、7F为止,第一遍 “彩灯左移”完成,只要第一遍成功了,第二遍就没有必要再调试了,到此为止,程序算是调试成功了,然后下载到芯片中,若硬件不出问题,应是最后结果,若此 “彩灯左移 ”不出现,最大的可能故障是硬件出了问题,排除硬件故障,直到成功。 第2章 软件实验 本章专门安排12个软件实验,全部由软件仿真调试,完全脱离仿真器, 避免了做软件实验中,学生可能损坏仿真器的问题。 通过这些实验程序的调试,使学生熟悉MCS-51的指令系统,掌握软件仿真方法;了解单片机软件设计过程;掌握汇编语言设计方法,以及怎样用软件仿真提供的调试手段来排除软件错误。 单片机产品开发,主要由硬件、软件两部分组成。 汇编语言是一种与硬件密切相关的语言,针对性、实用性很强,硬件不正确,软件编得再好也等于零。因此,在做软件实验时完全用软件仿真调试与硬件不打交道,当软件初步掌握后,再作硬件实验,每部分侧重点不同,做到重点突出,在做软件实验时,要求完全掌握编程方法,调试手段。在安排实验时,从简单到复杂、逐步深化。 2.1 数据传送实验 1.实验目的 掌握8031内部RAM和外部RAM之间的数据传送方法;掌握这两部分RAM存贮器的特点与应用,掌握各种数据传送方法。 2.实验内容 编写并调试一个数据传送程序,①将40~4FH 数据送到数据存贮器7E00~7E0FH中,②将数据存贮器7E00~7E0FH中的数据送到8031内部RAM 50~5FH中,③将以(R2,R3)为源RAM区首地址内的(R6,R7)个字节数据,传送到以(R4,R5)为末地址的RAM区。 3.实验程序参考图 BP1 BP2 图2.1 数据传送实验程序框图 4.调试方法 ⑴打开仿真软件中内部数据空间和外部数据空间,在40~4Fh数据单元中分别送数,例如:1,2,3,4,…等16个数据。 ⑵单步运行(断点设在BP2,程序运行至断点),检查外部RAM(7E00~7F0FH)数据是否与40~4FH数据一一对应。 ⑶如果程序运行不能进入某一断点,则应单步、断点分段检查程序, 排除错误直至正确为止。 5.思 考 试编写将外部的数据存贮区6030~607FH的内容写入 外部RAM 3030~307H中。 2.2 清零程序 1.实验目的 掌握汇编语言设计和调试方法,掌握清零程序编写方法。 2.实验内容 将7000H~70FFH的内容清零; 将30H~7FH的内容清零; 将(R2,R3)源RAM区首址内的(R6,R7)个单元中的内容清零。 3.实验程序框图 BP0 BP1 BP2 N Y BP3 图2.2 4.调试方法 单步运行程序到BP1,观察R0,7000H两单元内容是否为0 , 单步运行到BP2, 看DPTR,R0是否加1,再单步运行,看是否跳转到BP1,若是,说明第一循环没错,然后全速运行程序,观察7000H-70FF的内容应全为零,再用单元置数方法,将7000H-70FF的内容改为不全为0,再运行一次,若全变为零,说明程序全对, 同样,可调试后面两个程序。 5.思考 若将所有单元送06应怎样修改,若将各单元送0-FF程序应怎样修改。 2.3 数据转换实验 1.实验目的 掌握MCS-51汇编语言程序设计方法,掌握数据转换方法程序编写方法。 2.实验内容 编写并调试一个二翻十程序, 其功能为将40H,50H两单元中的二进制数转换为十进制数,并将转换结果存放在R4,R5,R6单元中。 3.实验程序参考框图 图2.3 4.调试方法 ⑴断点设在BP1,程序运行至BP1,检查40H、50H内容是否与输入值正确对应。 ⑵断点设在BP2,程序运行至BP2,检查R4、R5、R6 内容是否为二进制所对应的十进制转换结果。 ⑶程序连续运行,。 若有错误应改用单步或断点分段调试程序,排除软件错误,直至正确为止。 ⑷改动40H、50H中的内容。连续运行观察结果正确与否。 5.思 考 试编写一个功能和本实验类似的整数十翻二子程序。 2.4 拆字、拼字程序 1.实验目的 掌握汇编语言设计和调试方法,掌握拆字和拼字的程序编写方法。 2.实验内容 把7000H的内容拆开,高位送7001H低位,低位送7002H低位,7001H、7002H高位清零, 把7000H、7001H的低位相拼后,送入7002H中, 3.实验程序框图 BP1 BP2 BP3 图2.4 4.调试方法 单步运行到BP1,观察7000H和A单元中内容是否为68,单步运行到BP2,观察7001H单元中内容是否为6,单步运行到BP3,观察7002H单元中内容是否为8,若是,程序对,若不是,反复修改程序直到正确为止。 同样可调试拼字程序。 5.思考 怎样将多个单元中的内容拆开。 2.5 多分支程序(散转程序) 1.实验目的 掌握汇编语言的编辑和调试方法,掌握散转程序编写方法。 2.实验内容 编写程序,散转8031片内20H中的内容(00或01或02或03)。 3.实验程序框图 图2.5 4.调试方法 ⑴8031片内20H单元,用寄存器读写方法送入00,全速运行后,观察数码显示缓冲区的内容应“0”循环,即22H单元中内容应为C0,A中内容01应分别左移循环; ⑵当20H单元中送01时,应“1”循环; ⑶当20H单元中送02时,应“2”循环; ⑷当20H单元中送03时,应“3”循环。 5.思考 请编写一个用查表方法进行散转的程序。 2.6 时钟实验 1.实验目的 熟悉MCS-51中断过程和中断服务程序的设计方法、 查表指令和散转指令的功能和使用方法;掌握查表和散转程序的设计与调试。 2.实验内容 编写一个24小时时钟程序。 3.实验程序参考框图 BP2 BP1 BP3 图2.6 4.调试方法 ⑴断点设在BP1,按0~F键后,进入断点地址,检查ACC 内容是否与键值正确对应。 ⑵断点设在BP2,程序运行至断点,检查ACC 内容是否为键值对应散转入口地址高位。 ⑶断点设在BP3,程序运行至断点,检查ACC 内容是否为键值对应散转入口地址低位。 ⑷程序连续运行,按键0~F,即在显示器上显示,各自散转地址。 若有错误,应改用单步或断点分段调试,排除软件错误,直至正确为止。 5.思 考 若将0~F按键对应查表为1~16立方表(十进制),并在数码管上显示。程序怎样修改? 2.7 计数器实验 1.实验目的 掌握定时器T0、T1的方式选择和编程方法,了解中断服务程序设计方法, 进一步学会实时I/O程序的调试技巧。 2.实验内容 编写并调试一个程序,用定时器T0的定时中断控制软件计数器计数, 使计数器从0开始以1秒的速度加1计数,显示器实时地显示其计数值。 3.实验程序参考框图(见图2.7) 4.调试方法 ⑴ 断点设在BP1,程序运行到BP1,应进入中断服务程序,否则应检查T0初始化程序正确与否。 ⑵ 程序连续运行,显示器缓冲区从0开始加1显示。 若有错误应改用单步或断点分段调试程序,排除软件错误,直至正确为止。 5.思 考 若6位显示器计数值从999999减1计数,程序应怎样修改? (a)主程序框图 (b)定时器中断程序框图 图2.7 定时器实验程序 2.8 无符号十进制数加法实验 1.实验目的 掌握MCS-51汇编语言设计和调试方法。 2.实验内容 编写并调试一个双字节无符号十进制数加法程序, 其功能为将两个字节压缩BCD码(即4位十进制数)的加数和被加数写入由(R0)指出的内部RAM中, 并将这两个数相加,结果存放于(R1)指向的内部RAM中和显示缓冲器3E~39H中,并循环调用显示子程序,在显示缓冲区中看运算结果。 例如:被加数写入41H、40H单元,加数写入51h、50H单元, 运行程序结果写入52H、51H、50H中,则加法程序功能为: (41H)(40H)+(51H)(50H) 52H、51H、50H 3.实验程序参考框图(见图2.8) 图2.8 十进制数加法实验程序框图 4.调试方法 ⑴ 断点设在BP1,全速带断点运行程序,碰到BP1后,检查41H、40H、51H 、50H与送入值是否对应。 ⑵ 断点设在BP2,带断点(全速断点或慢速断点)运行程序,碰到BP2后,检查十进制数加法结果52H、51H、50H的内容是否正确。 ⑶ 程序连续运行,送入加数、被加数后,在显示器缓冲区中看运行结果。 若有错误改用单步或断点分段调试程序,排除软件错误, 最后送入几组不同参数来测试程序,直至正确为止。 5.思 考 若将8031内部RAM改用8155内部RAM, 应如何修改无符号十进制加法实验程序。 2.9 数据排序实验 1.实验目的 熟悉8031指令系统;掌握程序设计方法。 2.实验内容 编写并调试一个排序子程序,其功能为用冒泡法将内部RAM中n 个单字节无符号二进制整数从小到大的次序重新排列, 并将这一列数据从小到大依次序存贮在6000H为起始地址的单元中。 3.实验程序参考框 (见图2.9) 4.调试方法 ⑴打开仿真软件中的内部RAM窗口,在50H-59H单元中输入10 个任意排列原始数据。 ⑵单步运行程序,两数比较后第一个数大于第二个数则所在RAM位置交换。否则不变。 ③单步运行程序(或断点运行),检查50-59H 内容是否已经按从小到大次序排列。 ④连续运行,再打开仿真软件中外部存储窗口,查看6000H 内容是否有10个数据按从小到大次序排列。 ⑤程序运行如果不正确,则应分段检查程序, 用单步或断点方式调试程序,排除错误。最后修改软件初始值、交换五组数据测试程序的正确性。 Y N (a) 主程序框图 N Y N Y (b) 子程序框图 图2.9 数据排序实验框图 2.10 单字节BCD码除法实验 1.实验目的 掌握MCS-51汇编语言程序设计方法。 2.实验内容 编写并调试一个单字节BCD码除法程序,其功能为将由键盘输入单字节BCD 码被除数和除数,分别送40H、50H与显示缓冲器3EH、3DH、3AH、39H,并将这两个数相除,结果商存放在R2,余数存放在R3中,同时商送显示缓冲器3AH、39H。 3.实验程序参考框图(见图2.11) 图2.11 BCD码除法实验程序框图 4.调试方法 ⑴打开内部RAM窗口,在40H、50H送入任意两个数值。 ⑵运行程序,检查计算结果R2(商)、R3(余数)内容是否正确。 ⑶ 程序连续运行,再一次送入被除数、除数后验证运行结果。 若有错误应改用单步,断点分段调试程序,排除软件错误, 最后送入几组不同参数,来测试程序,直至正确为止。 2.11 查找相同数个数 1.实验目的 熟悉汇编语言编程。 2.实验内容 在7000H~700FH中查出有几个字节是零,统计“00 ”的个数并送显示缓冲区。 3.实验程序框图 Y N N Y 4.调试方法 用单步运行,分别看R0,R1,DPTR单元中内容是否与程序一致。 5.思考 要查找30-3F单元中的相同数个数的程序怎样编号。 第3章 硬件实验 3.1 P1口彩灯控制实验 1.实验目的 通过实验了解单片机最小系统;了解P1口作为输入、输出方式使用时,CPU对P1口操作方法。 2.实验原理及实验线路 8031P1口为8位准双向口,每一位可独立定义为输入、输出。CPU对P1 口的操作可以是字节操作,也可以是位操作。实验中P1口接8个发光二极管。编写程序, 通过P1口发光二极管(LED)状态改变情况,了解CPU对P1口操作指令。操作指令如下: 字节操作 从P1口输出数据指令(写) 从P1口输入数据指令(读) MOV P1, A MOV direct,P1 MOV P1, #dataH MOV A,P1 位操作 SETB P1.i MOV P1.i,C CLR P1.I MOV C,P1.i 实验线路,见图一或图二。 如图一,可见CPU 8031外围通过373扩展一块程序存储器2764,这就是常说的老三件,也就是8031组成的最小系统。在8031的P1 口接入发光二极管,由于负载能力不够,加八只三极管或用7407推动,P1口的各脚输出低电平时,发光二极管亮,简称为低电平有效。 3.实验内容 ⑴ P1口输出练习 ①编制程序使P1口8个发光二极管,同时灭,延时0.5S,同时亮,反复循环。 ② 发光二极管依次间隔0.5S点亮一只,反复循环。 ⑵ 编制P1口演示实验程序,使8个发光二极管0.5S(LED)每隔一个(或二个)右移(左移),循环点亮。 4.实验器材 组合最小系统板和驱动板、8彩灯板、+5V电源一台,仿真器一台或固化器一台。 5.实验程序参考框图如图3.1 图3.1 6.实验步骤 ⑴实验线路连接 板2764是将8031、373、2764老三件组合在一起,称为最小系统,其中地址线已连好,数据线也连好,也可用分立的器件一个一个的连,每一块板的使用方法在前面已讲了。P1口、P3口、P2口的P2.5、P2.6、P2.7包括数据口P0均有引出插座可外接。8031的复位电路、振荡电路均已连好,复位电路还加接了按键可随时复位系统。 先将组合最小系统板和驱动板、8彩灯板拼装好,且称为实验系统,然后按原理图一,在反面连接好线,反复检查,不要错线、漏线。连好线后,再在元件面用万用表Ω档检查,看在所连线的各腿与腿之间是否相通,检查无误后再进行下一步。 ⑵硬件好坏诊断 ①用瞬间短路法诊断硬件好坏。 接通电源, 用一根导线直接将P1.0-P1.7各腿依次对地(发光二极管亮时)或对+5V电源(发光二极管灭时)瞬间短路,若短接后,状态发生改变,亮变暗或暗变亮,说明输出线路是好的。 ②用仿真器诊断硬件好坏。 若有硬件仿真开发系统,连接好电源线和通信线,再将专用40 芯扁平线(一头40芯并排插孔,一头40腿象集成块一样的插座),一头接开发系统,一头插入组合板上的8031插座(不要8031集成块,注意不要插反),即8031的+5V(40脚)通过此插座及扁平线与开发系统的+5V相连,8031的地(20脚)通过此插座及扁平线与开发系统的地相连。此时的组合板就成为用户开发系统,插好后打开+5V电源,此时开发系统应显示闪动的P1,若无显示,赶快关闭电源,以免系统烧坏。再反复查硬件部分,可能的故障是电源接反,或有线短路。此时用万用表×1或×10 Ω档,查用户系统集成块的电源40脚与开发系统的电源5V是否相通,40脚与20脚之间应有一百多欧姆以上电阻。看是否有些数据线短路,反复查,反复试,直到好为止。然后进入调试界面,将光标跳到P1 口所在窗口,改变P1口对应的值为01,02,04,08,10,20,40,80或FE,FD,FB,F EF,DF,BF,7F对应的P1.0-P1.7指示灯应点亮,若一切都好,就可进行编程步骤。 若通信成功的情况下还不行,按以下四步骤检查:①按方法一还查一遍输出部分好否,②查40 芯扁平线,或换一根试一试,③状态未选准,④芯片未选准用Ctrl+E选准。 方法三 用下载式开发系统调试(相当于直接固话程序试)。 用以下测试程序, ORG 0000H MOV A,#0FEH LOOP:MOV P1,A ACALL DL RL A AJMP LOOP DL: MOV R5,#0FFH DL1: MOV R4,#0FFH DL2: DLNZ R4,DL2 DLNZ R4,DL1 RET P1.0-P1.7应顺次点亮,若不亮说明硬件有故障, 按原理图排除故障,固化方法分两种: 第一种,用ALL03和ALL07固化 固化步骤:在Dos状态下键入CD ALL03回车,再键入ACCESS 回车,出现总菜单1.Device,2.Gang-adaptor,3.Tester,4.Setup,5.File,6.Vtility,7.Quit。选1(Device)或2(Gang-adaptor)按回车,出现下拉菜单6项,第一项进入主菜单(Main Menu),第二项可擦除可编程只读存储器(EPROM),第三项电可擦可编程只读存储器(EEPROM),第四项串行可编程ROM,第五项顺序可编程ROM(BPROM) ,第六项CPU本身带ROM,第七项可编程逻辑器件。用↑↓键选择好你所要固化的芯片类型,选EPROM回车就出现下拉菜单,左边为企业名称(MFR),右边是对应的每一个企业所生产的芯片型号,用↑↓键选择好企业(芯片上已注明了),按回车,光带跳到右边的芯片型号,用↑↓键选择型号,按回车就直接进入主菜单(Main Menu)。 在此菜单中选 2 即键入 2 装载二进制文件或HEX文件到缓冲区(Load Bin or HEX file to buffer),右下角出现下拉菜单,装载文件名(File name) ,出现<B> in, < I>nter.HEX ,<M>otorola SHEX,选I后回车,出现File start seg.(0000) : 键入0000 回车后,出现没有被使用的,将被什么东西取代<1> 00 <2> FF <3> Don't care:选2后,出现Loading……OK! END ADDR: 若没有出现此装载成功信息就出现提示信息,排除一直至OK,再按ESC后返回主菜单,选P(或A)右边出现提示符 Ready to stunk,选Y后开始固化,相关数字开始变化,直到完成,提示OK,按ESC 回主菜单 ,按Q,入Y至总菜单,按ESC三次,按Q入Y后退出。 第二种在 ⑶ 程序编写与调试 这一步是本实验的关键一步,在硬件诊断无误的情况下, 一般是边编写程序边调试,也有些人将程序一次写好后,再上机调试,我认为这种方法不可取,因汇编语言实时控制太强了。最好的方法是:首先画一个整体流程图,分配好内部单元,划分好寄存器区间,然后将一部分一部分功能调试出来,再将各段功能程序连接起来,特别注意的是: 用汇编语言在PE下编好程序,并汇编通过, 汇编通过的程序只能说明你的汇编语法,语句的用法正确不正确,它不能判断你的程序功能正确不正确。若要决定程序功能对否,只有采取三种方法:一是硬件仿真调试;二是软件仿真调试;三是固化至芯片内上机试用。只有第三种才是最终的结果。但直接固化芯片,固化次数一多容易将芯片损坏,因而一般将第一种和第三种方法联合使用,即先硬件仿真调试好,再固化到芯片内上机试用,或者是第二种方法与第三种方法联合使用,即先软件仿真调试好,再固化到芯片内上机试用,下面分头介绍硬件仿真调试和软件仿真调试。 硬件仿真调试方法,在硬件诊断方法二的情况下,若硬件没有问题, 就可进入编程调试阶段了,这个阶段分5步。①编辑程序。按ESC进入主菜单,选PE若有旧文件,键入旧文件名(注意路径),按Enter,原来文件就显示在屏幕上, 若没有旧文件,重新新编就再按Enter,编辑屏幕就出现了,然后, 用全屏幕编辑指令进行编辑,(若不熟悉,请看有关书籍)文件编好后,按F3存盘,按了F3以后,下面光带上出现New file, 输入新文件名,按Enter,文件存好并回到主菜单;②汇编程序。在主菜单中选汇编项(Assemble),并按Enter,屏幕出现提示框,键入你所取的文件名,按Enter,再按Enter,提示框内提示没有错误(NO. error)。 若有错误就指出错误在那一条,并指出什么语法错误,然后你又回到PE状态去修改,反复进行,直到没有错误为止。程序通过后,按Enter回到主菜单。③装载程序。在主菜单中选装载项( Load program),按Enter出现提示框,输入文件名,后缀HEX(一定不能掉.HEX 不然会出错),按开发系统的复位键(红色钮),再按开发系统的PCDBG键,然后在PC机上按Enter ,会出现提示框,按提示框执行,若装载完毕,用Ctrl+S键切换到仿真状态1。④运行程序。(a)用F3修改PC值,即将PC值改成新编文件中ORG所确定的地址。若ORG为0000H就省这一步。(b) 置光标在程序开头第一句,再按F9,全速运行此程序。⑤看结果可用Ctrl+O,重新装入状态现场并刷新屏幕,屏上有四个窗口, 左边为程序显示窗口,右边三个,第一个是寄存器(Register)窗口,第二个是状态字(PSW) 窗口,第三个是存储空间窗口,第1.第二窗口可直接在屏幕上看,看第三个窗口的方法是 (a) 在开发系统上按复位键,再按PCDBG键,(b) 在PC机上按ESC键,回到主菜单,选RUN,按Enter,(c) 用Ctrl+m组合键切换到你所要的存储器空间。按一次Ctrl+m组合键,屏幕上有一长方形白色光标内的程序空间会改变。在IDATA、BIT、XDATA、CODE四个空间中循环,按组合键一次,改变一次。 IDATA── 表示CPU内部数据RAM,地址00-FFH。 BIT ── 表示CPU内部位寻址区。 XDATA── 表示CPU片外数据存储器,显示的内容按屏幕顶行的仿真模式确定。 CODE ── 表示用户程序存贮器空间, 显示内容按屏幕顶行的仿真模式确定 区域。 选定好你想看的存储空间,再键入你要看的存储单元,按Enter,你所看的内容就显示在上面。 若在运行之前,用以上方法选定存贮空间后, 运行程序就可直接在第三窗口观察结果,不用以上几步了。 运行后,若结果对,则程序调试成功。若不对,反复修改研究程序,再用以下方法进行一段一段地调试程序。 ①F8(单步)或Ctrl+F8(连续单步)。用单步运行键F8 或连续单步运行组合键Ctrl+F8,每按一次F8就执行一条指令,结果可在三个窗口中观察,哪一步的结果不对,你就查哪一步的原因,一直到结果对为止,若用连续单步,系统就自动一步一步地不断执行指令,按任意键即停。 ②设置断点方法。有时程序很长,用单步太慢, 就用设置断点方法运行调试程序,程序运行至你所设置的断点处,就自己停下来,这种方法使用在有部分程序已调好了想跳过去的场合,还有在循环、延时程序场合最合适。 设置断点方法: ● 使用↑↓键移动光带到要设置的断点处,按F2键,则DBUG就把光带处的命令地址作为断点记录下来,当用户欲设置的断点地址不在当前窗口内,可以先用Ctrl+G等键找到指定地址,再按F2键设置。 ● 欲设置的断点地址不在当前窗口内,可以直接用Ctrl+B命令设置,DBUG 询问地址,可以回答直接地址(例如 0A00),也可以回答地址标号,如此时用Ctrl +F7弹出标号窗口,再使用光标控制键浏览全部的标号,移动光带到目标行上,按 回车可以把光标带处的地址设为断点; ● 也可以在标号窗口内直接设置断点,Ctrl+F7键激活标号窗口,移动光带到目标标号上,按F2键,可以把光带处的标号地址设为断点。 设置断点应注意:不设置在跳转语句处和返回语句处。 ③光带标记法。按F4,程序运行至光带处停下。 此方法最简便易行,只要先将光带移动至你想停下来的语句,然后按F4, 程序从开始运行至光带处停下来。 下面以本实验中发光二级管,依此点亮一只,反复循环程序为例,说明怎样使用仿真器仿真调试和用软件仿真调试。 1.仿真器仿真调试方法 在用仿真器诊断硬件好坏的那种情况下,若没有出现问题,就可以进行第一步编程。在主菜单中选中PE,回车两次,进入全屏幕编辑状态,以下是P1口 彩灯LED循环左移程序 ,即彩灯从右边亮第一个,暗后,第一个左边的一个亮,一直下去,反复循环。 ⑴编程 ORG 0000H MOV A,#0FEH LOOP: MOV P1,A ACALL DL RL A AJMP LOOP DL: MOV R5,#0FFH DL1: MOV R4,#0FFH DL2: DLNZ R4,DL2 DLNZ R4,DL1 RET ⑵存盘。按F3后,在下面的光带上输入文件名,此文件取名为 6.AMS。 ⑶汇编。在主菜单中选汇编项,输入路径C:\DV598\和文件名6.AMS后,按两次回车,若没有错误就生成了6.HEX。 ⑷装载程序。在主菜单中选装载项,输入文件名6.HEX后,联机装载。 ⑸设置。将该系统设置为仿真状态1(I-PS U-RW),窗口不设置,因其均可在寄存器窗口中观察。 ⑹运行。先用F9全速运行一次,看运行结果是否和设计时相同。若不同就用单步运行,将运行光带置第二条,按一下F8(单步)光带运行到第三条,A中数据应为FE,再按一下F8,光带运行到第四条,P1中数据应为FE,再按一下F8,光带运行到第七条,进入延时程序。两重循环处理的方法是两种:一是将FF全改成01;二是用断点。这里用第一种方法,让大家了解循环程序的工作过程。这就要重新修改程序,按1.2.三步进行。然后用单步一直运行,这样就很快运行完了延时程序,又返回到第五条,再按一下F8,光带运行到第六条,A中数据左移,再按F8光带运行到第三条,这样一直运行,直到A左移8次后复原,整个程序运行了一遍。 2.软件仿真调试方法 下面按Franklin所讲方法调试该程序。 ⑴在文件项目中 编辑文件 (或打开以上文件6.AMS) ⑵在项目中建立新项目,增加新文件; ⑶汇编; ⑷设置;首先设置操作项,再设置窗口观察项,只打开主寄存器窗口和P1口状态图就行; ⑸调试;还是用单步运行,观察P1、A、R4、R5中数据变化情况与所编程序是否一致。 3.2 数码管显示 1.实验目的与要求 通过实验掌握数码管,显示数据的方法;熟悉有关元器件的使用方法。 2.实验原理及实验线路 图三中,74LS47是七段译码器。它是将BCD码翻译成七段驱动码,驱动数码管显示数,数码管为共阴普亮数码管,型号为LTS547R,BCD码由P1口的低四位输出,P3口作为位选口,P3.0对应左(右)边那块是首显示块,P3.5对应右(左)边的那块是末显示块。工作时,先送BCD码,再选位,使选中的数码管点亮,往复循环。 3.实验内容 ①左循环显示“1”,“2”,“3”,“4”。 ②右循环显示“1”,“2”,“3”,“4”。 ③先四个显示块显示1,2,3,4,1秒后四个显示块同时显示5,6,7,8。 4.实验器材 组合实验板最小系统,16脚插座,四块数码管,+5V电源一台,仿真器一台或固化器一台。 5.实验程序参数框图 如图3.2 6.实验步骤 ⑴ 实验板连接 将最小系统、四块数码管 、16脚插座板,按图拼接好,按原理图三连接好线, 检查无错后进行下一步。 ⑵硬件好坏诊断 ①用仿真器诊断硬件好坏, 方法是按3.1所讲,将此用户系统与仿真器连接好。在P1口送入01,再在P3口送入01有一个显示块应显示1,然后在P1口分别送02、03、04、05、06、07、08、09应分别显示2-9,此正确后,说明47接线无误,之后对P1口送08,显示出8来,再对P3口分别送01、02、04、08、10、20,每送一位8应移动一位,每一位要显示出8来, 不应缺少笔段。若缺少笔段就应检查,此步同时检查了P3口连线好坏,也检查了各显示块好坏。 ②用固化器固化程序诊断硬件好坏 用3.1所述方法固化如下程序(A)或(B)到2764中。 固化后插入2764插座,正常时应看到跳“8”现象,若没有跳“8”出现, 就应一步一步检查,停电检查和不停电检查均行。若什么显示都没有,一片黑。首先应检查供电正确与否,若供电正常还无显示,就应检查显示块是否正常,是共阴还是共阳,若设计是共阴电路,你使用的是共阳显示块肯定一片黑。若有显示而显示不正确,就要检查47是否坏,线路是否连接好,此时,就用万用表查应连线的各脚之间通不通,直到正常为止,固化检查的好处是一步到位,一但正常只要以后编的各种程序不错,运行就正常。 ⑶软件调试 ①仿真器上调试,用3.1所述方法,在DV598下,编辑──汇编──装载──单步,调试以上固化的源程序A,在寄存器窗口观察P1、P3 口的数据是否与所编程序所要送的数据相同,若同则程序成功,若不同,反复修改程序,直到完全正确为止。 ②仿真软件调试。 同3.1方法调试,观察P1、P3口的数据发送是否正确。 ACC.3=1? N Y 图3.2 ORG 0000H MM: MOV P1,#08H MOV A,#01H LOOP: MOV P3,A ACALL DL RL A JNB ACC.3,LOOP AJMP MM END 3.3 顺序控制 1.实验目的与要求 了解光电隔离器件在微机抗干扰措施中的应用及硬件设计方法; 掌握时间顺序控制器的工作原理。 2.实验原理与实验线路 顺序控制是工业自动控制系统中常见的一种控制方式。 所谓顺序控制是指按时序或事序规定工作的自动控制。 本实验中使用8031 P1.0-P1.3分别通过光电隔离后,用四只三极管,驱动四只继电器工作,为了便于观察继电器断开和闭合情况,分别在继电器常开、常闭触点上串接一发光二极管,继电器动作时,两只发光二极管指示常开、常闭触点工作情况,继电器工作状态一目了然。 实验线路如图四所示。 3.实验内容 ①编写与调试一个程序使每个继电器按顺序循环工作, 工作时间等于停止时间。 ②编写调试一个程序使每个继电器按顺序循环工作, 工作时间不等于停止时间。 ③用查表法编写程序实现②的功能。 4.实验器材 组合最小系统板和驱动板、继电器板、光耦板、开发系统一台、固化器一台、+5V 电源一台。 5.实验程序参考框图,如图3.3,此图是为了实验时方便,在实际应用中,与8031接口要加同向或反向器驱动,也有利于抗干扰。与继电器接口部份也要加三极管驱动,便于工作稳定和调试。 6.实验步骤 ⑴实验板连接。将组合最小系统板和驱动板、继电器板、光耦板拼装好, 按原理图四,连接好线,检查无误后进行下一步。 ⑵硬件好坏诊断 ①用瞬间短路法诊断硬件好坏。用一根导线分别将P1.0、P1.1、P1.2、P1.3对地瞬间短路,继电器应动作。若不动作分以下几种情况。第一,所有的继电器不动作,对于这种情况,首先应查电源的正负线是否连好,用万用 表测+12V、 +5V是否正常;第二种情况有个别继电器不动作,就要分别查对应的光耦、三极管、继电器,检查方法是先查光耦将P1的某一位对地瞬间 图3.3 短路,对应的三极管基极应有电压高低变化,光耦的工作过程是:光耦内部发光二极管的阴极为低电平时,发光二极管中通过一定值(5mA左右) 的电流时发出一定的光被光敏三极管接收使其导通,图四中的三极管基极为低电平,当发光二极管的阴极为高电平时,发光二极管熄灭,三极管载止,图四中的三极管基极为高电平。若三极管没有这种高低电平变化,说明光耦是坏的,换光耦。反之说明光耦是好的,就继续判断三极管的好坏,还是将P1口某脚对地瞬间短路,三极管集电极电压应有高低变化, 若没有说明三极管是坏的,换三极管,反之说明三极管是好的,继续查继电器4123,当三极管集电极为低电平时,继电器得电,应吸合,若不吸合说明继电器坏,换继电器,否则还查一下二极管是否击穿,一个一个元件判断检查直到全都正常为止。 ②用仿真器诊断硬件好坏。 方法是按3.1所述连接好线,改变P1口的数字为FE,FD,FB,F7 对应的继电器应动作,若不动作按①所述检查好线路,若线路正常就应检查40芯插座是否插好、扁平线是否完好、是否设置在仿真状态1、CPU设置对否一一检查直到完好为止。 ③用固化器,固化程序诊断硬件好坏。 用3.1所述方法,固化如下程序A.或B.到2764中 A B ORG 0000H ORG 0000 MAIN: MOV P1,#0FEH START: MOV DPTR,#TAB ACALL DEL MOV R2,#00H MOV P1,#0FDH MOV A,#00H ACALL DEL LOOP: MOVC A,@A+DPTR MOV P1,#0FBH MOV P1,A ACALL DEL ACALL DEL MOV P1,#07H CJNE R2,#04H,LOOP1 ACALL DEL AJMP START AJMP MAIN LOOP1: INC R2 DEL: MOV R4,#0FFH INC A DEL1: MOV R5,#0FFH AJMP LOOP DEL2: DJNZ R5,DEL2 TAB: DB 0FEH,0FDH,0FBH,07H DJNZ R4,DEL1 RET 固化好后,插入2764插座中应看到继电器顺序动作,若继电器不动作, 按本实验①所指的方法排除故障直至完全正常为止。 ⑶软件调试 ①在仿真器上调试。 首先调试③中A.程序,延时太长若用单步调试就要很长时间, 为了节省时间,先在PE状态下将源程序的两个0FF均改成01,然后汇编,装载,用单步调试, 在寄存器窗口中P1口的值应分别变化为FE,FD,FB,F7。 ②软件仿真调试。 同3.1的方法。 3.4 8031与8155接口扩展与数码管显示实验 1.实验目的与要求 通过实验掌握单片机在输入输出口线不够用时,怎样扩展接口的方法。 熟悉8155芯片性能;掌握其编程方法。 2.实验原理及实验线路 8155芯片内具有256个字节RAM、2个8位、1个6位的可编程I/O口和一个14位计数器与MCS-51单片机接口简单,价格低是应用较广泛的芯片,特别采用8155 并行扩展口构成键盘显示电路。图五中AD0-7为地址数据总线,8031和8155之间的地址、数据命令状态信息都通过AD0-7传送;为片选信号, 低电平有效, IO/ 、I/O口和RAM/IO为选择线。当IO/=0,=0时,CPU选择8155的RAM读写。AD0-7上地址为RAM单元地址;当IO/=1、=0时,CPU选择8155的I/O口读写。AD0-7上地址为I/O口地址;为读选通信号,低电平有效,为写选通信号,低电平有效,ALE为地址锁存信号输入线,ALE的下降沿,将CPU输出到AD0- 7 上,输出的地址信息及、IO/的状态都锁存到8155内部寄存器。8155有三个并行口及256个内部RAM和一个定时器,PA口,PB口,PC口可编程为输出或输入口,本实验将PA作为数码管的数据口,由于负载能力不够,加74LS240作为驱动电路。PB 口作为位选择口,由于负载能力不够,外接74LS04作为驱动电路。 8031的 P2.7口线作为8155选片端,P2.0作为IO/RAM选择线,根据线选法原理,8155端口地址可计算如下,因8155在=0时有效,所以P2.7=0,P2.0 接IO/RAM脚,P2.0=1时为I/O口,P2.0=0 时为内部RAM。 P2.7 P2.6 P2.5 P2.4 P2.3 P2.2 P2.1 P2.0  0 1 1 1 1 1 1 1   命令口: 7F00H 定时器低8位:7F04H PA口 7F01H 定时器高8位:7F05H PB口 7F02H PC口 7F03H P2.0=0时,内部RAM地址为7E00H-7EFFH。 本实验中8155编程为A口、B口输出,C口输入,根据命令字定义,可算得命令字为03H,所以8155初始化程序为 MOV DPTR,#7F00H MOV A,#03H MOVX @DPTR,A 注意 : 若不初始化8155就不工作。 从图五中可见,8155 PB口作为数据口,向显示块送出驱动码,由于驱动能力有限,外加74LS240驱动,PA口作为显示块的位选口,每一条口线对应一位显示块, 也外加了74LS04作为驱动,显示器件为七段共阴高亮显示块,显示块可用到八位,若还觉得不够就用8255。 3.实验内容 ① 编写并调试出一个实验显示子程序; ② 用子程序调用方法显示1 、2 、3 、4 、5、6; ③ 首先数码管全暗,然后左移依次显示1、 2 、3 、4、5、6; ④ 首先数码管全暗,然后“8”依次左移,即跳“8”。 4.实验器材 组合最小系统板、14脚插座板、20脚插座板、六位数显板,+5V电源、仿真器一台或固化器一台。 5.实验程序参数框图,如图3.4 6.实验步骤 ⑴线路连接:将组合最小系统板、14脚插座板、20脚插座板、六位数显板,按图五连好线,检查无误后,再诊断硬件的好坏。 ⑵硬件好坏诊断 ①用仿真器诊断硬件好坏。 按3.1所述,将用户系统与仿真系统连接好后,在仿真状态下, 将存储空间调到7F00,然后在7F00单元写入03,在7F01单元写入01,在7F02单元写入C0,对应的左边或右边显示块,应显示“0”,再分别改变7F01单元为02、04、08 对应的显示块中显示的“0”应右移动。或左移,若没有出现上述现象,就断开电源, 用万用表分别查各集成块应连导线的每腿之间是否连通,一腿一腿进行直到排除故障为止,若线连接没有问题,就检查仿真器是否坏,40芯扁平线是否好,状态是否设置正常,直到一切正常为止。 ② 用固化器固化程序诊断硬件好坏。 程序为本节第七项所列子程序 固化好后,应出现跳“8”现象,若不出现,检查硬件直至完全正常为止。 ⑶软件调试 ①在仿真器上调试。 调试下面显示程序,通过该程序调试过程,你就完全了解, 查表指令的全部意义及查表取数的规律,就可完全掌握查表指令的使用方法,因而全部采用单步调试方法。为了节省时间将延时子程序的时间常数在PE状态下全部改为01,即将23行的02改01, Y 图3.4 然后汇编、装载、运行调试,观察每一步的参数改变应严格按指令执行,当执行1-5行时,数1-4应分送各个单元;(若为六个显示块就应加两行使数到6)当执行第6行时,光带应跳过第7行执行第8行,79应送到R0,执行9-12行后,数据01应送到7F01单元,执行第13-17行后, 查得所得数据F9应送到7F02单元,执行18行延时,延时后,R0单元加1,20-23行完成判断4个显示块中的数是否都送完了,送完了,第一轮结束,没完继续送完为止, 若显示块是6块ACC.3就改为ACC.5,此段程序运行结果是显示1,2,3,4。 ②软件仿真调试。 步骤同实验一。只是观察的窗口增加,外部数据存储空间7F00和内部RAM空间综合利用各种调试手段观察每个单元内容是否与所编程序相符就行。 7.子程序 1. ORG 0000H 2. MOV 79H,#01H 3. MOV 7AH,#02H 4. MOV 7BH,#03H 5. MOV 7CH,#04H 6. MAIN:ACALL DIR 7. AJMP MAIN 8. DIR: MOV R0,#79H 9. MOV R3,01H 10. MOV A,R3 11. LD0: MOV DPTR,#7F01H 12. MOV @DPTR,A 13. INC DPTR 14. MOV A,@R0 15. MOV A,0DH 16. MOV A,@A+PC 17. DIR1:MOVX @DPTR,A 18. ACALL DL1 19. INC R0 20. MOV A,R3 21. JB ACC.3,LD1 23. RL A 24. MOV R3,A 25. SJMP LD0 26. LD1: RET 27. DSEG: DB 0C0H,0F9H,0A4H,0B0H,99H 28. DSGE1: DB 92H,82H,0F8H,80H,90H 29. DSGE2: DB 88H,83H,0C6H,0A1H,86H 30. DSGE3: DB 8EH,0BFH,8CH,0E3H,0FFH 31. DL1: MOV R7,#02H 32. DL: MOV R6,#0FFH 33. DL6: DJNZ R6,DL6 34. DJNZ R7,DL RET END 3.5 键盘、数码管显示综合实验 1.实验目的与要求 通过实验掌握8155键盘、显示器的接口方法; 掌握键盘子程序调试方法,掌握按一个键并将键值显示出来的编程方法,这是诊断硬件、测试硬件、产品开发、软件编程必须掌握的方法。 2.实验原理及实验线路 实验原理同3.4实验线路如图六。从图可见, 只是在图五的基础上加了24个按键,(用时可任选几个按键板有4、8、16三种)而且按键和位选口合用PA口,这是计算机中常用的方法,并称为分时使用同一资源,节省外设,特别要注意这一技术。 3.实验内容 ① 编写并调试出一个键盘实验子程序; ② 用子程序调用方法,分别调用键盘子程序和显示子程序,将按一个键的键值(0-F),在数码管上显示出来,依次显示和定位分别显示都行。 4.实验器材 组合最小系统板、14脚插座板、20脚插座板、六位数显板、按键板,开发系统一台或固化器一台、+5V 电源一台。 5.实验程序框图 如图3.5 6.实验步骤 ⑴线路连接 按图六将组合最小系统板、14脚插座板、20脚插座板、六位数显板、按键板拼装好,并按图六连好每条线,检查无误后,进行下一步。 ⑵硬件好坏诊断 由于键盘电路比较特殊,按键有不有效既牵涉到硬件又牵涉到软件, 要软硬件综合考虑,一般的方法是先用万用表欧姆档测量一下,线是否连好,若连好了,就编一段测试程序,仿真测试或固化测试均行,下面分别叙述。 ①仿真调试 在PE状态下输入以下程序 ②固化调试 按3.1 的方法固化后,插入2764插座,按0-F键数码管应有显示。 N Y N Y 图3.5 注意:以下程序只用了两行八列十六个键,要想成功运行还要加入3.4的显示子程序。 ORG 0000H START:MOV DPTR,#7F00H MOV A, #03H MOV @DPTR, A MOV R0, #30H MOV @R0, #00H JUMP: ACALL KEY1 AJMP JUMP KEY1: ACALL KS1 JNZ LK1 ACALL DIR AJMP KEY1 LK1: ACALL DIR ACALL DIR ACALL KS1 JNZ LK2 ACALL DIR AJMP KEY1 LK2: MOV R2,#0FEH MOV R4,#00H MOV A,R2 LK3: MOV DPTR,#7F01H MOV @DPTR,A INC DPTR INC DPTR MOVX A,@DPTR JB ACC.0,LK4 MOV A,#00H AJMP LK1 LK4: JB ACC.1,NEXT MOV A,#08H AJMP LKP LKP: ADD A,R4 PUSH ACC LK5: ACALL DIR ACALL KS1 JNZ LK5 POP ACC RET NEXT:INC R4 MOV A,R2 JNB ACC.7,LATE RL A MOV R2,A AJMP LK3 LATE:AJMP KEY1 DIR: MOV DPTR,#7F01H MOV A,#80H MOVX @DPTR,A MOV DPTR,#TAB MOV A,@R0 CPL A MOV DPTR,#7F02H MOVX @DPTR,A ACALL DEL RET TAB: DB 3FH,06H,5BH,4FH DB 66H,6DH,7DH,07H DB 7FH,6FH,77H,7CH DB 39H,5EH,79H,71H DEL: MOV R6,#02H DEL1:MOV R5,#250 DEL2:DJNZ R5,DEL2 DJNZ R6,DEL1 RET KS1: MOV DPTR,#7F01H MOV A,#00H MOVX @DPTR,A INC DPTR INC DPTR MOVX A,@DPTR CPL A ANL A,#0FH RET END 3.6 A/D转换 1.实验目的与要求 了解ADC0809的工作原理;掌握单片机与ADC0809接口原理;熟悉CPU中断方式和查询方式读取A/D转换结果的程序设计方法。 2.实验原理及实验线路 ADC 0809是常用的将八路模拟电压转换成数字信号的集成芯片。ADC 0809 能与CPU直接接口,如图七所示,A2 、A1 、A0三腿可接8031 的P2.2、 P2.1 、P2.0,(也可接其它腿),由这三腿可译码成000 -111八路输入模拟信号IN0-IN7,当选中一路,且在该路输入0-5V连续变化的模拟电压时,可得到00-FF的数字信号,也就是说模拟电压在0-5V变化时,数字信号在00- FF之间变化。 AD转换结束时,EOC端出现高电平,经反向后与/INT1相连,CPU用中断方式读取A/D转换结果。当EOC经反向或不反向后与P1.3或其它脚相连时,CPU 可用查询方式读取A/D转换结果。 AD0809的片选信号由P2.6提供,P2.6经过74LS02 或非门与 、信号相“或”后,分别接至9与6、22脚,读信号由9脚控制,9脚是高电平有效,因而 P2.6应为低电平,才能选中ADC0809,因此可计算出片选地址为: P2.7 P2.6 P2.5 P2.4 P2.3 P2.2 P2.1 P2.0  1 0 1 1 1 1 1 1   所以0809的地址为DFFF。 对应于0通道 P2.2、 P2.1、 P2.0均为零,所以0809的地址为B8FF。 对应于8通道 P2.2 、P2.1、 P2.0均为一,所以0809的地址为BFFF。 本实验A、B、C均接地,只用0通道、模拟信号就应接IN0,0809的地址为BFFF,用B8FF也行,0809内部设有时钟信号,由8031的 ALE提供,实验线路如图七所示。 本实验还配备了0804单路AD转换板,如图八所示,0804和0809 均属同一个系列,工作原理相同,区别只在于0804是单路,0809是八路。 3.实验内容 ①用中断方式编写并调试出一个程序,将转换结果存于30H; ②用查询方式编写并调试出一个程序,将转换结果存于30H; ③用调用显示子程序方法,将转换结果在显示块上显示出来。 4.实验器材 组合最小系统板、14脚插座板、AD-DA综合板,仿真器一台、固化器一台、电源一台。 5.实验程序参数框图 中断方式 N 延时47H次完否? Y 中断服务程序 6.实验步骤 ⑴线路连接 将板拼装好,然后按图七连接好线,注意的是AD-DA综合板上同时放置了与非门74LS02、A/D转换0809、D/A转换0832,集成运算放大器741 集成块,板上可分别做A/D和D/A转换实验,也可合并做A/D、D/A综合实验、0832与0809之间的数据线已经连好,且有外接插孔,其它所有各脚都有插孔,需要自己连接。本实验只用 0809 、74LS02就行,将所有线连接好,检查无误后,可进行下一步。 ⑵硬件好坏诊断 该实验只能靠测试来检查硬件电路的好坏,如果电路连接正确无误的话,A/D转换最终是可以实现。 ⑶软件调试 该实验只能用仿真器来调试,仿真器也不能看出实时转换结果,只能是给定一个模拟电压(调一次输入电压)运行一次程序看一次结果,结果有变化,即为调试成功。 ①中断方式源程序 ORG 4000H AJMP MAIN ORG 4013H AJMP INT1 MAIN:MOV IE,#00H MOV DPTR,#00H MOV @DPTR,A L2: SETB EA SETB EX1 MOV R7,#47H L1: DJNZ R7,L1 CPL EA CPL EX1 AJMP MAIN INT1: MOV DPTR,#0BFFFH MOVX A,@DPTR MOV 30H,A RETI ②查询式源程序 ORG 4000H AJMP MAIN MAIN:MOV P1,#0FFH MOV R7,#47H LL: DJNZ R7,LL MOV DPTR,#0BFFFH MOVX @DPTR,A MOV C,P1.5 L1: JNC L2 MOV C,P1.5 AJMP L1 L2: MOV DPTR,#0BFFFH MOVX A,@DPTR MOV 30H,A AJMP MAIN 注意:图七、图八都是用的中断方式,要用查询方式,就要将接在8031,13脚的那根线接到8031的6脚 3.7 D/A转换 1.实验目的与要求 了解DAC 0832基本工作原理;掌握DAC 0832与单片机接口设计方法。 2.实验原理与实验线路 DAC 0832有数据锁存器、选片、读、写控制信号线, 故可以和单片机直接接口,DAC0832是电流型输出,使用运算放大器,将电流输出转换为电压输出。 当数字量输入在00~FF范围变化时, 电压的输出量有两种形式:一种是单极性输出,电压的输出量为0~+XV或0~-XV;另一种是双极性输出,电压的输出量为±XV,本实验只用单极性。 电路如图九所示,0832片选信号 为低电平有效,直接接P2.7,即P2.7为低时选中DAC 0832,据P2.7=0 可算得DAC 0832 地址为7FFFH。、同时与DGND 连接,与8031的连接。这样8位DAC寄存器始终处于导通状态, 因此当数据从数据线上由选通后输入寄存器时,便直接通过8位DAC寄存器,并且由8位D/A 转换器进行D/A转换。因此,此电路为异步输出结构方式。DAC 0832 内部没有参考电压,8 脚 VREF单独接参考电压也行,直接接+5V也行,但应注意8脚接负的参考电压, 输出为正电压。8脚接正的参考电压,输出为负电压。由于DAC 0832 具有数字量的输入锁存功能,故数字量可以直接从P0口送入,执行下面几个指令就能完成一次 D/A转换。 MOV DPTR, #7FFFH MOV A, #40H MOVX @DPTR, A 3.实验内容 ①编写并调试出一个输出方波的程序。 ②编写并调试出一个输出阶波的程序。 ③编写并调试出一个输出三角波的程序。 ④编写并调试出一个输出锯齿波的程序。 4.实验器材(同实验六) 5.实验程序参考框图 6.实验步骤 ⑴线路连接,按图九连好线。 ⑵硬件好坏诊断。 ①该实验在连线判别无误时,可用固化法来诊断硬件好否, 固化后用示波器在插座741第6脚处观看 方波 阶梯波 N 16次循环到否? Y ORG 0000H LOOP: MOV DPTR,#7FFFH MOV A,#0FFH MOVX @DPTR,A ACALL DEL MOV A,#00H MOVX @DPTR,A ACALL DEL AJMP LOOP DEL: MOV R7,#0FFH DEL1: MOV R6,#0FFH DEL2: MOV R6,DEL2 DJNZ R7,DEL1 RET ②用仿真器测试 将实验系统与开发系统连接好后,在PC机上改变7FFF单元内容为00和FF, 用万用表测试741第6脚电压,送00时,电压应为0V,送FF时,电压应为最大(10V)。 3.8 A/D与D/A综合实验 1.实验目的与要求 了解A/D转换与D/A转换的综合使用方法;掌握与单片机8031 的接口设计方法;掌握A/D转换与D/A转换的编程方法;了解A/D转换与D/A转换之间的数据处理方法。 2.实验原理与实验线路 本实验使用的是ADC 0809和DAC 0832两集成块,如图十所示,原理同3.6、3.7, 这里再不赘述,虽注意的是这两种转换联合使用时,就可以很方便地进行数据处理,在进行控制时就可很方便地分别进行P调节、PI调节、PID调节等等,这里面学习的东西最多,是微机控制中难度最大的部分,专门有这方面的专著和论文,如有兴趣可作专题研究和实验。本实验还配置了实验板ADC 0804和DAC 0832组合板,如图十一所示,可提供单路转换实验。 3.实验内容 ⑴编写一个程序,将0~5V线性变化的电压,转换成0~10V 线性变化的电压输出。 ⑵进行PID调节后输出。 4.实验器材 组合最小系统板、AD-DA综合板、电源一台、仿真器一台或固化器一台。 5.实验程序参考框图 6.实验步骤 ⑴实验板连接。 按原理图十连好线,检查无误后,可进行下一步。 ⑵ 硬件好坏判断。 可仿照3.6、3.7 分别进行测试,调试完全正常后,可进行编程调试。 ⑶ 软件调试。 ①仿真器上调试,编好程序后,运行程序,然后用万用表在输出插孔测量741第6脚的输出电压是否与你所编程序相同,或每次运行后看有关单元的值是否改变,反复修改程序,反复运行调试,直到完全符合要求为止。 ②软件仿真调试。 方法步骤同3.6,观察各单元内容变化情况与所编程序相同就行。 → 第4章 89C51系列实验 89C51芯片是目前应用较广、 价格较低的芯片之一, 它的好处是指令完全与8031一样,脚与8031完全兼容,而且内部带了4K EPROM, 地址从000-FFF,这个容量大约可固化二仟条左右的汇编语句,这么大的容量一般中小控制系统完全足够了,而且还可进行加密,由于有这些优点, 应用就比较普遍, 而对于大系统也可用此芯片作CPU,外部再扩展EPROM, RAM(或EROM)均行,89C51内部ROM用完了,系统会自动执行外部存储器中的内容,省去了用8031还要考虑加密的问题。若系统较大,外围芯片可用PSD系列器件,这样一个产品用两片芯片就行了,而且CPU可加密,PSD 也可加密,两道密码,让仿制者没可乘之机。基于这些考虑将89C51安排了五个实验, 若将这五个实验做完了,开发一个产品的主要过程及方法都知道了,而且实验内容均是实际产品中常用到的内容。若全部掌握,就完全可以独立开发单片机产品了。 4.1 顺序控制 1.实验目的与要求 通过实验了解单片机最小系统;了解P1口作为输入、输出方式使用时,CPU对P1口操作方法;了解光电隔离器件在微机抗干扰措施中的应用及硬件设计方法;掌握时间顺序控制器的工作原理。 2.实验原理及实验线路 89C51 P1口为8位准双向口,每一位可独立定义为输入输出,CPU对P1 口的操作,可以是字节操作,也可以是位操作,操作指令如下 字节操作 从P1口输出数据指令(写) 从P1口输入数据指令(读) MOV P1,A MOV direct,P1 MOV P1,#DataH MOV A,P1 位操作 SETB P1.i MOV P1.i,C CLR P1.i MOV C,P1.i 本实验的顺序控制是工业自动控制系统中常见的一种控制方式。 所谓顺序控制是指生产机械或生产过程按规定的时序或事序工作的自动控制。 本实验中使用89C51 的P1.0-P1.3分别通过光电隔离后, 用四只三极管驱动四只继电器工作,为了便于观察继电器断开和闭合情况,分别在继电器常开,触点上串接发光二极管,继电器动作时,发光二极管指示常开、常闭触点工作情况,继电器工作状态一目了然,实验线路如图4-1。 3.实验内容 ①编写与调试一个程序使每个继电器按顺序工作, 工作时间等于停止时间,反复循环。 ②编写与调试一个程序使每个继电器按顺序工作,工作时间不等于停止时间,反复循环。 4.实验器材 40脚CPU插座板、三极管驱动板、继电器板、光耦板、固化器一台、+5V电源一台。 5.实验程序参考框图 N Y ⑴线路连接 先按图将组合实验板拼装好,并称为实验系统,再按原理图4-1, 连接好每一根线,此图是为了实验时方便,在实际应用中,与8031接口要加同向或反向器驱动,也有利于抗干扰。与继电器接口部份也要加三极管驱动,便于工作稳定和调试。注意原理图4-1中的各脚与线路图中的各脚不能搞错,继电器线圈的两脚要判断准,判断方法是用万用表×1或×10档测量,有阻值的两脚为线圈的两脚,其它三个脚一个为公共脚, 公共脚与一脚之间电阻为0时,为常闭触点,公共脚与另一脚电阻为无穷大,为常开触点, 其它的板子与原理图差不多,连接好线后可进行下一步。 ⑵硬件好坏诊断 ①用瞬间短路法诊断硬件好坏,将 P1.0 、P1.1 、P1.2 、P1.3 分别对地瞬间短路,四个继电器应动作,若不动作可分别查光耦、三极管、继电器等,按键部分检查可分别将各个按键按一下,再用万用表测量各脚电压应有高低变化,若不变化,可分别检查各个元件直到一切正常为止。 ②用固化器固化程序诊断硬件好坏,根据经验89C51的开发,最好是软件仿真固化调试,在使用仿真器开发 P0 口与 P2 口时的仿真总不理想,有时仿真不出来 ,不用仿真器开发起来也比较方便,因89C51可反复固化,且不要擦除。是一个较理想的芯片。 编程后,固化下列程序 ORG 0000H MOV A,#0FEH LOOP:MOV P1,A ACALL DL RL A AJMP LOOP DL: MOV R5,#0FFH DL1: MOV R5,#0FFH DL2: DJNZ R4,DL2 DJNZ R5,DL1 RET 固化好后插入40芯插座,注意不要插反, 然后通电,四个继电器应顺序动作。若不动作分别检查光耦、三极管、继电器、振荡电路、复位电路等,直到正常为止。 89C51的固化方法: 89C51的固化方法有两种设备,一种是ALL03或ALL07;一种是比较简单便宜的专用设备,下面介绍ALL03或ALL07的使用方法, 用ALL03或ALL07,两个操作大同小异,下面以ALL07为例加以说明,在DV5 98下,编辑、汇编好程序,取名并存好文件,然后再连接好固化系统, 具体连接见使用说明书,连接好固化系统后,启动PC机在DOS状态下,键入CD PROG回车, 再键入Access回车,出现总菜单:1.Device 、 2.Trster 、 3.Steup 、 4. File 、 5.Utilit y 、 6.Quit。 用→、←键,移动红色光标,选1,回车,出现下拉菜单0-6, 用↑↓键移动红色光标到5,回车,又出现下拉菜单,用↑↓移动红色光标选02, 右边出现元件型号,回车,红色光标到右边框内,用↑↓键移动光标到AT89C51, 回车,出现主菜单,上面部分选项用数字键,下面选项用字母键,当键入2时,出现四个窗口, 在右下窗口中出现File name(文件名),键入路径和文件名,若在DV598下编的文件,就键入C:\dv59 8\文件名.HEX,回车,出现<B>in、<I>nter HEX?,键入I,接着出现<1> Don't care 、<2>00 、 <3>FF,意思是没有使用的单元用0取代还是FF取代,键入3 , 出现Load address,即装载的HEX文件的起始地址,键入0回车(注意此地址应与所编文件的ORG所指地址一致)。出现OK,若不出现OK会指出原因,然后按ESC到主菜单, 再在主菜单中选P或A固化程序,选A后,右窗口出现四项,Y所有位加密,0不加密,1加密1, 2加密1与2,此时在固化器上插好89C51芯片,选Y加密固化, 若出错,会提示错误。 ⑶软件仿真调试,同3.1 4.2 数码管显示实验 1.实验目的与要求 通过实验掌握89C51数码管显示电路的设计方法与编程方法。 2.实验原理及实验线路 图4-2中P0口,经74LS240 驱动后作为数码管数据口,P2口经过74LS04反向与驱动后作为位选口,4位共阴数码管,动态扫描方式显示数据、线路简单、稳定可靠。 3.实验内容 ①编写并调试出一个显示子程序; ②用子程序调用方法,显示1,2,3,4; ③首先数码管全暗,然后左移依次显示1,2,3,4; ④首先数码管全暗,然后8依次左移,即跳“8”。 4.实验器材 40脚CPU插座板、20脚插座板、14脚插座板、数码显示板、+5V电源、固化器一台。 5.实验程序框图 见图4.2 6.实验步骤 ⑴线路连接 将40脚CPU插座板、20脚插座板、14脚插座板、数码显示板拼装好或在4.1组合实验板下边,加上20脚插座板、14脚插座板、数码显示板就形成了本实验的实验系统,按原理图4-2 连接好线,检查无误后,可进行下一步。 ⑵硬件好坏诊断 固化下列程序到89C51芯片中 ORG 0000H MOV P0,#80H LOOP: MOV A,#01H LOP: MOV P2,A LCALL DEL RL A JB ACC.3,LOP SJMP LOOP DEL: MOV R6,#0FFH DEL1: MOV R7,#0FFH DEL2: DJNZ R7,DEL1 DJNZ R6,DEL2 RET 固化后插入40腿插座中,应出现跳“8”现象,若不出现,检查硬件直至完全正常为止。 Y N 图4.2 4.3 键盘、数码管显示综合实验 1.实验目的与要求 通过实验掌握89C51键盘、显示器的接口方法;掌握按键并将键值显示出来的编程方法。这是诊断硬件,测试硬件,产品开发、软件编程必须掌握的方法。 2.实验原理及实验线路 实验原理与4.1同,实验线路如图4-3。 3.实验内容 ①编写并调试出一个键盘子程序; ②用子程序调用方法,分别调用键盘子程序和显示子程序,将按一个键的值(0~F),在数码管上显示出来,依次显示和定位分别显示都行。 4.实验器材 组合实验板、编程器一台、电源一台。 5.实验程序框图(同51本实验) 6.实验步骤 ⑴线路连接 按图将组合实验板拼装好,按原理图4-3连接好每一条线, 检查无误后可进行下一步。 ⑵固化以下程序 按键显示 ORG 0000H FUMP: ACALL KEY1 AJMP FUMP KEY1: ACALL KS1 JNZ LK1 ACALL DIR AJMP KEY1 LK1: ACALL DIR ACALL DIR ACALL KS1 JNZ LK2 ACALL DIR AJMP KEY1 LK2: MOV R2,#0FEH MOV R4,00H MOV A,R2 LK3: MOV P2,A MOV A,P3 JB ACC.0,LK4 MOV A,#00H AJMP LKP LK4: JB ACC.1,NEXT MOV A,#04H AJMP LKP LKP: ADD A,R4 PUSH A LK5: ACALL DIR ACALL KS1 JNZ LK5 POP A RET NEXT:INC R4 MOV A,R2 JNB ACC.3,LATE RL A MOV R2,A AJMP LK3 LATE:AJMP KEY1 KS1: MOV A,#00H MOV P2,A MOV A,P3 CPL A ANL A,#03H RET DIR: MOV R3,#01H MOV A,R3 LD0: MOV P2,A MOV R0,#60H MOV DPTR,#TAB MOV A,@R0 MOVC A,@A+DPTR CPL A MOV P0,A ACALL DELY INC R0 MOV A,R3 JB ACC.3,LD1 RL A MOV R3,A AJMP LD0 LD1: RET TAB: DB 3FH,06H,5BH,4FH DB 66H,6DH,7DH,07H DB 7FH,6FH,77H,7CH DB 39H,5EH,79H,71H DELY:MOV R6,#02H DEL1: MOV R5,#250 DEL2:DJNZ R5,DELY2 DJNZ R6,DELY1 RET END 固化后插入89C51插座,按0~F键应在显示块上显示出来,若不正常,检查硬件各部分直到正常为止。 4.4 A/D转换89C51 1.实验目的和要求 了解ADC0809的工作原理;掌握单片机89C51与0809接口原理;熟悉CPU 中断方式和查询方式读取A/D转换结果的程序设计方法。 2.实验原理及实验线路 ADC0809是常用的将八路模拟电压转换成数字信号的集成芯片,ADC0809 能与89C51 CPU直接接口,如图4-4所示,A2、A1、A0 三腿可接89C51 P2.2、P2.1、P2.0,由这三腿可译出000-111 八路输入模拟信号IN0-IN7,当选中一路,且在该路输入0-5V 变化的模拟电压时,可得到00-FF的数字信号,也就是说,模拟电压在0-5V变化时,数字倍号应在 00-FF之间变化。 AD转换结束时,EOC端出现高电平,经反相后与相连,CPU用中断方式读取A/D转换结果。当EOC经反相后(或不反相)与P1.3或其它腿相连时,CPU 可用查询方式读取A/D转换结果。 ADC0809的片选信号由P2.6提供,P2.6经过74LS02或非门与、信号相“或”后分别接至9与6、22脚,读信号由9脚控制,9脚是高电平有效,因而P2.6应为低电平才选中ADC 0809,因此可计算出,片选地址为: BFFF。 对应于0通道P2.2、P2.1、P2.0均为0,所以0809的地址为B8FF。对应于8通道P2.2、P2.1、 P2.0均为1,所以0809的地址为BFFF。本实验A、B、C均接地,只用0通道,模拟信号就应接IN0。0809的地址为BFFF,用B8FF也行。 0809内部没有时钟信号,时钟信号由89C51 的ALE提供,实验线路如图4-4所示。本实验还配备了0804单路组合板,让大家选用。 3.实验内容 ①用中断方式编写并调试出一个程序,将转换结果存于30H。 ②用查询方式编写并调试出一个程序,将转换结果存于30H。 ③编写一个程序将转换值在数码管上显示出来。 4.实验器材 实验组合板、编程器、+5V电源 5.实验程序参数框图 主程序 中断 N Y 6.实验步骤 ⑴ 线路连接 将实验组合板拼装好,按原理图4-4连接好线路,检查无误后, 就可编程调试。 到此为止,所有硬件均连接好了, 整个硬件是一步一步扩展来的,思路明确、步骤清楚,整个系统包括了前向通道和后向通道,是一个完整的产品,整个产品的开发过程也是如此,一部分一部分调试成功,一部分一部分程序调试好,然后再将所有程序全部合并到一起,这个合并不是一个简单的连接,要实现整体功能,各部分程序还要有机结合,不然面貌全非,不是你所想象的那么回事,这就要在编程调试过程中,全盘考虑,统畴安排,反复调试直到成功。 ①中断方式源程序 ORG 4000H AJMP MAIN ORG 4013H AJMP INT1 MAIN:MOV IE,#00H MOV DPTR,#0BFFFH MOV @DPTR,A L2: SETB EA SETB EX1 MOV R7,#47H L1: DJNZ R7,L1 CPL EA CPL EX1 AJMP MAIN INT1:MOV DPTR,#0BFFFH MOVX A,@DPTR MOV 30H,A RETI ② 查询式源程序 ORG 4000H AJMP MAIN MAIN:MOV P1,#0FFH MOV R7,#47H LL: DJNZ R7,LL MOV DPTR,#0BFFFH MOVX @DPTR,A MOV C,P1.3 L1: JNC L2 MOV C,P1.3 AJMP L1 L2: MOV DPTR,#0BFFFH MOVX A,@DPTR MOV 50H,A AJMP MAIN 注意:用此方式时要将接于89C51 13脚的线接到89C51的4脚 4.5 D/A转换 1.实验目的与要求 了解DAC 0832基本工作原理;掌握DAC 0832与单片机89C51接口设计方法;熟悉DAC 0832的编程基本技术。 2.实验原理与实验线路 DAC 0832有数据锁存器,选片、读、写控制信号线,故可以和单片机直接接口,DAC 0832是电流型输出,使用运算放大器 将电流输出线性地转换为电压输出。 当数字量输入在00-FF范围变化时,电压的输出量有两种形式;一种是单极性输出,电压的输出量为0~+XV或0~-XV,另一种是双极性输出, 电压的输出量为±XV,本实验只用单极性。 电路如图4-5所示,DAC 0832片选信号 为低电平有效,直接接P2.6,即P2.6为低时选中DAC 0832,据P2.6=0可算得DAC 0832选片地址为BFFFH。、同时与DGND 连接,与8031的连接,这样8位DAC寄存器始终处于导通状态, 因此,当数据从数据线上输入寄存器时,便直接进入8位DAC寄存器,并且由8位D/A转换器,进行D/A转换,因此,此电路为异步输出结构方式。DAC 0832内部没有参考电压,8 脚接负的参考电压,输出为正电压,8 脚接正的参考电压,输出为负电压。由于DAC 0832是有数字量的输入锁存功能,故数字量可以直接从P0口送入,执行下面几个指令就能完成一次D/A转换。 MOV DPTR,#0BFFFH MOV A,#40H MOVX @DPTR,A 3.实验内容 ①编写并调试出一个输出方波的程序; ②编写并调试出一个输出阶梯波的程序; ③编写并调试出一个输出三角波的程序; ④编写并调试出一个输出锯齿波和程序。 4.实验器材 组合实验板、开发系统一台、固化器二台、+5V电源一台 5.实验程序参考框图 同4.4 6.实验步骤(同4.4) 有兴趣的同学可做A/D,D/A综合实验。