Keil uVision 里的时间仿真调节问题
执行时间是和你keil软件调试时设置的晶振频率有关,可以在project---options for target进行设置.在设置成晶振频率为12MHZ时,j为char型时 for(i=0;i27;i++);延时为0.1ms。还有就是延迟时间与i,j的类型有关,int型延迟比较长,因为51是八位的单片机,处理8位的速度快,用int的型处理就会慢
stc12c5a60s2单片机在Keil UV4里调试时间和实际运行时间不一样,实际比调试快很多,如何精准调试。
stc12有1T模式和12T模式,过快应该是是用了1T模式,擅入软件里配置成12T模式后调试修改参数
另,软件等待延时的方法本来就不可靠,建议使用定时器
如何用keil调试定时器
即使你的初值是对的,你这样写也是比实际慢上一些的。因为CPU响应中断是需要时间的,这时计数器又计过好几个数了,还有你赋值的这两个代码也要花时间的!!如果要精确地在中断中给T0赋初值应该是“你现在的初值+
中断响应时间
+
到设置初值代码执行完的时间”,你可以用KEIL分步调试一下,看下程序从进中断到你赋初值所花的时间,计算出“中断响应时间
+
到设置初值代码执行完的时间”然后算出把正确的初值赋值给T0就OK了。
还有种办法是用定时器的自动重装模式,这个比较精确,不需要想用定时器溢出中断这么麻烦,还要用板子调试计算从进中断到你赋初值所花的时间,因为使用这个模式的时候,计数器计数到TOP值,也就是你设定的最大值时,单片机硬件会自动清零计数器,然后从0开始重新开始计数,而不需要我们继续赋初值。
或者不用定时,你外接个时钟芯片如DS1302也可以的。
keil51中如何知道汇编指令的执行时间
这个需要编译之后在汇编视图下查看。每一句汇编代码都有固定的执行时间。查个汇编与执行机器时间对应表就可以算出总的机器周期,然后根据振荡频率就可以精确计算
用Keil调试软件精确延时
51单片机,外接12M晶振
void delay1s(void) //误差 0us
{
unsigned char a,b,c;
for(c=167;c0;c--)
for(b=171;b0;b--)
for(a=16;a0;a--);
_nop_(); //if Keil,require use intrins.h
}
void delay10us(void) //误差 0us
{
unsigned char a,b;
for(b=1;b0;b--)
for(a=2;a0;a--);
}