设晶振频率为12M,
单片机为AT89C51。则知一个机器周期为1us。现有延时函数如下:
3: void delay(void)
4: {
5: unsigned char i,j,k;
6: for(i=15;i>0;i--)
7: for(j=202;j>0;j--)
8: for(k=81;k>0;k--);
9: }
以上就是利用C51语言编写的一个延时函数,下面这段代码则是利用keil软件翻译的一段汇编语言
程序段,大家可以对照着看。
机器周期数
C:0x0800 7F0F MOV R7,#0x0F 1
C:0x0802 7ECA MOV R6,#0xCA 1
C:0x0804 7D51 MOV R5,#0x51 1
C:0x0806 DDFE DJNZ R5,C:0806 2
C:0x0808 DEFA DJNZ R6,C:0804 2
C:0x080A DFF6 DJNZ R7,C:0802 2
C:0x080C 22 RET 2
通过上面的汇编语言程序段(0x0F=15,0xCA=202,0x51=81 ),我们可以计算出该延时子程序的具体延时时间:
Td=[(2×81+1)×202+202×2+1]×15+15×2+1+2
=(163×202+405)×15+35
=33331×15+33
=499978us=499.978ms
通过与
C语言相比较,我们可以得出一个公式(对于C51,这个公式中的格式就跟上面的一样,数据类型必须是unsigned char,而且是三重循环,延时函数不带任何形参):
Td=[2×j×k+3×j+3]×i+3.....................①
下面是调用了上面的延时函数的C51主函数,紧跟其后的汇编语言是利用keil软件翻译的一段汇编语言程序段。
11: void main(void)
12: {
13: p10=1;
14: while(1)
15: {
16: p10=~p10;
17: delay();
18: }
机器周期数
C:0x0819 D290 SETB p10(0x90.0) 1
C:0x081B B290 CPL p10(0x90.0) 1
C:0x081D 120800 LCALL delay(C:0800) 2
C:0x0820 80F9 SJMP C:081B 2
倘若我们需要一个带有形参的延时函数,方便在程序中根据不同的情形调用,延时时间不一致,我们的延时时间又如何计算呢?下面我们来看看这个延时函数,跟上面的一样,只是把延时函数加了个形参,我们用同样的方法来计算它的延时时间。
3: void delay(unsigned char i)
4: {
5: unsigned char j,k;
6: for(;i>0;i--)
7: for(j=202;j>0;j--)
8: for(k=81;k>0;k--);
9: }
机器周期数
C:0x800 EF MOV A,R7
C:0x0801 D3 SETB C
[1] [2] 下一页
本文关键字:C语言 51单片机,单片机-工控设备 - 51单片机