打印

关于DELAY函数的一点困惑

[复制链接]
1870|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
scslph|  楼主 | 2012-11-23 21:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
先声明,本人新手,问题低级,大家莫笑,就拿这段函数来说好了:#include <AT89x51.h>void Delay(unsigned int i)      //延时程序,i是形式参数
{
unsigned int j;
for(;i>0;i--)             //变量i由实际参数传入一个值,因此i不能赋初值
for(j=0;j<125;j++)     这一句一直不是很明白,这里面的125这个数字是从何而来的,有没有相关的计算方法??根据晶振的振荡频率?还是说根据芯片的特性,(这里用的芯片是89C51)?还请哪位大神给解疑答惑啊!!!!小弟不甚感谢。
{;}
}
void main(void)
{
unsigned char a,k;
k=0x80;
for(a=0;a<8;a++)
{
P1=k;
Delay(1000);         //延时
k=k>>1;
}
}

相关帖子

沙发
dqyubsh| | 2012-11-23 22:26 | 只看该作者
1,这种软件延时一定和系统时钟频率相关,要想计算它的具体时间,一般要在调试状态下转换成汇编语句,查有多少条指令,每条指令多少个时钟周期,然后根据时钟频率算出每个时钟周期是多少us,再乘法……
2,这样的程序无非就是测试个简单功能,没必要这么较真,估算一下,测验一下就完事
3,更多人用示波器之间量管脚,看看管脚跳变一次周期是多少,一目了然。
4,有些编译器有自己的delay函数,要比这个好用一些。比如GCC、IAR……
5,delay在实际的系统中很少使用,除非是一个完全中断的系统里才有可能会用delay
6,或者根本可以忘掉它。

使用特权

评论回复
板凳
scslph|  楼主 | 2012-11-24 21:04 | 只看该作者
2# dqyubsh 是这样的,我看到在跑马灯程序里大量使用DELAY函数,就是里面的数字不知道是怎么确定的,如果是估算的话,怎么估算才相对来说接近真实情况呢?

使用特权

评论回复
地板
dqyubsh| | 2012-11-24 22:04 | 只看该作者
学木了。闪快了就加循环,慢了就减循环,又没人要求你一定1s变化一次,都是碰上去的。

使用特权

评论回复
5
0欧电阻| | 2012-11-27 11:24 | 只看该作者
从你的主程序看,在主程序延迟后面加一个断点,基本上执行的断点的时间就是延迟的时间。delay是不准确的。要想准确计时你得用定时器中断。

使用特权

评论回复
6
shuai37zhang| | 2012-11-27 17:02 | 只看该作者
二楼解释很清楚了,楼主仔细研究吧

使用特权

评论回复
7
lanpiaoxian| | 2012-11-27 17:12 | 只看该作者
学木有了

使用特权

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

本版积分规则

0

主题

16

帖子

0

粉丝