历史上的今天
今天是:2025年01月02日(星期四)
2018年01月02日 | KEIL单片机C语言精确延时值的计算
2018-01-02 来源:eefocus
关于单片机C语言的精确延时,网上很多都是大约给出延时值没有准确那值是多少,也就没有达到精确高的要求,而51hei给出的本函数克服了以上缺点,能够精确计数出要延时值且精确达到1us,本举例所用CPU为STC12C5412系列12倍速的单片机,只要修改一下参数值其它系例单片机也通用,适用范围宽。
共有三条延时函数说明如下:
函数调用分两级:一级是小于10US的延时,二级是大于10US的延时
//
//----------微秒级延时---------
延时时间=(3+5*X)/12 提示(单位us, X不能大于255)
//
{
uchar data i;
for(;Ms>0;Ms--)
for(i=26;i>0;i--);
}
i=[(延时值-1.75)*12/Ms-15]/4
如想延时60US则 i=[(60-1.75)*12/6-15]/4=25.375≈26; 修改i的值=26,再调用上面的【10US级延时函数】Delay10us(6); 则就精确延时60US;
如果想延时64US可以用这二种函数组合来用: Delay10us(6); for(i=9;i>X;i--) 共延时64US
//==============对于大于20Ms的可用中断来实现程序运行比较好===============
中断用定时器0, 1Ms中断:
{
TL0=(0xffff-1000+2)%0x100;TH0=(0xffff-1000+2)/0x100; //每毫秒执行一次
if(DelayMs_1>0)DelayMs_1--;//大于20Ms延时程序
}
函数调用
{
DelayMs_1=a;
while(DelayMs_1);
}
如果延时50Ms则 函数值为 DelayMs(50)
//+++++++++++++++++++++++++公式推算来由++++++++++++++++++++++++++++
二级延时C语言反汇编见上传图1:
指今 时间(1us) 指今 时间(1us)
MOV A Rn 1 SETB C 1
MOV Rn #data 2 SUBB A #data 2
DJNZ Rn rel 4
Dec Rn 3 SJMP rel 3
JC rel 3 MOV Rn direct 4
Lcall addr16 6 RET 4
//--------------
JNZ 3 XRL 2
SUBB 3
使用Delay10us(uchar Ms) 最多能延时21995.5us;
其中循环外函数调用与返回用的时间=(6+4)进入+退出(1+1+2+3+,4)=10+11=21/12=1.75us;
循环内函数时间 MS= Ms*(1+1+2+3,+2+4*I+3+3)/12=Ms*(15+4*I)/12 ;
所以如果延时60us时用【10US级延时函数】I的值为:
60=循环外时间+循环内时间=1.75us+ Ms*(15+4*I)/12;
则i=[(60-1.75)*12/6-15]/4=25.375≈26即如果Ms=6, i=26;
本算法中的12是STC12单片机与普通标准速率比。
史海拾趣
|
2007年结束的时候,合同制造市场状况不稳。虽然当年营业额增长情况不错,但iSuppli公司修正后的合同制造产业预测显示,该产业的增长速度将在长期内放缓。 合同制造市场由电子制造服务(EMS)提供商与原始设计制造(ODM)公司构成,该市场2007年增长了15 ...… 查看全部问答> |
|
经典的Internet Explorer 7.0 for XP SP2 VISTA简体中文版 IE7中文版支持中文域名,包含了许多重大安全改进的Internet Explorer 7终于发布了最新正式版本。 微软通过其官方下载中心放出了Internet Explorer 7.0浏览器的升级版,版本号7.0.5730.13,支持Windows XP和Windows Server 2003。 据了解,新版IE7 ...… 查看全部问答> |
|
本帖最后由 paulhyde 于 2014-9-15 09:30 编辑 那个家伙太TM狠了,把网址写在记事本里,整个压缩文件,然后收费!鄙视你 http://www.necel.com/cgi-bin/nesdis/o003_e.cgi?article=DF781235 这个就是那个记事本里的网址 … 查看全部问答> |
|
小女子做的课题,初次接触FPGA的设计 用的是Quartus2的平台运行,综合编译已通过,但是时序仿真出了错:说是目标芯片不适用。 求各位大侠能指点指点,给出合适波形发生器的芯片型号,先在此谢过 下为VHDL开头部分程序: library ieee; use ie ...… 查看全部问答> |
|
小弟做的IIC读取温度的应用程序。运行我的应用程序后,系统拖死了,用示波器监测IIC波形是一直都在发送数据。但是运行网上下的IIC调试助手IICMgr_CE5.0.exe后,我的应用程序就正常了。即使把IICMgr_CE5.0.exe关了,再运行我的应用程序也正常的。 ...… 查看全部问答> |
|
GetRotatedBitmap( HANDLE hDIB, float radians, COLORREF clrBack ) 我在网上搜到个用来旋转位图的函数 HANDLE GetRotatedBitmap( HANDLE hDIB, float radians, COLORREF clrBack ) ; 可第一个参数 ...… 查看全部问答> |
|
各位师兄师姐大牛大家好: 小弟刚开始接触DSP2812,还没有入门,真心求大家领路,真心希望大家指点迷津。我不要现成代码,有了方法,我自己来实现。 说一下我的工程背景,我在电力行业,做开关断路器机械特性的在线监测。现在要捕获欧姆龙旋转编 ...… 查看全部问答> |
|
在下载IAR5.51时无论30天的限制版本还是4k的限制版本都说与正式版本的区别是不含有“Source code for runtime libraries ”,这个是什么?在使用时有没有这个有什么区别吗?… 查看全部问答> |




