单片机C语言延时程序的计算,是什么样的算法,请求高手。

单片机STC89C52,8位,12M,程序如下:
void delay(unsigned int cnt)
{
while(--cnt);
}
主程序有delay(1000)
请问delay(1000)延时了多长时间,是怎么算的,希望高手能解决,
还有就是如果是void delay(unsigned char cnt)又是怎么算的呢,两者的区别在哪里?

void delay(unsigned char cnt)和void delay(unsigned int cnt)意义上是一样的
延时程序的延时过程,是
while(--cnt);
程序运行过程中消耗的时间
如何计算时间
这要根据你单片机上的晶振频率
51系列单片机1个机器周期等于12个时钟周期,12MHz晶振的话一个机器周期=1/12MHz*12=1us
delay(1000),
delay(1000)即--cnt这条指令运行1000次,消耗1000个机器周期,即1ms。在这个程序上运行消耗1ms时间,相当于延时1ms。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-02-07
STC89C52, 12M delay(1) 延时大约为14us delay(1000)大约14ms
第2个回答  推荐于2017-10-06
1、一条指令执行的时间是1/12m=1us(算作一微秒);delay(1000);就需要减1000次,就应该是1000*1us=1ms。
2、每减一次需判断是否到0;翻译为汇编语言后应该是cjne指令,一个cjne指令用2个周期,1000个cjne就是2000周期,共用2ms。
3、调用函数时有赋值,应为是8位机,int为16位,赋值就要用两个周期,每减一次需判断低八位是否减到零,又会翻译为cjne指令,这个就不好算了,大概也要1~2ms,看你传递的参数而定,参数越大用时越大。
delay(1000);就应该用1+2+2=5ms。
void delay(unsigned char cnt)用时和上面算法差不多,只是它传递的参数为8为的,值为0~255,最大延时小于上面。本回答被提问者采纳
相似回答