r————————~就jr'llyusbEE转I<E能ES燃匦塑嗣黧疆黧¨lPIC单片机c语言程序设计(10)(接上期)4.C程序pic07.c的SIM软件仿真调试在《PIC单片机C语言程序设计(8)》和《PIC单片机C语言程序设计(9)》中.我们已对C程序pic07.c进行了编辑和编译,现在需要查看该程序能否达到预期的设计目标,即能否完成pic07.c的0~99秒增量计时LED数码显示功能(脉冲发生器),因此需要调试程序。调试程序,可以使用MPLABICD2在线调试器、MPLABICE2000硬件仿真器等开发工具。对于初学C语言程序。又没有上述硬件仿真调试器的读者,最好选用MPLABSIM软件模拟仿真器进行程序的调试。模拟仿真调试是检查程序是否正确,能否实现预期功能的有效手段。有了它,可以实现程序的“单步运行”、“单步越过”、设置“断点”、用软件跑表直接测试延时函数的准确计时等等,对初学C语言编程者特别有用。PTC单片机的C语言程序,是由函数、表达式和各种运算符组成的。初学C语言程序时,很难清楚看出程序是如何运行的.而利用程序的模拟仿真,则可直观看到程序运行的整个过程。(1)模拟仿真的主要命令及功能PIC单片机C语言程序的SIM软件的模拟仿真,是在MPLABIDE集成开发环境(C语言)中进行的。操作时,只需利用MPLABIDE中的有关菜单,如Debugger(调试)、SelectTool等命令项,即可完成模拟仿真操作。为了方便读者查看程序或操作。特将模拟仿真时常用的主要命令和功能汇集起来。如表5所示。(2)设置软件仿真调试状态窗口前面已经讲到,对程序进行软件仿真的先决条件,是在MPLABIDE环境下将所编辑的源程序编译成功后,才能对源程序进行仿真调试。对pic07.万方数据c的源程序,我们已成功地进行了编辑和编译,所以现在可以直接进行软件仿真了。也就是说,只需设置软件仿真调试状态的窗13,便可进行调试。下面介绍具体方法。在PC机显示桌面上,双击MPLABlEDV740快捷图标,打开MPLABIDE的操作界面。用鼠标选择(点击)MPLABIDE中的Debugger(调试)(下拉)SelectTool(选择工具)(下拉)’MPLABSIM(模拟)菜单项,即可把项目设置成模拟仿真调试状态,然后利用“项目树窗口”(参见《PIC单片机C语言程序设计(9)》图37)。用鼠标双击pic07.c(源程序),即可打开pic07.c的源程序,如图43所示。此外,也可采用先在MPLABIDE窗El中,通过相关操作把编译成功的C程序摆在MPLABIDE窗口中,再用鼠标选择Dedngger—SelecTool……的方法,把项目设置成仿真调试状态。表5命令主要功能Run直接全速运行程序,直到遇到断点或(全速运行)一次耗时完成为止。Halt可使单片机处于停机状态、程序计数:停机)器停止工作。Animate使被仿真的程序一步一步地自动运动画运行)行。StepInto运行(执行)一条程序代码,然后停(单步运行)机。按单步方式运行,若遇到一条调用函StePover数,该命令就一步跳过并不进入函数(单步越过)跟踪,然后到调用的下一条代码处暂停。Stepout按单步方武,仅运行一条代码就跳出(单步跳出)不再运行。Reset将程序计数器复位至本程序开始处。7复位)电孑砑佑57匿雠熬一Ⅲ哪画运行命令,以直观pic07.C程序的整个运行过程。用鼠标点击Animate(参见图44中的标注)。图43中主程序main的左边会出现一个红色箭头。不断沿着程序的代码移动.即表示程序正沿着main()以下的赋值和循环语句一TRISB=0x00;’Whie(RA4)-+While(1)int中display(x)-+VoiddispIay(unsignedF;X)…_White(d>0)_+【PORTA=Oxl一PORTB=SEG[un.tbit】.…d一一;】运行。程序运行时,要在方括中运行100次(因为d=100),方可跳出循环到程序末尾的X++;(X值从0+1代表经过上述操作后,会在MPLABIDE的界面工具栏上自动生成模拟调试Debug的快捷图标。该图标从左到右的功能依次为:Run、Halt、Animate、StepInto、Stepover、Stepout和Reset,共7个命令(如图44所示)。在进行上述操作时,如果在工具栏上未自动生成图44所示的快捷图标,可用鼠标点击MPLABIDE中的菜单。Tools”。然后在其下拉菜单中选择(点击)。2MPLABMacros”。弹出图45所示的快捷图标.此时。只需用鼠标点击该图的三角形按钮,在其下拉菜单中点击“Debug”命令.同样可在MLABIDE的工具栏上生成如图44所示的模拟调试快捷图标。完成上述操作后,我们就可以进入程序的模拟调试运行阶段了。RunHaltAnimateStepIntoStepoverStepoutReset图44图45说明:图43工具栏上的模拟调试快捷图标的功能,与MPLABIDE中的Debugger下拉菜单中的命令Run、Animate、StepInto、Stepover、Slepout和Reset等完全等效,只是其操作没有图43中的快捷图标直观、方便罢了。(3)Animate动画运行初学C语言程序进行模拟仿真运行调试时,直接使用图43工具栏中的快捷图标。最为直观方便。我们首先选择该图标中的。Animate”动582010VOL.07万方数据LED显示的个位值从0增量到1)一if(x==99)判断X值是否为99.如果未达到该值,返回display(x)—+VoiddispIay(unsjgnedint×)…如此运行。这就是Animate命令模拟运行的功能。即可以完全看到pic07.C程序的运行过程。在前述的pic07.c程序沿While(a>o)循环语句运行时.应循环运行100次才跳出循环到×++;代码处。程序在该循环语句运行中的耗时约33分钟。显然.这么长的运行时间,调试起程序来实在太费时了。所以,单纯使用该命令,仅适用于初学C语言时学习调试。若能在使用该命令时配合其他调试命令,则可大大降低程序的运行时间。(4)StepInto、stepover和Stepout命令配合运行调试前面讲到,用Animate(动画运行)命令,观察pic07.c程序运行,会感到运行速度较快,看不清楚程序经过的路径。这里介绍用工具栏快捷图标(见图43)中的命令StepInto、Stepover和Stepout。对程序进行模拟调试的方法。其功能见表5。为了灵活使用上述命令.大家还应了解C程序的不同代码在运行时所用的时间(耗时),才能正确选择各种命令。为此,笔者将模拟运行时。pic07.C中的各种赋值语句、延时函数delay(200)、显示函数(display)等。运行的时间分别进行了实测.见表6。以供读者选用图43中的三条调试命令StepInto、Stepover和Stepout时参考。下面具体介绍使用StepInto、Stepover和Stepout命令对pic07.C进行调试的操作方法。1)设定程序调试的起点伽川一觥然缢在图43中(假设模拟调试准备已操作完成),用鼠标点击Animate命令。再以最快速度用鼠标点Pic07.c的语句或函数名称,)后开始模拟运行fima击Halt(停机),此时在主函数Voidmain()以下的某条赋值语句(如TRISA=0x10;)的左边会出从Voidmain(TRISA=Oxl0;(耗时)2Us3U2IJssssssPORTB=Ox40;现一红色箭头.这是模拟调试的起始运行点,如图46所示。INTCON=Ox00;X=0;2U2tJ懈id越aine{)While(RA4)Displag(x)一调用显示函数体Unsighidintd=100……Unsigmadchars2U3UTR工gB篁0x00:T娶IgA=0x10;p0RTB盘0x40:SED7[7]=・…・・20tJ工NTC0对=0x00;p0R.rA=0x10;unitbit=×%10:323Ustenbit=X/10%10;643IJsX20;枇1e《RA哇}图462)StepInto单步运行利用StepInto命令,可以清楚看到pic07.c程序从主程序开始一步一步地运行。操作时。用鼠标点击图44中快捷图标StepInto(参见图44的指示)。每点击一次该图标。程序运行一条代码,可参照表6一步一步进行。当StepInto进入调用显示函数的函数体中时。stepInto还能工作,直到unitbit=X%10时。因该赋值语句需耗时323us。该单步运行因每步走时太短,它会随鼠标点击stepInto时,在该语句原地踏步。无法前进。此时应换用另外的命令。3)Stepout或Stepover单步运行点击图43中的快捷图标Stepout(或Stepover),点第一次。程序越过unitbit=X%10。点第二次越过tenbit=X/10%10;然后再用鼠标点击StepInto(单步),直到dalay(200);(延时函数),由于该延时约5ms,StapInto无法快速运行,此时可改用Stepover命令,用鼠标点击之,程序即可从delay(200);到达赋值语句RA3=1;。4)stepInto单步运行从RA3=I;开始的三条代码的运行时间较短,仍可用单步运行命令运行。即点击stepInto三次,直到程序运行delay(200)为止。然后换用stepover命令。点击stepover,即可到RA2=I;.再点击stepInto两次,运行到d一一;至此,while(d>0)循环语句执行了一次循环。再点击stepInto,红色万方数据While(d>O)6USPORTB=SEG7[unitbit】;5UsRA3=0;2Usdelay(200);5.0msdelay(2)到调用延时函数7tJsdelay(2);99Idsd一一;4Us×++3UsIf(x==99)6UsX不等于99转displag(x);X等于99给X赋值05)设置断点和使用Run全速运行为解决上述问题,可用全速运行命令Run进行-一,眦1eCR段嘎)f;}wk.ile《1)fdisplay‘x};X++;if(x==99)x;O;,二,,一;i…oIo加圈47电孑嗣佑59光标回到while(d>0),其d=100变成d=99,由于此时while中的d值仍>0。程序将继续在该语句中运行。如果按上述方法继续运行该程序。则必须重复100次(因d=100)才能跳出该循环语句,显然太费时。调试。由于点击一次Run命令,程序的运行时间在2s(秒)以上,为了控制程序运行,应先在需要观察程序运行情况的语句处设置断点,这是调试程序粉就业技能龇J口侈sEEKER要——————————————————————————]lII蠢鞠一时经常使用的方法。设置断点的作用.是使程序运行到所设置的断点时自动停止。此后,还可根据实际需要选用其他命令进行调试。设置断点的方法如下:双击需要设置断点所在行代码的最左端.在该行会出现断点标志——红色。B”,如图47中设置了两个断点。断点设置好后,点击Run命令,程序会立刻运行到图47中的第一个断点处。这时再用鼠标一步一步点击stepInto命令,程序会从pic07.C的×++一if(x==99)一dispay(x)一新的循环又开始(LED数码管从00,变到01),如图48所示。本文通过以pic07.C的调试过程为例,介绍了PIC单片机源程序模拟调试的一些基本方法,其目的是使大家掌握MPLABIDE工}Yoiddj.splay《瑚ign息dintx》具栏中模拟调试快捷图标的基本功能.为进一步学习模拟调试的fuT,sig∞LediIItd。100,啪it_.bit,ten_bit;技巧,如将要介绍的用跑表计时、定量观察C程序中的变量值等,打下基础。瑚ig疆船匮cl娟暖SltG?ftoj={Oxe0,0xf9,0xa4,图48研(上接40页)改程序,直到能达到我们的要求。(在此,就不必多介绍)这样,在以上步骤的基础上。消防坦克就能正常的工作了!实战图如图18。到(经多次试验。由于传感器精度不是很高,离小车50cm左右的火源,小车可以容易检测到。因此。需要将火源不要放得太远)(5l坦克消防车不能将火源扑灭:A.水泵的电压不够高。力量不足(更换电池即可);B.杯中的水太少(添加水即可);C.喷出的水不够散(可以为小车的喷水头添加一个喷头)。(6)其他故障(由于制作电路板过程可能出现纰漏,将电路短路或断路。此时。需要就将用示波五、元件部分元件单片机红外火焰传感器水泵坦克车模晶振无极电容个数17111型号(备注)STC89C52使用过程小心焊接不要购买太大可以自己制作12M5520830P、470P、22P等2200u器或万能表一次检测,直到故障解决)。软件部分调试(假设硬件部分正确)有极电容电阻F、220uF等不同阻值每根高度要一致可以自己制作电流最好要大点IN4007等8550/8050等不同颜色都可塑料或易拉罐方便与杜邦线连接可以选用6脚的用于复位软件部分采用C语言编写与调试。只要编程思路及算法正确,在keiC环境调试成功后,将程序烧到单片机内部,结合硬件所执行的动作。不断修螺丝柱杜邦线9V电池二极管三极管发光二极管水杯排针开关触点开关其他30210105153—41其他必备工具(以上元件都是很常用的。建议多备用)602010万方数据VOL.07PIC单片机C语言程序设计(10)
作者:作者单位:刊名:英文刊名:年,卷(期):
丁锦滔
电子制作
ELECTRONICS DIY2010(7)
本文链接:http://d.g.wanfangdata.com.cn/Periodical_dzzz201007015.aspx