⑴ 單片機C語言的延時程序源碼分析,希望能幫我加註釋,告訴我每句語句的含義謝謝!
H_DATA BIT P3.2 將p3.2引腳命名為H_DATA,以後用H_DATA就能代表P3.2
H_CLK BIT P3.4 同上,將P3.4命名為H_CLK
?PR?DELAY30US SEGMENT CODE 函數DELAY30US聲明
PUBLIC DELAY30US
RSEG ?PR?DELAY30US
; abc XDATA 0A00H
;35.8US
DELAY30US: 函數體
PUSH 05H ;2因為函數用到R5,所以將進入函數之前的R5壓入堆棧,返回前提出
MOV r5,#50 ;25 為R5賦值
DE30S1:
DJNZ r5,DE30S1 ;2*14=28 對R5減一,判斷不等於零跳到DE30S1;等於零退出
POP 05h ;2把進入函數前的R5恢復
RET 函數返回
;******************************************************************
?PR?DELAY10US SEGMENT CODE 聲明DELAY10US函數
PUBLIC DELAY10US
RSEG ?PR?DELAY10US
;16.3US
DELAY10US: DELAY10US函轎段數體
PUSH 05H ;2因為函數用到R5,所以將進入函數之前的R5壓入堆棧,返回前提出
MOV r5, #20 ;10為R5賦值
DE10S1:
DJNZ r5, DE10S1 ;5*2=10對R5減一,判斷不等於零跳到DE10S1;等於零退出
POP 05H ;2把進入函數前的R5恢復
RET 函數返回
?PR?CLSSIGNAL SEGMENT CODE 聲賀雹明函數CLSSIGNAL
PUBLIC CLSSIGNAL
RSEG ?PR?CLSSIGNAL
CLSSIGNAL:
;WHEN SYSTEM SEND INFORMATION TO PINPAD, SEND STOP BIT AT END, THEN NEXT A
;SEND OPERATION. SO WAITTING STOP BIT FINISHED.
CLSL1:
PUSH 05H 因為函數用到R5,所以將進入函數之前的R5壓入堆棧,返回前提出
CLSL1_U:
MOV R5, #6EH 對R5賦值
CLSL2: JNB H_DATA, CLSL1_U 判斷p3.2不為零跳轉,繼續閉拍譽賦初值
JNB H_CLK, CLSL1_U 判斷p3.4不為零,繼續賦初值
DJNZ R5, CLSL2 如果兩個輸入都為零對r5減一,不為零跳到clsl2
POP 05H
RET
END
⑵ 請幫忙在51系列單片機系統中,編寫一個延時1ms的子程序。謝謝。。
1、首先,在電腦中打開keil軟體,創建好工程,然後添加c文件,如下圖所示。
⑶ 51單片機,晶振為6M請幫忙寫一個10ms的延時程序,能有詳細解釋的。因為我還不知道這個延時的時間是怎麼算
延時有很多種方法,有一種是讓單片機去做無聊的循環,
還有一種是用定時器。
我本身也是菜鳥所以只能粗略的講一下。
第一種的演算法是
晶振的周期T1=1/f; 這里f=6MHz 所以T1=1/6 us;(微秒)
單片機花12個T1去執行一個指令,
所以一個機器周期等於12個晶振周期,
T2=12*T1=2us
10ms=1000 0us
所以你要得到10ms的延時就要想辦法讓機器去做5000條「無聊的指令」
所以
DEL: MOV R5,#05H
F1: MOV R6,#05H
F2: MOV R7,#32H
F3: DJNZ R7,F3
DJNZ R6,F2
DJNZ R5,F1
RET
這種方法是用於對時間要求不高的地方,我說的是其思想,程序中可能有錯的地方
用定時器的方法我不太會就不誤人了 (補充一下就是這個是用匯編寫的,你在主程序中用ACALL DEL調用就延時了。
⑷ 單片機延時時間程序怎麼編程
舉一個例子來說明吧.比如你要編一個延時50毫秒的子程序,那麼步驟如下:
1、查看一下你的硬體環境,比如晶振大小,CPU型號,不用CPU指令的機器周期是不一樣的。
2、計算延時需要的機器周期。比如採用12M晶振,CPU採用通用8051,那麼一個機器周期為1US,50毫秒為50*1000=50000US,需要的機器周期=50000/1=50000。
3、試編程,如下:
程序代碼 指令時間 總共時間
DELAY50MS: ;2 2
MOV R7,#A ;1 1
DELAY1:
MOV R6,#B ;1 1*A
DJNZ R6,$ ;2 2*B*A
DJNZ R7,DELAY1 ;2 2*A
RET ;2 2
所以總時間=2+1+A+2*A*B+2*A+2=5+3A+2AB
4、湊數求A、B
根據2、3得到如下式子:
50000=5+3A+2AB
可以有很多種結果,不過最好是以A盡可能小,B盡可能大為原則,當然不能大於255.
我現在湊出A=110,B=225;那麼總延時時間=5+3*110+2*110*225=49835。還差165US
5、補齊不夠時間
再加一個小循環就OK了,呵呵如下:
MOV R6,#C
DJNZ R6,$
會算了吧,2*C+1=165;所以C=82。
現在完整的延時程序出來了,如下:
DELAY50MS: ;2 2
MOV R7,#110 ;1 1
DELAY1:
MOV R6,#225 ;1 1*110
DJNZ R6,$ ;2 2*225*110
DJNZ R7,DELAY1 ;2 2*110
MOV R6,#82 ;1 1
DJNZ R6,$ ;2 2*82
RET ;2 2
很圓滿:總的時間50000微妙,也就是50毫秒。這種方式編程,在該硬體環境下可以保證最大誤差為1微妙。