
有关单片机延时程序的计算
voiddelay(unsignedinti)//延时函数{while(i--);}delay(80);//精确延时大于480us这个函数延时480us怎么计算的?这个是...
void delay(unsigned int i)//延时函数
{
while(i--);
}
delay(80); //精确延时 大于 480us
这个函数延时480 us怎么计算的?
这个是51单片机的,晶振是12M,也就是说执行一条用一个机器周期也就是1us,那么这个延迟函数有没延迟480us呢? 展开
{
while(i--);
}
delay(80); //精确延时 大于 480us
这个函数延时480 us怎么计算的?
这个是51单片机的,晶振是12M,也就是说执行一条用一个机器周期也就是1us,那么这个延迟函数有没延迟480us呢? 展开
5个回答
展开全部
我认为应该是将这个函数用汇编语言表示,计算得出的。
在keil中编译该程序,用反汇编窗口观察
这一个语句等于一下七条语句
C:0x000F EF MOV A,R7
C:0x0010 1F DEC R7
C:0x0011 AC06 MOV R4,0x06
C:0x0013 7001 JNZ C:0016
C:0x0015 1E DEC R6
C:0x0016 4C ORL A,R4
C:0x0017 70F6 JNZ delay(C:000F)
第5条语句在循环时不执行
每循环一次,执行六条汇编语句。
在单片机晶振为12MHz下观察
有的语句执行一条要1us,有的语句执行一条要2us。
所以总时间并不是480us,而是727us
我认为延时480us是按一次循环6条汇编语句,6*80等于480这样得出的。但就如我上面所说,结果并非如此。
在keil中编译该程序,用反汇编窗口观察
这一个语句等于一下七条语句
C:0x000F EF MOV A,R7
C:0x0010 1F DEC R7
C:0x0011 AC06 MOV R4,0x06
C:0x0013 7001 JNZ C:0016
C:0x0015 1E DEC R6
C:0x0016 4C ORL A,R4
C:0x0017 70F6 JNZ delay(C:000F)
第5条语句在循环时不执行
每循环一次,执行六条汇编语句。
在单片机晶振为12MHz下观察
有的语句执行一条要1us,有的语句执行一条要2us。
所以总时间并不是480us,而是727us
我认为延时480us是按一次循环6条汇编语句,6*80等于480这样得出的。但就如我上面所说,结果并非如此。
展开全部
你查一下这段函数里的while(i--)的反汇编代码是什么
然后,将该段代码中每条指令的指令周期数(不同指令的执行周期数不同)相加(比如:总数为N)
然后根据单片机的晶振频率和指令周期换算公式(有些是12:1,有些是1:1)计算出每个指令周期的时间
最后,N*指令周期=延时
然后,将该段代码中每条指令的指令周期数(不同指令的执行周期数不同)相加(比如:总数为N)
然后根据单片机的晶振频率和指令周期换算公式(有些是12:1,有些是1:1)计算出每个指令周期的时间
最后,N*指令周期=延时
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个根据单片机的晶振频率来算的,你先看看晶振周期是多大,然后一个机器周期是多少个晶振,一个机器周期就是一条代码执行的周期
51的指令周期是对晶振12分频 如果晶振是12M 那么执行一条一个机器周期的的指令就是1US 即1S/(12M/12分频) =1US
一个机器周期是12个时钟周期
51的指令周期是对晶振12分频 如果晶振是12M 那么执行一条一个机器周期的的指令就是1US 即1S/(12M/12分频) =1US
一个机器周期是12个时钟周期
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你提的问题很不清楚,因为不同的单片机,时钟频率不一样,那么,延时时间也不一样,而且按照理论的计算公式来计算,也有近似的误差,所以最好的是在仿真上查看,然后得出结果。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
拿到keil里去调
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询