❶ 單片機—DJNZ 指令練習
單片機實戰:深入理解DJNZ指令
一、精準延時
在12MHz的時鍾頻率下,一個機器周期僅為1微秒。若要實現10毫秒的延時,我們可以巧妙地利用DJNZ指令。首先,將R6的初始值設為20,對應於一個機器周期。在循環開始後,進入D2標簽:
二、點亮閃爍燈
在P1.0口連接一個LED燈L1,我們目標是實現0.2秒的亮滅交替。從ORG 1000H地址開始,設置燈亮後調用DELAY函數進行延時,接著熄滅:
三、流水燈的魅力
在P1口上,我們通過延時控制實現流水燈效果。當程序跳轉到MAIN標簽,先將所有燈熄滅,然後逐個點亮:
通過這些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