前几天论坛已经有网友发过一篇的《
使用ISD51进行在线仿真》帖子,不过光看是掌握不了的,还需要自己实际演练,用不同的方法去使用,才能真正掌握。虽然这篇帖子写的很清楚了,但是在学习ISD51的过程中还是遇到一些问题,因此做了一些补充,希望方便其他使用者。
使用方法:
- 添加ISD51.A51和ISD51.H两个文件到项目中(无需修改文件内容)。
- 在用户程序中进行串口0的初始化,允许ES中断和全局中断。
- 用户程序使用ISDinit()或者ISDwait()函数进行初始化。
- 在项目属性中,设置仿真方式为ISD51,并设置仿真的串口和波特率。仿真的波特率必须和单片机的一致。
- 编译用户程序,并下载到单片机,就可以联机仿真了。仿真过程和用仿真器没有太大区别,非常方便,速度不比低端硬件仿真器慢(甚至更快)。
注意问题:
- 如果仿真联机失败,通常是串口初始化、仿真设置、中断使能的问题,只要设置正确,基本就不会失败。
- 串口波特率可以任意设置,9600、19200、115200都可以,只要硬件支持就可以。当然速率越高,仿真的速度也越快。
- 在使用USB转串口时,如果你安装过的串口设备较多,可能会超过KEIL中允许的串口设备号(COM1-COM16)。这时只能在串口设备的属性中修改,将串口设备的串口号改为COM1-COM16之间。
- 在使用RTOS时,因为RTOS对中断的管理,会对ISD51造成一些影响,有时在断点处不能停下,需要手动中断程序运行。
附RTX51-Tiny下使用ISD51的例子:
- #include <SST89X5XXRD2.H>
- #include <intrins.h>
- #include <rtx51tny.h>
- #include "ISD51.H"
- sbit LED1 = P1^6;
- sbit LED2 = P1^7;
- void init()
- {
- T2MOD |= 0xA0; // bTMR_CLK = bT1_CLK = 1
- T2CON &= 0x18; // RCLK = TCLK = 0
- PCON |= 0x80; // SMOD = 1
- TMOD &= 0x0F;
- TMOD |= 0x20;
- TH1 = 256 - 6000000UL / (16 * 9600UL);
- TR1 = 1;
- SCON = 0x50;
- ES = 1;
- }
- void UART0_putc(char dat)
- {
- SBUF = dat;
- while (!TI);
- TI = 0;
- }
- void UART0_puts(char *s)
- {
- while(*s)
- {
- UART0_putc(*s);
- s++;
- }
- }
- job0 () _task_ 0
- {
- init();
- LED1 = !LED1;
- os_wait(K_TMO, 1, 0);
- LED1 = !LED1;
- os_wait(K_TMO, 1, 0);
- LED1 = !LED1;
- os_wait(K_TMO, 1, 0);
- LED1 = !LED1;
- os_wait(K_TMO, 1, 0);
- //UART0_puts("12345\n");
- //ISDwait();
- ISDinit();
-
- os_create_task (1);
-
- while(1)
- {
- ISDcheck();
- //UART0_putc('1');
- // 1s
- LED1 = !LED1;
- os_wait(K_TMO, 10, 0);
- }
- }
- job1 () _task_ 1
- {
- while(1)
- {
- // 500ms
- LED2 = !LED2;
- os_wait(K_TMO, 1, 0);
- }
- }
复制代码
完整项目文件:
ISD51_blinky.zip
(73.7 KB, 下载次数: 2)
此内容由EEWORLD论坛网友dcexpert原创,如需转载或用于商业用途需征得作者同意并注明出处