打印

延时函数问题

[复制链接]
3040|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
GXLAOYANG|  楼主 | 2013-1-7 08:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
GXLAOYANG|  楼主 | 2013-1-7 08:25 | 只看该作者
void delay(uchar i)//精确延时函数
{
        while(--i);
}

/*
此延时函数针对的是12Mhz的晶振
delay(0):延时518us 误差:518-2*256=6
delay(1):延时7us
delay(10):延时25us  误差:25-20=5
delay(20):延时45us   误差:45-40=5
delay(100):延时205us 误差:205-200=5
delay(200):延时405us 误差:405-400=5
*/

使用特权

评论回复
板凳
GXLAOYANG|  楼主 | 2013-1-7 08:26 | 只看该作者
此程序的作者看到了,请不要介意,或是请多多指点,谢谢!

使用特权

评论回复
地板
GXLAOYANG|  楼主 | 2013-1-7 10:09 | 只看该作者
刚才写了一个小程序测了一下时间,如果delay(10),实测延时时间在27.12US。

使用特权

评论回复
5
GXLAOYANG|  楼主 | 2013-1-7 10:10 | 只看该作者
晶振为11.0592MHZ。

使用特权

评论回复
6
GXLAOYANG|  楼主 | 2013-1-7 11:27 | 只看该作者
从实际结果来看,delay(X),X的大小确定了延时时间的长短,但为何delay(0)的延时时间有560US这么多(实测的),按我的想法,delay(0)也就是UCHAR I=0;而UCHAR型的数值只是0-255,如何还能减呢?请大侠们指点一下,谢谢!

使用特权

评论回复
7
ayb_ice| | 2013-1-7 11:47 | 只看该作者
看反汇编的

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
GXLAOYANG + 1
8
JerryWu75| | 2013-1-7 12:47 | 只看该作者
本帖最后由 JerryWu75 于 2013-1-7 13:18 编辑

一个类似这样的延时函数,你需要通过C的编译后,查看这段函数的汇编代码有多少个指令,然后检查每一个指令的执行周期是多少,再检查你的方案设计,得到你的CPU的基本指令周期是多少,例如:
1, 12MHz的晶振输入,1:1分频,即1个时钟脉冲就是一个指令周期,指令周期T=83.3ns,如果是2:1分频,就是指指令周期T=166.67ns.T=n*Clk, n是分频数,Clk是时钟,不过有一些CPU的时钟不是直接晶振频率分频到指令周期的,可能还有倍频,这些需要你查看你的CPU的数据手册。
2,你的延时函数有多少条汇编指令,例如
C的原形是Delay(unsigned char Dly),通过C编译后行成以下汇编代码,然后我们假定这些指令的执行周期分别是:
_Delay:
  mov AX,BX  ; 指令周期1T  AX与BX都是8位
_Delay1:
  dec BX         :指令周期2T       如果Dly=0,则BX的初值为0,0-1=FF,即最大延时!
  jmp _Delay, BX>0  ;指令周期2T
  ret   ;指令周期1T
  那么这个程序的延时=1T+Dly*(2T+2T)+1T,T=n*Clk,Clk=1/12mHz,这样你就可以算出这个延时程序的延时了,不过需要注意的是这里没有考虑中断导致的延时误差,即我们默认在执行这个函数时不发生中断,如果会有中断在这个函数中发生,那计算就比较麻烦了。

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
GXLAOYANG + 2
9
forgot| | 2013-1-7 12:57 | 只看该作者
根据执行指令周期的总数来的  指令周期根据时钟周期来的

使用特权

评论回复
10
Light_David| | 2013-1-7 12:58 | 只看该作者
delay(0)延迟更长是因为延迟函数是 先减再检查的,0-1等于255(uchar)
实际效果约等于delay(256)  /(uchar不能调用256,这是为了说明)

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
GXLAOYANG + 2
11
GXLAOYANG|  楼主 | 2013-1-7 13:28 | 只看该作者
明白了,非常感谢各位的解答,谢谢!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

95

帖子

0

粉丝