本文引自 http://blog.ednchina.com/likee/25421/category.aspx 

 

通常大家都说keil的纯软件仿真功能无比的强大,它到底强大到哪种程度呢?简单地来说,它能够仿真到几乎所有的内部资源及外围的IO口。

 

 

如上图所示,几乎所有的IO口、串口、I2CSPIAD等,都能够仿真。呵呵,够强大了吧?下面以外围IO口的流水灯仿真及AD转换为例,来慢慢说明。

大家可以下载下面这个软件包进行结合我的例子同步:

 

rar

 

点击看大图

 

下载完后直接可以编译,编译后,没有错误和警告,然后就可以点击上图中的那个红色的d字形按钮进行 debug,然后点击“peripherals”按钮,选择GPIO,再在子菜单中选择Port0(因为在程序中我是将流水灯写在对应的Port0管脚上的)。再按一下全速运行,呵呵,是不是发现IO0SET的第十六位到第二十三位的钩依次打上呢?这是因为它们依次就高电平,如果我们在实际的开发板上接上LED(阳极接限流电阻再接IO口,阴极接地)的话,这样就会使我们的LED闪啊闪的,像流水一样~~~~~~~~

AD转换呢?我们有AD转换,首先要模拟出一个模拟电压才行。点击Debug后,不要点全速运行,在Debug菜单中选择function editor (open Ini file),会提示我们打开一个脚本文件,把下面这样文件加进去:

rar

脚本文件的内容是:

//

// Generate Sine Wave Signal on AD Channel 0

//

signal void AIN0(void) {

 float volts;        // peak-to-peak voltage

 float frequency;    // output frequency in Hz

 float offset;       // voltage offset

 float duration;     // duration in Seconds

 float val;

 long i, end; 

 

 volts     = 1.5;

 offset    = 1.6;

 frequency = 1800;

 duration = 0.1;

 

 printf ("Sine Wave Signal on AD Channel 0."n");

 

 end = (duration * 100000);

 while(1) {

    val = __sin (frequency * (((float) STATES) / CLOCK) * 2 * 3.1415926);

    AIN0 = (val * volts) + offset;

    swatch (0.00001);                // in 10 uSec steps

 }

}

进行保存,编译,下面按下全速运行,再打开逻辑分析窗口,这个时候你看到正弦波了吗?肯定看不到啦!

这是为什么呢?因为我们还没有把它加到模拟IO口呢!那么怎么添加呢?在下面这个窗口中:

 

 

 

点击看大图

 

 

我们再看看前面这样脚本的内容,那个函数是将一个正弦波信号加到一个叫AIN0的管脚,这可以在command 窗口中输入 dir vtreg”命令来查看这个模拟的CPU有哪些模拟资源。那么,我们将这个函数添加到模拟端口,输入这个脚本函数的名称:“AIN0()”,这个时候看到正弦波了吗?看到了!看到一个正弦波在跳啊跳的,多开心啊!

总体如下图:

 

 

点击看大图