论坛风格切换切换到宽版
  • 4054阅读
  • 8回复

一个关于延时的问题 [复制链接]

上一主题 下一主题
离线bg4npj
 
发帖
411
只看楼主 倒序阅读 0楼 发表于: 2010-06-08
在一个1602液晶屏程序中有这麽一段。
void delay(unsigned char ms)
{
unsigned char i;
while(ms--)
{
  for(i=0;i<250;i++)
  {
    _nop_;
    _nop_;
    _nop_;
    _nop_;
  }
  }
}
用的晶振12兆,执行一次的延时时间是多少啊?还请教这种延时时间的算法。请各位授人以鱼的同时最好同时授人以渔。
离线bd1es
发帖
2096
只看该作者 1楼 发表于: 2010-06-08
看上去是8051的。8051是12t单片机,使用12兆晶振指令执行速度刚好1mips,也就是每个指令的执行时间是1us,那么4个_nop_就是4us,循环250次则为1ms。所以楼主的程序是用来延时若干毫秒的子程序,而延时的毫秒数可以通过参数指定。

当然这个程序没考虑内循环本身的指令执行时间,所以实际执行时间会明显长于设定值。如果想得到比较准的延时,就要根据反汇编仔细调优了。不过用于液晶显示器嘛,这个程序还真没问题,大大地够用。:)
离线BG7PMZ
发帖
3139
只看该作者 2楼 发表于: 2010-06-08
'
看上去是8051的。8051是12t单片机,使用12兆晶振指令执行速度刚好1mips,也就是每个指令的执行时间是1us,那么4个_nop_就是4us,循环250次则为1ms。所以楼主的程序是用来延时若干毫秒的子程序,而延时的毫秒数可以通过参数指定。
当然这个程序没考虑内循环本身的指令执行时间,所以实际执行时间会明显长于设定值。如果想得到比较准的延时,就要根据反汇编仔细调优了。不过用于液晶显示器嘛,这个程序还真没问题,大大地够用。:)
'
搭車問avr是多少t單片機?
离线bg4npj
发帖
411
只看该作者 3楼 发表于: 2010-06-09
也就是说for语句延时1毫秒,后面的四个nop语句共消耗4微秒,执行一次消耗的时间为1ms+4us。如果正确的话请告知一毫秒是怎么算出来的。给我个公式就行了。
离线BG4UVR
发帖
11287
只看该作者 4楼 发表于: 2010-06-09
应该仔细看一下bd1es的回答,说得非常清楚了。
离线bd1es
发帖
2096
只看该作者 5楼 发表于: 2010-06-10
'
搭車問avr是多少t單片機?
'

avr是1t的机器,每个时钟执行1条(单周期)指令:)
离线bd1es
发帖
2096
只看该作者 6楼 发表于: 2010-06-10
'
应该仔细看一下bd1es的回答,说得非常清楚了。
'

谢谢老大,:).
离线代洪波
发帖
4809
只看该作者 7楼 发表于: 2010-06-15
这个子程序必须在编译环境调试的 时候打开反编译功能,结合你使用的 单片机指令时间来计算。比如 传统atmel的和stc的指令执行时间都不一样
离线BG9CNF
发帖
988
只看该作者 8楼 发表于: 2010-06-15
[quote=代洪波]这个子程序必须在编译环境调试的 时候打开反编译功能,结合你使用的 单片机指令时间来计算。比如 传统atmel的和stc的指令执行时间都不一样[/quote]

严重同意!!