首先我們來看個簡單的例子
51#include "reg52.h"
//此檔案中定義了微控制器的一些特殊功能暫存器
typedef
unsigned
int u16;
//對資料型別進行宣告定義
typedef
unsigned
char u8;
sbit led=p2^0;
//將微控制器的p2.0埠定義為led
void
delay
(u16 i)
void
main()
}
我們使用keil的反彙編功能,將關鍵的延時**轉換為組合語言,因為組合語言可以精確的算出延時時間
29
:void
main()
30:c:0x0812
80ec sjmp main
(c:0800)c:
0x0814
787f mov r0,#0x7f
c:0x0816 e4 clr a
c:0x0817 f6 mov @r0,a
c:0x0818 d8fd djnz r0,c:
0817
c:0x081a
758107 mov sp
(0x81
),#0x07
c:0x081d
020800 ljmp main
(c:0800)18
:void
delay
(u16 i)19:
我在這裡大致畫出了這段**的流程圖
然後計算關鍵**的時間
void
delay
(u16 i)
可以算出總計為:1+1+1+2+2+2=9(機器週期)
總時間等於 50000*9=450000(機器週期)約等於450ms
80c51微控制器外接了乙個11.0592m的晶體振盪器,那我們就說這個微控制器系統的時鐘週期是1/11.0592m,8051系列微控制器的的時鐘頻率是晶振頻率的12分頻,乙個機器週期約為1us
然後我們再來看一段帶有迴圈功能的延時**
void
delay
(uint z)
delay
(1000);
//延時1000毫秒
我們將其翻譯成機器語言
迴圈部分:
小迴圈y
c:
0x0842
edmov a,
r51
c:0x0843
1d dec
r51
c:0x0844
7001
jnz c:
0847
2 c:
0x0846
1c dec r4 (
1)
c:0x0847
edmov a,
r51
c:0x0848
4c orl a,
r41
c:0x0849
70f7
jnz c:
0842
2 +1
+2+1
+1+2
=8(機器週期)
`大迴圈
```csharp
(c:0x082a
7fe8 mov r7,#0xe8
c:0x082c
7e03 mov r6,#0x03)c:
0x083e
7d01 mov r5,#0x78
1
c:0x0840
7c00 mov r4,#0x001c:
0x0835
d3setb
c1
c:0x0836
efmov a,r71
c:0x0837
9400
subb a,#0x001c:
0x0839
eemov a,
r61
c:0x083a
9400
subb a,#0x001c:
0x083c
4014
jc c:
0852
2【小迴圈】
c:0x084b
efmov a,
r71
c:0x084c
1fdec
r71
c:0x084d
70e6 jnz
delay
(c:0835
)2
迴圈總時間=大迴圈次數
=(13+8120)*1000
=973000 約等於1000us
ok
51微控制器彙編延時分析
51微控制器彙編延時分析 第一句是定義乙個延時函式標號,並將250傳到r7。第二句是放置乙個標號,並把250放到r6。延時函式 delay mov r7,250 1 d1 mov r6,250 2 d2 djnz r6,d2 3 djnz r7,d1 4 ret 5第一句是定義乙個延時函式標號,並將...
微控制器C語言延時分析
1.例1,12mhz晶振除錯 以下兩個是無引數的delay函式,內部用的是for迴圈來delay。lcall 2個週期 mov a到rx 1個週期 clr 1個週期 inc 1個週期 cjne 2個週期 ret 2個週期 lcall ret clr mov 110 inc cjne 2 2 1 1 ...
51微控制器延時函式
c程式中可使用不同型別的變數來進行延時設計。經實驗測試,使用unsigned char型別具有比unsigned int更優化的 在使用時應該使用unsigned char作為延時變數。以某晶振為12mhz的微控制器為例,晶振為12mhz即乙個機器週期為1us。一.500ms延時子程式 程式 voi...