1樓:
你先看下這段延時程式:
採用12m晶振,用51晶片處理。
delay: mov r7,#250;
d1:mov r6,#250;
d2:djnz r6 ,d2;
djnz r7,d1;
ret以上是一段延時0.125秒的程式。
它計算的原理是:
這段程式最終執行了250*250次,而djnz指令執行需要2個機器週期,一個機器週期需要1微秒的時間,所以以上延時程式就是250*250*2=0.125秒。
你的程式原理跟這個應該是一樣的~
2樓:匿名使用者
ys2:mov r4 ,#10 給r4置入初值10d2:mov r5,$ 給r5置入當前地址
djnz r4,d2 r4減1不為0跳到d2處
ret r4為0時子程式結束返回
延時4.74毫秒是與晶振有關的。
3樓:手機使用者
r7,#0ffh
djnz r7,$
ret;1ms延時程式
dl1ms: mov r5,#02h
loop: lcall dl513 ;515usdjnz r5,loop
ret ;總時1034us有1.034ms;3ms延時程式
dl3ms: mov r4,#03h
loop2: lcall dl1ms ;1036usdjnz r4,loop2
ret ;總時3117us有3.117ms;10ms延時程式
dl10ms: mov r6,#14h
loop1: lcall dl513 ;515usdjnz r6,loop1
ret ;總時7241us只有7.241ms;1s延時程式
dl1s:
mov r2,#100
djnz r2,dl10ms ;7243usret ;總時724303us只有0.724303s;5s延時程式
dl5s: mov r3,#05h
djnz r3,dl1s ;724305usret;總時3621528us只有3.621528s1、如此做累積誤差會比較大
2、用定時器做較長時的延時精度會高一些
3、用多重迴圈也要比迴圈巢狀好些
比如:kkkk0:mov r2,#xx
kkkk1:mov r3,#ll
kkkk2:mov r4,#nn
kkkk3:mov r5,#mm
djnz r5,$
djnz r4,kkkk3
djnz r3,kkkk2
djnz r2,kkkk1
ret適當選擇各迴圈常數
求解釋!!!組合語言:延時程式
4樓:生活如歌
需要注意的一點就是djnz指令是2週期的,所以你的時間是迴圈次數乘以2.
delay:mov r7,#250
del1:mov r6,#100
del2:mov r5,#10
djnz:r5,$;2個機器週期
djnz:r6,dl2
djnz r7,dl1
2*10*100*250=500000us=0.5s以上時間只是大概值,沒有考慮其它指令的週期,但影響不大。
5樓:匿名使用者
delay:mov r7,#250 第一層迴圈250次
del1:mov r6,#100 第二層迴圈100次
del2:mov r5,#10 第三層迴圈10次
djnz:r5,$ 如果r5不等於0,則跳轉到本行,也就是空轉10次
djnz:r6,dl2 如果r6不等於0,則跳到dl2行,給r5賦值
djnz r7,dl1 如果r7不等於0,則跳到dl1行,給r6賦值
所以總的空轉迴圈次數是250*100*10=250000次,通過調節r5,r6,r7值來控制延時時間
彙編 延時子程式
6樓:匿名使用者
daily proc near
mov cx,2000h
d0:mov ax,0ffffh
d1:dec ax
jz d1
loop d0
daily endp
延時大概是0.33s
其實延時跟cpu有很大關係,不能用軟體精確計算,可以用8254實現,硬體和軟體功能具有邏輯上的等效性。
7樓:匿名使用者
用delay來產生延時在要求較高的場合不大合適。
可呼叫系統時間來產生準確的延時,並且可控制延遲時間temp: mov ah,2ch
int 21h
add dh,5 ;獲得時間.dh為 當前的秒數,5秒可以自己選擇
push dx
wait:
pop dx
mov al,dh
push dx
mov ah,2ch ;新的時間
int 21h
cmp dh,al
jb wait ;小於5秒的話繼續查詢歡迎討論
8樓:
多麼準確?時間範圍多少?
微控制器就用定時器,pc就用bios提供的延時中斷呼叫(好像是68h中斷),去查查書吧。
9樓:前皛石鴻福
首先看第二組,d2:
movr2,#05h
djnz
r2,d2
這是一個死迴圈,出不來。
然後看第一組,
d1:mov
r2,#05h
d2:nop
djnz
r2,d2
,執行五遍d2。然後檢查r1,不為0,在執行五遍d2,然後檢查r1,為0。結束
再看第三組
d2:nop
djnz
r2,d2
執行五遍d2,然後檢查r1,不為0,跳到d1,但是此時r2為0,減去一後變成0ffh,執行256次d2,r2變為0,然後在檢查r1,為0後返回。
求組合語言延時程式,延時10毫秒的延時程式
10樓:做而論道
第一、組合語言有好多種。
第二、延時時間和你用的主頻有關。
這兩個問題,樓主說明一下先。
11樓:大別山的蝸牛
**如下:
delay10s:
lcall delay100ms
inc r1
cjne r1,#100,delay10smov r1,#0
retdelay100ms: ;誤差 0usmov r7,#100
dl1:
mov r6,#8eh
dl0:
mov r5,#02h
djnz r5,$
djnz r6,dl0
djnz r7,dl1ret
12樓:匿名使用者
51微控制器12m晶振延時10毫秒程式:
delay10ms:
mov r2,#20
delay1:
mov r3,#249
djnz r3,$
djnz r2,delay1
ret共延時10.023ms
13樓:最愛楷心
首先明確機器執行一條指令耗時大概是1us那麼延時10ms的程式如下:mov ax,50l1:mov bx,100l2:
dec bx jnz l2dec axjnz l1執行完之後時間大約為10ms多一點
根據具體問題型別,進行步驟拆解/原因原理分析/內容拓展等。
具體步驟如下:/導致這種情況的原因主要是……
組合語言延時程式幫忙解釋一下
14樓:匿名使用者
程式看不大清楚,編一個類似程式來說明吧。
delay:
mov r7,#20 ;1
dly:
mov r6,#100 ;1*20
djnz r6,$ ;2*100*20djnz r7,dly ;2*20
ret ;2
以上各行指令註釋的第一個數字是執行該條指令所用的機器週期。後面資料是共執行了多少次改指令。
累計和就是延時時間(機器週期),換算成ms或s就可以了。
組合語言5秒的延時程式怎麼寫(微機原理)
15樓:做而論道
lcall dl500ms
lcall dl500ms
lcall dl500ms
……共十次,正好是5s。(假設晶振頻率是12mhz)dl500ms 延時時間的說明,可見:
16樓:匿名使用者
可以用定時器,這樣比較精準點。不用定時器那隻能用迴圈了,根據晶振計算5秒時間的迴圈次數賦初值,然後迴圈。
17樓:匿名使用者
可以用定時器,這樣比較精準點
求單片程式(彙編程式),求一個單片程式(彙編程式)
共陰數碼管,段接p2口 控制按鍵按p0.0,低電平有效。org 0000h start mov r0,00h mov dptr,tab loop mov a,r0 movc a,a dptr cpl a mov p2,a acall delay jb p0.0,num inc dec r0 mov ...
彙編子程式的問題,組合語言子程式是如何定義的
這不是返回自己本身迴圈執行,而是跳轉到子程式的第一行迴圈而已,有什麼不可以的,迴圈結構,任何地方都可以的。但有一點,子程式不論迴圈多少次,最終必須執行一行返加指令ret,也就是子程式必須要有一條ret指令,你的子程式最後是缺少一行ret指令的,加上了就可以的。組合語言子程式是如何定義的?這樣定義的 ...
用組合語言編寫程式,用組合語言編寫一個程式。
那個 是可以,但是其實可以更簡單,小寫字母內碼範圍是61h 7ah 大寫字母內碼範圍是41h 5ah 那麼只要比較輸入的字元內碼是否在61h 7ah之間如果是,則將其減去20h,就是大寫字母了 print macro para 定義一個顯示字串的巨集 lea dx,para mov ah,9 int...