導航:首頁 > 編程語言 > 單片機編程為什麼要延遲10毫秒

單片機編程為什麼要延遲10毫秒

發布時間:2024-12-13 06:25:23

單片機—DJNZ 指令練習

單片機實戰:深入理解DJNZ指令



一、精準延時


在12MHz的時鍾頻率下,一個機器周期僅為1微秒。若要實現10毫秒的延時,我們可以巧妙地利用DJNZ指令。首先,將R6的初始值設為20,對應於一個機器周期。在循環開始後,進入D2標簽:


MOV R7, #249
D2: MOV R6, #20
DJNZ R7, $
DJNZ R6, D2
在這一系列操作中,每一步消耗2個機器周期,總計1+249×2+2個周期。總的延時計算如下:t = 1 + 20 × (1 + 249 × 2 + 2) = 10021 微秒,接近10毫秒的精確延時。

二、點亮閃爍燈


在P1.0口連接一個LED燈L1,我們目標是實現0.2秒的亮滅交替。從ORG 1000H地址開始,設置燈亮後調用DELAY函數進行延時,接著熄滅:


START: SETB P1.0
LCALL DELAY
CLR P1.0
LCALL DELAY
SJMP START
DELAY函數的核心代碼如下:
DELAY: MOV R5, #20
D1: MOV R6, #20
D2: MOV R7, #249
DJNZ R7, $
DJNZ R6, D2
DJNZ R5, D1
RET
總計t = 20 × [1 + (1 + 249 × 2 + 2) × 20 + 2] = 200460 微秒,接近0.2秒的閃爍周期。

三、流水燈的魅力


在P1口上,我們通過延時控制實現流水燈效果。當程序跳轉到MAIN標簽,先將所有燈熄滅,然後逐個點亮:


ORG 0030H
MAIN: MOV A, #0FFH
MOV P1, A // 滅掉所有燈
MOV A, #0FEH
MAIN1: MOV P1, A // 開P1.0口的燈
ACALL DELAY
RL A // 依次點亮其他燈
SJMP MAIN // 循環
在DELAY函數中,每一輪延時130815微秒,t = 255 × (1 + 255 × 2 + 2) = 130815 微秒,實現了0.13秒的燈亮循環。

通過這些DJNZ指令的實際操作,我們不僅掌握了延時和燈控制的基本技巧,還深入理解了單片機的時序邏輯。這些小練習不僅提升了編程技能,也為更復雜的項目打下了堅實基礎。

❷ 用C語言怎麼在單片機AT89C51上編寫一個延時10秒的程序

1、十秒對於單片機來說是很長很長的時間了,單片機十秒的時間什麼事都不能做,只在跑這延時程序,那是什麼概念,用中斷的話,單片機正常運行其他程序,只是時間到了才過來處理延時以後的程序,效率不知道高了多少 。

2、常式:

//假設晶振12MHZ

#include"reg51.h"
unsignedintYSJS=0;
voidmain(void)
{
TMOD|=0X10;//定時器1工作於方式1,16位定時器
TH1=0XFF;//定時器1定時時間=500uS
TL1=0X06;
ET1=1;//使能定時器1中斷
EA=1;//開總中斷
while(1)
{
}
}
voidTIMER1(void)interrupt3//定時器1中斷函數使用默認寄存器組
{
TH1=0XFF;//定時器1定時時間=500us
TL1=0X06;
YSJS++;
if(YSJS==20000)//500uS*20000=10000000us=10s
{
P1=P1^0X01;//P1.0十秒鍾翻轉一次
YSJS=0
}
}

❸ 求助單片機軟體延時10ms的程序和計算方法(急)

程序如下.
ORG 0000H
SJMP START
ORG 0030H
START:
MOV TMOD, #01H ;T0定時方式1
MOV TH0, #0D8H ;10ms@12MHz
MOV TL0, #0F0H ;65536-10000=D8F0H
SETB TR0 ;啟動.

WAIT: ;下面使用查詢方式.
JNB TF0, WAIT ;沒有溢出就循環等待.
MOV TH0, #0D8H ;到了10ms,重新寫入初始值.
MOV TL0, #0F0H ;65536-10000=D8F0H
CLR TF0
;-----------------------------------------------
;在這里編寫 每到10ms 應該執行的指令.
CPL P1.0 ;可以使外接的LED閃光.
;-----------------------------------------------
SJMP WAIT ;繼續查詢.
END

❹ 如何利用單片機匯編指令編程實現延時10ms利用匯編指令設計多重循環編程實現20ms延時

這是調用一個延時10毫秒的延時子程序 當然,子程序的名字可以自己定 DELY1MS: 這個名字一定要與調用中出現的名字一樣,否則的話,調用的就不是這個子程序了

DELAY10MS:
MOV R2,#20
DELAY10MS1:
MOV R3,#250
DJNZ R3,$
DJNZ R3,DELAY10MS1
RET

這是調用一個延時20毫秒的延時子程序 當然,子程序的名字可以自己定 DELY1MS: 這個名字一定要與調用中出現的名字一樣,否則的話,調用的就不是這個子程序了

DELAY20MS:
MOV R2,#40
DELAY20MS1:
MOV R3,#250
DJNZ R3,$
DJNZ R3,DELAY20MS1
RET

RETRET的作用是子程序返回。調用一個子程序,當單片機執行到RET語句的時候,單片機就會返回到調用的地方並繼續向下執行。

下面給你一個常式:

閃爍燈

ORG 00H

AJMP START

ORG 30H

START:

MOV P0,#00H

LCALL DELY;調用延時子程序

MOV P0,#0FFH

LCALL DELY;調用延時子程序

AJMP START

DELY:

MOV R7,#250

DL1:MOV R6,#250

DJNZ R6,$

DJNZ R7,DL1

RET

❺ 51單片機C語言程序中延時函數delay的原理是什麼

原理:只是執行一些所謂的「無實際意義的指令」,如縮放或執行一個int自加,簡單地說,就像高中數學中的「乘法原理」一樣,很容易迅速增加上面提到的「無意義指令」的數量

關於大小的值:如果是在C語言中,該值不僅與水晶振動、單片機本身的速度,但也與C的編譯器,所以,雖然這個值可以精確計算,但大多數情況下,程序員是經驗值。

當然,如果你在匯編中編程,情況就不同了,因為每條指令使用一定數量的機器周期,你當然可以根據所有指令使用的總時間來計算特定延遲的總時間。

(5)單片機編程為什麼要延遲10毫秒擴展閱讀:

定義延遲XMS毫秒的延遲函數

Voiddelay(unsignedintXMS)//XMS表示需要延遲的毫秒數

無符號intx,y;

For(x=XMS;X0;X-)

For(y=110;Y」0;Y-);

使用:

VoidDelay10us(ucharMs)

Uchar數據我;

(;女士「0;------Ms)

對於(I = 26)我> 0;我-);

I=[(延遲值-1.75)*12/ms-15]/4

閱讀全文

與單片機編程為什麼要延遲10毫秒相關的資料

熱點內容
arj壓縮與解壓批處理怎麼寫 瀏覽:658
php和大數據哪個好 瀏覽:930
未來最值得投資的加密貨幣 瀏覽:526
ascii碼是編譯的時候用嗎 瀏覽:781
壓縮機感應包可以通用嗎 瀏覽:412
方舟伺服器怎麼發布到搜索列表 瀏覽:270
xml防反編譯 瀏覽:241
數據傳輸加密系統技術方案 瀏覽:842
程序員沒有準備去面試 瀏覽:4
51單片機usb滑鼠 瀏覽:881
qq伺服器的ip地址查詢 瀏覽:112
java仿qq聊天 瀏覽:400
解壓的ipa重新打包 瀏覽:142
程序員那麼可愛vip版 瀏覽:240
程序員怎麼升職 瀏覽:243
圖形化命令按鈕vb 瀏覽:987
vcu盤加密怎麼設置 瀏覽:415
如何加密備份微信聊天記錄 瀏覽:529
安卓手機如何模擬鍵盤 瀏覽:932
查看dns地址命令 瀏覽:769