自从本刊1990年第11期上刊出TD—Ⅲ的介绍文章后,陆续收到许多读者的来信,现就TD—Ⅲ使用和学习中的一些问题作些说明。
(1)许多读者在用TD—Ⅲ运行子程序时,单步运行可以,而连续运行则得到意想不到的结果,为什么?
这是一个许多初学者容易碰到的问题,主要是对程序这个概念没有搞清楚。一个程序一般是由主程序和若干子程序组成,主程序一般是使CPU对整个系统初始化和设定外部接口的工作状态,然后根据键盘的按键操作情况或外部接口的输入状态作相应的工作。子程序一般是为做某一特定的事情,执行完子程序后,程序又返回到主程序中去。主程序与子程序之间的关系是调用和被调用关系,当主程序调用并执行完子程序后,程序会自动返回到主程序调用子程序的下一条指令处,又开始执行主程序。子程序的最后一条指令通常是RET(即返回)指令。如果只将一个子程序输入TD—Ⅲ中,在没有主程序的情况下,采用连续运行方式运行这个子程序,那么当CPU执行完RET之前的指令后,再执行RET时,CPU就不知应该将子程序返回到何处去,就可能会得到意想不到的结果。
在没有主程序的情况下单步运行子程序时,由于监控程序的控制,可以一步一步地执行程序,但执行到RET指令时,也会出错,只不过是将程序执行的过程给你显示出来。对于初学者来说.当我们拿到一个现成的程序时,首先应尽量搞懂各条指令的意思,然后再去试着运行它,如果运行不通再仔细分析原因,试着修改某些参数,以达到能运行的目的,因为很多现成的程序能否运行与硬件环境有关。
(2)在运行1990年11期上所给的81演示程序时,其显示结果是180.0.0.0.0.0.,这是什么原因?
这是由于程序在排印时,将几个地址单元的内容排错,按照排错的程序运行就会得到180.0.0.0.0.0.这个显示结果,这并不是硬件有故障。如果将程序中的3一个单元按如下改动 A004H:7430;A0llH;797E;A019H:797F;再运行这个程序,便能得到81这个显示结果。实际上只要你将A101H单元改成某一数,再运行这个程序,就会将你所改之后的数显示出来。
(3)用键盘可将数据写入到EEPROM之中,而直接用块传送的方法,则不能将数据传送到EEPROM之中,这是什么原因?
EEPROM(2864)是一种较特殊的器件,在读2864时,其选出速度与读RAM6264差不多,但向EEPROM中写数据时,当写入一个数据后,需要等几十毫秒,再写另一个数据,否则数据就写不进去。用键盘操作时,每写两个数据的间隔是远远大于几十毫秒的,故写入不成问题。而用块传送方法时,每两个数的写入间隔在微秒数量级,故数据传不进去。
在设计TD—Ⅲ时,已经考虑到这个问题,如果要将数据块传送到EEPROM之中,首先按[USE]键,再按照块传送的方法操作,就能将数据块传送到EEPROM之中。用这个块传送方法时,数据传送较慢,但在数码管上显示数据的传送过程。
(4)如何检查TD—Ⅲ各个芯片是否工作正常,在监控EPROM中是否固化有检测程序?
在监控EPROM中已固化了检测和演示程序,运行相应的程序便可检测TD—Ⅲ的各个芯片是否工作正常。如果在接通电源后,TD—Ⅲ能显示P8031-h.h.,就说明8031,8279,74LS373等芯片工作正常。
检测8255的方法是:先键入0C00H,再按EXE键,如果8255工作正常的话,在8255的三个8位输出输入口上,就会有二进制加法计数输出,可用一只发光二极管串一只330Ω的电阻接在各输出引脚与地之间来监测,8255的测试程序见实验程序1。
检测AD0809的方法是:先键入0A60H,再按EXE键,如果ADC0809工作正常的话,在TD—Ⅲ的数码管上,就会轮流将8个A/D通道数和对应的A/D结果显示出来。如果你将A/D输入端悬空,显示的A/D结果将是随机数。如果你在A/D输入端输入0~2.5V之间的直流电压的话,A/D结果就会随输入电压变化。注意在将电压信号输入A/D端时,应串接一只10kΩ左右的电阻,以免输入电压过高而损坏A/D芯片。
检测DAC0832的方法是:先键入OADAH,再按EXE键,如果 DAC0832正常的话,在 X5的D/A端就会有锯齿波输出,可以用示波器或万用表监视和观察锯齿的情况。注意在作D/A演示时,请先接通±12V电源,否则不会有锯齿波输出。锯齿波实验程序见实验2。
在监控EPROM中还固化了一段十进制累加计数演示程序,只要你先在800BH送入02H,800CH中送入0BH,在800DH中也送入0BH,返回监控后,再键00H并按EXE键,TD—Ⅲ的数码管上便会出现十进制累加计数的显示。利用这个程序可检查8031的定时器和中断及RAM6264。
(5)TD—Ⅲ之中是否固化有显示字符,能否将这些字符显示出来?
在TD—Ⅲ之中已固化了常用的显示字符,编程时可以直接使用,字符0~F对应的显示代码是00H~0FH,0.~F.对应的代码是10~1FH。由于显示符有些不太符合印刷规则,故不太好直接给出它们的对应关系。如果你运行实验程序3,就会在TD—Ⅲ的数码管上显示出显示代码和显示符来。前二位数码管显示的是显示代码,后六位数码管显示的是显示符。
(6)TD—Ⅲ中 8031的 P1.0口为何总是低电位,能否使用TD—Ⅲ中8031的P1口?
TD—Ⅲ是作为一种单片单板而设计的,P1口中的P1.0~P1.2和P1.7已由系统使用,操作者最好不要再使用这几个口,如果要使用的话,可将与有关引脚的连线切断,以便得到正确的操作。切断某根引线后,TD—Ⅲ与之对应的操作功能可能受到影响。
P1.0总是低电位,是因为P1.0作为A/D转换完检测信号,P1.0与IC1的第10脚相连,如果切断这根引线,P1.0就会恢复高电位。当用键盘读8031引脚的状态时,应考虑当时的工作状态和引脚的外部连线,这样便能正确解释所得到的结果。
(7)从资料上看8031的中断入口的地址是0003H、0013H、000BH、0023H和 002BH,而这一部分地址空间已由监控EPROM占用,怎样使用8031的中断入口呢?
为了使操作者能使用各个中断,在TD—Ⅲ设计时,已经将相应中断的入口转跳到8003H,8013H,800BH,8023H,802BH,操作者只要在相应转跳中断入口中填入中断服务程序的地址便可,中断地址的转跳并不影响程序的正常执行。
(8)TD—Ⅲ中没有设置断点健,能否断点运行程序呢?
TD—Ⅲ确实是没有设置断点键,但可以通过键盘操作来实现程序的断点运行。例如要想在A010H处设置一个断点,可以先将A010H~A012H单元的内容改为 0200A0(即将A010H处改为LJMPMON),如果前面的程序运行正确的话,程序运行到A010H处时,就会跳到MON状态,在MON状态下再按一次RST键,就可以来检查程序运行的结果了。检查完毕后,再将原来A010H~A012H单元的内容重新填入,这时又可再设置其它断点了。
(9)在利用TD—Ⅲ编程和调试程序时应注意些什么问题?
TD—Ⅲ RAM的最后一页,即BF00H~BFFFH,这部分空间已由监控使用,操作者在利用TD—Ⅲ的监控时,最好不要使用这部分空间。
在使用TD—Ⅲ时,不要在单步运行的状态下,调试与中断有关的指令,否则,会造成TD—Ⅲ进入死循环状态,这时只有按复位键才能使TD—Ⅲ退到监控状态。当程序连续运行时,则没有这些限制。
(10)TD—Ⅲ的IC5(RAM)的位置上是否可插2764(EPROM)这种芯片,以便运行其中的程序?
在IC5的位置上可以插RAM. EPROM EEPROM芯片,可以直接用2864或2764取代6264插在IC5的位置上。用2764取代6264之后,不能将数据写入到2764之中的,但能运行固化在其中的程序,也可将固化在其中的数据读出来。由于2764与6264的数据和地址引脚的排列是完全相同的,换上2764后,不会影响TD—Ⅲ的正常工作。
(11)为了更好地使用TD—Ⅲ和学习单片机,能否将TD—Ⅲ的监控软件刊登出来?
TD—Ⅲ的监控程序较长,由于版面问题,不可能将它刊登出来,如果有兴趣了解TD—Ⅲ的监控程序的读者,可直接与本文作者朱小华联系,地址:湖北武汉武昌74003信箱航空航天部武汉仪表厂,邮编:430074。
实验程序1:(测试8255)
A000 90F003 MOV DPTR,#0F003H
;设定8255为输出方式
A003 7480 MOV A, # 80H
A005 FO MOVX @ DPTR,A
A006 7400 MOV A,#00H
A008 78FP LEDLI:MOV R0,#OFFH
A00A 79FF MOV R1, # OFFH
A00C 90F000 MOV DPTR,#0F000H
;将数据送到PA口
A00F FO MOVX @DPTR,A
A010 90F001 MOV DPTR,#0F00lH
;将数据送到PB口
A013F0 MOVX @DPTR,A
A014 90F002 MOV DPTR,#0F002H
;将数据送至PC口
A017 FO MOVX @DPTR,A
A018 D8FE LEDL2:DJNZ R0,LEDL2 ;延时
A0lA D9FC DJNZ R1,LEDL2
A0lC 04 INC A ;加1
A01D 80E9 SJMP LEDL1 ;循环
实验程序2:(测试 DAC0832)
A000 7400 DA: MOV A,#00H;将D/A置零
A002 78FF DAL1: MOV R0,#OFFH
;设定延时时间
A004 7910 MOV R1, # 10H
A006 90D000 MOV DPTR,#0D000
;将D/A芯片地址送DPTR
A009 F0 MOVX @DPTR,A
;将数据送DAC0832
A00A D8FE DAL2: DJNZ R0,DAL2
A00C D9FC DJNZ R1
A00E 04 INC A;三角波上升一格
A00F 80F1 SJMP DAL1,循环
实验程序3:(显示代码和显示将)
A000 7400 LETTER:MOV A,# 00H;将显示置零
A002 F8 TT1: MOV R0,A;将数据送至R0
A003 540F ANL A, # 0FH
;将显示码送CD7——CD6
A005 F57E MOV 7EH,A
A007 E8 MOV A,R0
A008 C4 SWAP A
A009 540F ANL A,# 0FH
A00B F57P MOV 7FH,A
A00D E8 MOV A,R0
;将显示码送CD5——CDO
A00E F57D MOV 7DH,A
A010 F57C MOV 7CH.A
A012 F57HB MOV 7BH,A
A014 F57A MOV 7AH,A
A016 F579 MOV 79H,A
A018 F578 MOV 78H,A
A01A 04 INC A;显示码加1
A01B 111F ACALL DELAY,调延时子程序
A01D 80E3 SJMP
A01F7 7B0F DELAY MOV R3,
A021 7CFF DL1: MOV R4,#OFFH
A023 120450 DL2: LCALL 0450H;调显示子程序
A026 DCFB DJNZ R4,DL2
A028 DBF7 DJNZ R3,DL1
A02A 22 RET;返回到主程序
(朱小华)