51单片机的延时函数怎么计算?
本人刚学单片机,请问下例语句的延时时间计算,谢谢!void delay(uchar t)
{
uchar t1;
unsigned long t2;
for(t1=0;t1<t;t1++)
{
for(t2=0;t2<4000;t2++);
}
TR0=0;
}
C程序没办法直接计算,要具体看生成的汇编程序
这里推荐一个本人很久前写的延时函数,C语言写的,延时飞常准
https://wenku.baidu.com/view/cafedacfa1c7aa00b52acb87
void delayms(unsigned char t)
{
unsigned char j;
unsigned char i;
do
{
j=3;
do
{
i=165;
do
{
--i;
}
while(i!=0);
--j;
}
while(j!=0);
--t;
}
while(t!=0);
}
该程序延时时基为1ms,所以最大延时时间是255ms
下面是反编译的汇编程序
C:0x0031 7E03 MOV R6,#0x03
C:0x0033 7DA5 MOV R5,#0xA5
C:0x0035 DDFE DJNZ R5,C:0035
C:0x0037 DEFA DJNZ R6,C:0033
C:0x0039 DFF6 DJNZ R7,delayms(C:0031)
C:0x003B 22 RET
延时时间计算公式如下:
((R5*2 + 2+1)*R6+2+1)R7
假设R7=1,上式为(165*2+3)*3+2+1 =1002us!!!!! while1里面翻转单片机引脚,加入延时函数,上示波器看 先看编译后生成汇编指令,再去查手册指令表相应指令执行的时钟周期个数,算出每条指令的执行时间,你的延时程序每条指令的执行时间累加起来就是了,有的不好懂,下面举个例子,
比如: MOVC A, @A+DPRT 是4个时钟周期的指令,若系统时钟是12MHz的,这个条指令执行一次所用的时间就是 4 * 1/12 (us) 。 如果用STC的单片机,可以通过其ISP工具中的软件延时计算器进行计算 20061002838 发表于 2020-7-1 12:37
C程序没办法直接计算,要具体看生成的汇编程序
这里推荐一个本人很久前写的延时函数,C语言写的,延时飞常 ...
谢谢,汇编完全看不懂!{:smile:} STC下程序那个ISP软件里有代码生成器
能够根据需要自动生成相应的延迟函数代码和定时器代码 如果是入门的话,会用就行,没必要精准计算;
当你真正做项目时才会明白,做时间延时或计时,都是用定时器中断产生基准时钟比如5ms标志,在主循环用计时器计时扩展的,做基准时钟的倍数计时或延时非常精准;
页:
[1]