在温度测量程序中,有如下代码:
TMDAT = 0; //总线拉低 delay = 250; while (--delay); //延时500us TMDAT = 1; //拉高总线
而根据选用的晶振11.0592MHz,则晶振周期为Tosc = 1/fosc = 1/(11.0592*1000*1000) = 0.09042us,而机器周期为Tcy=12*Tosc=1.085us,一般一条指令执行周期是1到2个机器周期,也就是1.085us到2.170us。
上面代码中延时程序部分,翻译成汇编语言大致为:
mov r2,#0xFA // 250 mov r3,#0x00 00101$: mov ar4,r2 2 mov ar5,r3 2 dec r2 1 cjne r2,#0xff,00108$ 2 dec r3 1 00108$: mov a,r4 2 orl a,r5 1 jnz 00101$ 2
循环部分为13*250个机器周期,所以红色代码部分总共的机器周期为:13*250 + 4=3254个机器周期,所以延时大约为(13*250+4)*Tcy=3254*1.085=3530.59us,也就是延时了3500微秒,比注释中的长大约7倍。
不知道我分析得对不对? |