一步步教你如何第一次使用DX516仿真器,LED灯和按键试验
作者:聂小猛(丁丁)2005.3

本教程将会从最基础的开始,一步步教你建立工程,编辑文件,编译文件,仿真和调试程序,直到试验板上出现了你想要的结果...

本文使用的C51例程下载

试验板:

仿真器插在试验板上



第一步,请将附送的试验板按招上图插好。将9针串口插在计算机的串口上,并记住串口号,一般计算机靠上面的一个串口是com1,下面一个是com2。

再将usb插头插入计算机的USB插孔以从计算机取得5V电源,同时电源也供给试验板使用。

现在,请按一下仿真机的复位键,可以看到仿真机上的灯短暂地亮了一下,持续大约0.5秒左右。这表明仿真机各方面情况正常,开始进入等待计算机联机状态。
(注:上电后仿真器就会自动复位,这里按复位键只是测试仿真器的准备情况,如果复位后灯闪3下,说明进入的是脱机运行方式,不是仿真状态)

至此,试验的硬件已经准备好了。

试验板上的LED和按键与51单片机的连接如以下电路图,我们编程时必须按照线路连接进行编程,以便真正地驱动到试验板上的硬件。


现在我们开始进行软件编程。 打开keilC51软件,可以看到以下界面:


我们先在D:盘的根目录下建“D:/keyandledtest”目录,以方便程序的编写和调试,调试过程中产生的文件都将放在这个目录中。

现在开始建立一个工程,点菜单Project/New Project,选择保存在在“D:/keyandledtest”目录,文件名为keyandled,点保存,如下图:


这时,将出现下面的窗口,综合我们现在要编的程序的规模,我们选择最常用的Atmel89C52.这个芯片拥有标准52内核,片内资源在右边的框中有显示。
另: 由于仿真机是用来仿真标准的52内核(兼容51内核),对于某些拥有特殊功能的51单片机,并不能仿真它的特殊功能部分,而是只能仿真其中的标准52内核部分。即使市面上的高级的51仿真机都是如此。如w77e58的第二串口就只能用专用仿真器来仿真.
(注:DX516已经可以仿真52内核的全部功能,及增强51的双DPTR,关闭ALE,片内XRAM,PCA等功能)


点确定,该页面自动关闭。这时高版本的环境会跳出一个询问框,是否将startup.a51拷贝到当前目录,并加入到工程中?不选的话,今后编译时会自动调用默认的startup.a51.选了后就直接调用你复制过来的文件,而且可以根据你自己的要求做修改.这个文件的主要作用是初始化内存和堆栈SP.我们这次选"否"不加入到工程中.

现在我们开始建立新的程序文件,点击菜单File/New,将新建立一个新的文本文件,点击File/Save,将这个文件保存为“keyandled.c”。

再点击左边的那个框框里的“Target 1”,左边的“+”号。将展开“Source Group 1”项,用右键点击“Source Group 1”项,选择“Add Files to Group‘Source Group 1’”,
将跳出下面的窗口:

选择“ keyandled.c ”文件,点add将keyandled.c文件加入到我们的工程中。
这时“Source Group 1”项左边也会出现“+”号,点击它,展开文件列表,现在只有一个文件,因为我们的程序比较简单,所以一个文件也就足够了。如果功能很复杂,就可以将各个功能的程序放在一个专门的文件,一般我们称每个文件为一个程序模块,一个工程里面可以有很多的模块。点击这个文件名,该文件就会被打开并出现在窗口最上方,方便您进行编程和修改。

现在我们要在keyandled.c文件里开始输入我们的程序代码了。
我们先输入以下程序:

//这是包含默认的寄存器头文件,
//该文件在keil自己的目录里,包含了所有52内核的寄存器定义。
#include <reg52.h>

sbit key1=P3^2; //这是特殊寄存器位定义,IO也是特殊寄存器的位
sbit key2=P3^5;
sbit key3=P2^4;
sbit key4=P2^5;

sbit led3=P1^0;
sbit led4=P1^1;
sbit led5=P1^2;
sbit led6=P1^3;

char code DX516[3] _at_ 0x3b;//保留0x3b开始的3个字节

void main(void)
{

led3=0; //点亮LED灯
led4=0;
led5=0;
led6=0;
led3=1; //熄灭LED灯
led4=1;
led5=1;
led6=1;
while(1)
{
if(!key1) //检测key1是否按下,按下时程序会读到该位为0,平时为1
{
led3=0;
led4=0;
led5=0;
led6=0;
}
if(!key2)
{
led3=1;
led4=1;
led5=1;
led6=1;
}
}
}

只要你有一点点C语言的基础,你就可以看出这段程序的功能是开机时四个灯极快地亮一下,可能人眼看不到,但是等会我们用单步调试时就可以看到了,然后灯全灭了,这时如果按key1,四个灯就会被点亮,如果按key2,四个灯就会一起熄灭。

这里要说明一下"char code DX516[3] _at_ 0x3b;"这一句的作用.这是用来实现全速运行停止功能的,用户加入这一句后对自己的程序没有任何影响.但是却拥有了全速运行任意停止,再继续从停止处运行的功能!
(注:这个方法及功能仅限于DX516或更高级的仿真器,请参考DX516仿真器说明第10和第11点)

输入完成后,点击编译按钮,或者按F7编译。察看下面的报告框,如果出现Error或者Warning,要根据情况排除错误和警告,对于无关痛痒的警告可以忽略,具体请查看相关C51的编译器说明书籍或文件。直到最后编译成功为止。

如果您希望编译成功后生成一个HEX目标文件,以方便烧写目标芯片,可以右键点击“Target 1”,选第二项“Options for Target 1”,将出现下面的窗口:

我们的仿真器上的晶振是22.1184M的,你可以将上面框中的“Xtal”后边框中填入“22.1184”,以便软件仿真时计算程序运行时间,这个值的设置对于硬件仿真是没有影响的。

下面依次是编译的内存模式,我们用默认的小模式,这时程序中没有注明的变量将编译在芯片内部的256字节里;程序空间大小,也用默认的64K模式,这个决定编译出来的代码主要是用长调用还是短调用,这些设置都是无所谓的了,仅仅是编译出来的程序大小有点差别而已。其他的设置都空着即可。

点击设置窗口的“output”页,在Create HEX Flie前面的框里点一下打个勾,这样程序编译完成之后就会生成一个HEX目标文文件了。类似的你还可以选择生成一个lib库,但是我们现在还用不到。再下面还可以设置在编译完成是是否开始运行debug,即仿真,或者是否运行你自己指定的某些应用程序。这个设置窗口如下图:

另外几个页:listing,C51,A51,BL51 locate,BL51 Misc都默认设置不要改了,将来等到你会C51的高级应用时或许就用得着了,可以参考keilC的帮助说明文件。

但是Debug页,就得好好设置一下了,如图:

这里可以设置使用软件仿真或者硬件仿真,我们已经接好了硬件仿真器和电路,当然是选择硬件仿真了。另外在下拉菜单里选上“keil Monitor-51 Driver”,这是我们的仿真设备类型。下面还可以选择是否进入仿真后立即装载程序到仿真机中,和是否开始运行直到main函数。我们都先选上吧。
这里要说明一下为什么有“Go till main” 选项,因为C51的编译中实际上在内部还调用了一个初始化函数,这个函数的作用是清除所有内存,设置sp指针等运行main程序之前的准备工作。你在编程的过程中实际上可以不理会这个函数。但是在硬件仿真时,装载代码之后PC指针是指向0000H位置的,前面的一段内部代码的运行又大家都基本一样,没有必要去调试,所以就有了自动运行到main的选项,这样装载之后就直接运行到main函数,也就是你开始编程的位置了。
不过如果选择了 “Go till main”,装载之后需要等待一小段时间大约一两秒钟等待运行到该位置,因为是在仿真状态中运行,所以较慢。



设置了使用硬件仿真当然还要再设置一下通讯端口和通讯波特率了,点击设置debug框右上角的“setings” ,进入下面的窗口:

选择仿真机所接电脑的串口号,再选择115200bps通讯速度。另外“Cache Option”建议全部不选,这样仿真时需要显示变量值时,全部会从仿真机中读最新的,虽然慢些,但可以保证是当前的值。
下面的“Stop Program Execution”中地"Serial Interrupt"项一定要选上,这是全速运行中任意停止功能,我们前面加的那句看似无关的代码就是为了这个用途的,建议今后您需要使用DX516调试的程序中都加上这一句. 只有这样,在调试过程中按stop才会正常停止.

如果您忘记选择Stop Program Execution项,再下载时仿真器会发出嘀地一声提醒您选择.
如果您忘记在程序中加char code DX516[3] _at_ 0x3b;如果编译后占用到了这3个字节,仿真器在下载时会发出3声短促的嘀声.


好了,到此为止,设置完成,点“OK”,再点设置窗口的“确定”。回到编辑环境中,再编译一次。你可以看到信息栏中多出现了一行“creating hex file form "keyandled" ...”.

终于将程序编译完毕了,下面开始仿真!

点菜单Dubug下的Start/Stop debug session ,进入仿真状态。
在下面几种情况中,会出现连接不上的提示框。
1.硬件没有连接好。(仔细连接好)
2.计算机的串口号设置错了。(重新设置)
3.波特率设置不对,请设置为115200bps。(重新设置)
4.计算机串口被其他应用程序占用了。(关闭其他应用程序)
5.仿真机正在全速运行。(停止程序运行或者按仿真机复位键)
5.仿真机处于脱机运行状态。(按仿真机复位观察灯闪动情况,再检查连线是否接上)


这时会出现这个窗口;


别急,点settings,就可以重新进入通讯设置,将正确的串口号和波特率设置好。将其它的使用这个串口的应用程序关闭。 再仔细检查连线,按照本文一开始的说明接好.别忘了再按一下复位按钮,看看灯是否会闪一下。闪一下,就是正常仿真状态,随时都可以进行连接。如果闪3下,这时仿真机是处于脱机运行状态,看看是不是没有连好线。


好,现在点“ try again”,通了!出现了以下窗口:

等待片刻,程序自动运行到main函数的第一句代码。那里的一个小箭头就是指向当前的一句代码。左下角时命令输入框,可以输入需要的调试命令。右边两个是观察窗口和内存窗口。在命令窗口里分为底下的输入行和上面的状态栏.

窗口中间有一排快捷按钮,表示的意思如下:

( 注:下次修改过程序时候重新装载,并不需要按仿真器的复位按钮,编译完后可以直接进入仿真状态.)

现在我们点击单步“Step Over”,可以看到程序代码一句句被运行,运行前面8句时,试验板上的灯依次亮灭,而如果全部运行,这是肉眼看不到的。进入while(1)循环之后,因为没有按键按下,所以一直在if(!key1)和if(!key2)之间来回跳动。
现在左手按住key1不放,右手继续点击单步,可以看到程序运行进入if(!key1)循环,这时可以松开按钮,因为程序只在if语句那里判断了一下按键状态,继续单步运行,可以发现灯又依次点亮。

现在开始试验断点的作用,在 “led5=1;”这一行双击一下,就会在该行设立一个断点,断点行的左边会有一个红色的方块标记。再双击一下,断点就可以取消。我们现在设立好这个断点。如图:

点全速运行按键,看起来试验板没有反应,这时按一下key2键,程序进入到if(!key2)循环后就运行到了断点出并停了下来。这时可以看到试验板上的灯灭了两个,但是另两个没有灭掉,这时因为程序运行到断点处之后,另两句灭灯的代码还没有运行到的缘故。本仿真器可以同时设立多达10个断点。

运行到光标处的作用和断点差不多,只是它把光标的位置也当作了一个断点处理而已。具体可以自己试试。



现在我们可以点击一下显示汇编窗口按钮,可以看到我们的这个程序的汇编代码,在这个窗口按一下右键,可以看到有一个菜单,可以选择是否C和汇编混合显示模式等等,还有一个重要的功能,就是“load Hex or Object file”,这个功能可以实现将其他已经编译好了的HEX文件下载到仿真机中,也就是下载功能。要实现下载其他的HEX目标程序文件,可以在仿真设置那里将自动load代码设置去掉,这样,连接成功后进入仿真状态,用户空间并没有装载任何代码,再显示汇编窗口,点右键/“load Hex or Object file”,就可以下载你需要的代码了。因为本机有脱机运行功能,了解这个就显得非常重要了。当你手头只有你需要运行的目标代码HEX文件,而没有源文件或者调试文件时,你就无法使用debug的装载功能,而只有通过汇编窗口的load HEX文件了。
(注1:在命令行输入"load 路径\文件名.hex",也可以将文件装载到仿真器中)
(注2:DX516在联机状态可以不用复位仿真器,重新装载新的HEX文件,如果新装载的文件地址和上次装载的重叠,会覆盖掉上次的文件,不会影响新装载的程序的运行.)



下面我们再来试验一下没有断点的全速运行,去除所有的断点设置,点全速运行按键。
再用手按试验板上的按键,按一下key1,4个灯全部亮了,再按一下key2,4个灯全部灭了。这也是真实运行的结果。


在全速运行时,点"STOP",就是那个红色的叉叉,程序会停止在当前的光标位置,再点run,程序又继续从停止处运行.这个功能可以用来调试指针不知道运行到哪里了的各种情况.

DX516还具有方便易用的脱机运行功能。在联机并下载程序之后,只要您的程序处于停止状态,没有正在执行全速运行状态,这时将仿真头上的J5放到"RUN"位置,再按复位键,仿真头上的灯闪3下,就可以进入脱机运行状态。仿真器这时就如一片烧好的单片机芯片运行。

如果将仿真头上的J5放到"EMB"位置,按一下复位按钮,仿真头上的灯亮一下,就进入了仿真方式,可以联机调试。


到此为止,您应该体会到了DX516仿真机的方便易用和强大功能了吧?同时你还基本上掌握仿真器的使用和KEILC51软件的使用,算是已经一只脚跨进了单片机编程的大门了!

你也可以继续发挥您的钻研精神,自己主动的编写一些功能函数,比如将LED和键盘的显示和控制关系做得更加的复杂。

我们也会继续编写一些深入学习的教材,以帮助更加深入地学习和掌握C51。

丁丁 2005.2.23


附:有关DX516的一些问答:

1。新外观DX516和旧的主要有什么不同?
答:新DX516采用了一体设计,将仿真器和仿真头设计在一起,用插针连接。做到了非常的小巧美观,携带非常方便。将仿真器和仿真头分后开,把连线绕好,全部可以放进一个小盒子里。
新仿真器的仿真状态和脱机运行状态切换是通过旁边一个跳线实现的。

2。仿真正常启动时有什么特征?
答:仿真头上面的灯亮一下,大约持续0.5秒。如果闪3下,则表示进入了脱机运行用户程序方式。

3.仿真头上的按纽是复位按钮

什么情况下需要按复位按钮?
答:在装好你的目标板,插上仿真器,通上电之后,建议按一下仿真器复位按钮,以测试是否启动正常。其余在以下场合:
⑴从仿真方式转换为脱机运行方式后,按一下复位按钮开始运行用户程序。
⑵从脱机运行方式转换回仿真方式后,按一下复位按钮开始仿真监控程序。
⑶遇到不明情况时,如通讯故障,导致仿真过程中通讯灯常亮时,这种情况极少。
在平时仿真过程中,您修改程序后,并不需要再按复位,就可以直接联机调试!

为何不必在每次仿真下载前按复位按钮?
答:因为新版本仿真器已经做了随时更新flash功能,无需预先擦除。而原先的下载前复位仿真器是为了先把flash擦除,以方便下载。

4. J2J3是晶振跳线

如何切换用户板晶振?
答:2个跳线跳到IN时仿真器使用的是仿真器上的22.1184MHZ晶振。切换到OUT时将使用外部用户板上的晶振,用户板晶振范围可选3M-40M。

用户晶振对仿真有没有影响?
答:用户晶振只要能正常起振,仿真都没有问题,但是晶振速度越慢,仿真速度也就越慢。有条件建议使用20M左右,可以获得比较满意的速度。

用户晶振影响联机波特率吗?
答:不影响,因为联机有一个专门的单片机管理,与用户的CPU无关。即使用户用最慢的晶振,联机也可达115200bps。

5.如何使用脱机运行方式?


在联机并下载程序之后,只要您的程序处于停止状态,没有正在执行全速运行状态,这时将仿真头上的J5放到"RUN"位置,再按复位键,仿真头上的灯闪3下,就可以进入脱机运行状态。仿真器这时就如一片烧好的单片机芯片运行。

6.如何从脱机运行方式返回仿真方式?

将仿真头上的J5放到"EMB"位置,按一下复位按钮,仿真头上的灯亮一下,就进入了仿真方式,可以联机调试。


9.仿真器盒子里面的蜂鸣器是做什么用的?
这个蜂鸣器是用来对一些仿真设置和程序的要求报警用的。在其他一些场合也可能用到。
如果用户进入仿真前没有选择serial interrupt,在装载时会出现一声长声“嘀-”。
如果用户的程序中占用了003bh,003cH,003dH三个程序字节位置,在装载时会出现三声短声“嘀嘀嘀”。


10.如何实现在全速运行中随时停止?
我们强烈建议用户进入仿真前选择serial interrupt,这里的“串口中断”是指mon51仿真器的监控程序用来全速停止的手段,因为mon51需要占用串口中断来停止用户程序,实现全速中的停止和监控,一般的mon51仿真器和sst仿真才仿真不了用户的串口中断。现在,这个中断已经被我们转移到了仿真器主机上,仿真器主机将这个信号转换成IO中断,再加到仿真头的P4上,触发仿真头的interrupt 7,这个中断是P4口的一个外部IO中断,是一个52内核之外的中断,DX516利用interrupt 7来实现全速中的停止和监控,正是因为这一重大转换,才保证了DX516可以单步仿真串口,及仿真串口中断,并可以释放52内核的全部资源。
当您进入仿真前忘记选择serial interrupt时,仿真器会发出一声长声“嘀-”以示警告。

因为监控程序在实现全速运行中随时停止这一功能时,需要interrupt 7入口,所以用户程序中的003bh,003cH,003dH必须留空.当您选择了serial interrupt后,仿真器会在这3个字节位置处写入它自己的监控中断入口地址。
如果您的程序占用了003bh,003cH,003dH三个程序字节位置,仿真器下载过程中会发出三声短声“嘀嘀嘀”以示警告。 如果您不需要全速运行随时停止这一功能,可以不用理会上述警告,但是您将会失去一个非常便利的调试手段! 因此我们强烈建议用户在程序中留出这3个字节,并在调试时选择serial interrupt。您做完这一步后,今后的仿真和程序修改都不再会有任何影响和改变。

11.如何在程序中留出003bh,003cH,003dH三个程序字节位置?
在C51程序中,请在main函数前面加上:
uchar code DX516[3] _at_ 0x003b;
这样C51编译器就会保留这3个字节不用。

您也可以加这句:“DX516 () interrupt 7 {}”,这样会在003bH生成一个没有使用的长跳转,让您的程序不再出现在这个位置。但是因为生成了代码,虽然仿真不会出错,报警仍然会发出,只要你仿真时心知肚明就可以了。


对于汇编用户,建议您的程序直接跳离中断向量区,如:
org 0000H
sjmp start

org 0050H ;建议程序从0050H开始,这样就避开了003bh,003cH,003dH三个程序字节
start:
;开始您的程序


10.仿真器凭什么保修?
每个DX516系列仿真器都有唯一的ID码,已经烧到仿真器中。
这个ID码和用户资料我们已经有记录,以便维修时查看购买日期。