发现keil的一个秘密,编译环境Memory Mode只能选Small,否则容易出现诡异现象。
本帖最后由 jianhong_wu 于 2015-1-8 19:48 编辑鸿哥-深圳:
今天用stc15w204s单片机调试发现了一个惊天秘密,于是决定把它写出来,避免后来人犯错。就是在我们使用keil的时候,在编译环境Memory Model选项里,强烈推荐大家使用Small模式,千万不要选Compact和Large模式,否则会出现以下诡异的现象。比如,我以下两个代码都是让一个LED灯闪烁。第一个是用delay延时方式,第二个是用累加主循环次数的延时方式。结果发现,当我用Compact和Large模式的时候,第一个代码能正常闪烁,第二个代码不能正常闪烁。而当我用Small模式的时候,两个代码都能正常闪烁。
第一个是用delay延时方式:
//假定测试芯片的工作频率为11.0592MHz
#include "reg51.h"
sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;
sfr P5M1 = 0xC9;
sfr P5M0 = 0xCA;
sbit P30 = P3^0;
sbit P31 = P3^1;
sbit P32 = P3^2;
sbit P33 = P3^3;
void delay()
{
int i, j;
for (i=0; i<1000; i++)
for (j=0; j<500; j++);
}
void main()
{
P3M0 = 0x00;//P3为普通的准双向口
P3M1 = 0x00;
P5M0 = 0x00;//P5为比较器IO口,必须设置为高阻输入
P5M1 = 0xff;
P33 = 1;
P32 = 1;
while (1)
{
P33 = 0;
P32 = 1;
delay();
P33 = 1;
P32 = 0;
delay();
}
}
第二个是用累加主循环次数的延时方式:
//假定测试芯片的工作频率为11.0592MHz
#include "reg51.h"
#define const_time_level 10000
sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;
sfr P5M1 = 0xC9;
sfr P5M0 = 0xCA;
sbit P30 = P3^0;
sbit P31 = P3^1;
sbit P32 = P3^2;
sbit P33 = P3^3;
void led_flicker(void);
unsigned char ucLedStep=0; //步骤变量
unsigned longulTimeCnt=0; //统计循环次数的延时计数器
void main()
{
P3M0 = 0x00;//P3为普通的准双向口
P3M1 = 0x00;
P5M0 = 0x00;//P5为比较器IO口,必须设置为高阻输入
P5M1 = 0xff;
P33 = 1;
P32 = 1;
while (1)
{
led_flicker();
}
}
void led_flicker(void)
{
switch(ucLedStep)
{
case 0:
ulTimeCnt++;//累加循环次数,
if(ulTimeCnt>=const_time_level) //时间到
{
ulTimeCnt=0; //时间计数器清零
P33 = 0;
P32 = 1;
ucLedStep=1; //切换到下一个步骤
}
break;
case 1:
ulTimeCnt++;//累加循环次数,
if(ulTimeCnt>=const_time_level) //时间到
{
ulTimeCnt=0; //时间计数器清零
P33 = 1;
P32 = 0;
ucLedStep=0; //返回到上一个步骤
}
break;
}
}
是仿真时有诡异现象还是实物也有? fzwwj95 发表于 2015-1-13 22:04
是仿真时有诡异现象还是实物也有?
实物。就是stc15那款单片机。
页:
[1]