关于keil延时函数的问题,和硬件不一致

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于keil延时函数的问题,和硬件不一致相关的知识,希望对你有一定的参考价值。

现在要编写一个硬件的程序,对时序要求很高,因此需要较为精确的延时函数,由于要用很多,所以不用定时器,用延时函数。不过在用keil仿真我的延时函数的时候我发现一个问题,就是用keil软件仿真出来的时间和用硬件仿真出来的时间不一致,同样都是12MHZ,但是用硬件仿真出来的时间是用软件仿真出来时间的两倍。不要跟我说keil仿真时间不准确,应该不是这个原因,呵呵。也就是说是2倍关系,由此我又拿来12MHZ下C的标准延时1us的函数_nop_()来试,软件是0.5us,而硬件才是1us.这是为什么啊???回答满意,另有追分!
谢谢一楼的回答,你说的很正确,但这也正是我当时提这个问题的原因,就是因为keil仿真出来的是0.5us,而硬件仿真出来的是1us。虽然你没有解答我的问题,但还是感谢你。我后来同多询问客服找到问题的答案了,就是我买的这套硬件仿真器,针对我用的p87c591的型号,他又两种时钟模式可选,这个可以在keil中进行设置。他们出场的仿真器默认的是12时钟模式,还有一种是6时钟模式。当设置成6模式时,就可以完全模拟该片子的真是情况了。由此keil和硬件的仿真结果也就一致了.

是这样的,keil有自己的晶振,你在使用时要把keil的晶振调节成和硬件的晶振一样的大小,这样时间就一样了。
还有如果要精确的延时,最好是用程序自带的延时函数,
另外我要提醒的是,在主函数大循环中不要过多使用延时功能,建议用计数功能代替延时,这样比较省资源。
参考技术A 不知道你说的硬件仿真是什么意思,P87C591与传统51分频方式有点不一样,接12M晶振时,机器周期是0.5微秒,而不是1微。本回答被提问者采纳

汇编与C51语言如何在Keil混合起来使用?只要教会我调用一个延时函数就可以了。

参考技术A 1、在项目(project)窗口中包含汇编代码的C文件上右键鼠标,选择“options for ...”,并选择“Generate Assembler SRC File”和“Assemble src File”,使他们变成黑色(有效)状态。
2、根据选择的编译模式,把相应的库文件(如果是small模式的话,就是 ..\Keil\C51\Lib\C51S.lib)加入到工程中,该文件必须作为工程的最后文件。
3、在C中直接嵌入汇编,方法如下:
#pragma asm
;;;;你的汇编代码,如果是延时函数的汇编代码,就放在这里
#pragma endasm
4、编译,即可生成目标代码。

以上是关于关于keil延时函数的问题,和硬件不一致的主要内容,如果未能解决你的问题,请参考以下文章

数据库读写分离时,主从延时不一致该怎么解?

小工匠聊架构-Redis 缓存一致性设计

MongoDB

为什么说延时双删很扯淡

硬件竞争和冒险

单片机硬件和软件延时是啥意思?