利用定時(shí)方式0,測(cè)量外部脈沖寬度(5到250ms),74HC595輸出顯示
;有人提問:
;利用單片機(jī)的定時(shí)方式0,實(shí)現(xiàn)外部脈沖寬度(在5到250ms)的測(cè)量。要求畫出電路圖。在線等
;問題補(bǔ)充:寫出程序,測(cè)量結(jié)果存儲(chǔ)在R0中。
;=================================================
;做而論道對(duì)此題給出了答案:
;外部脈沖寬度(在5到250ms)之間,測(cè)量存放在R0。程序如下。
ORG 0000H
JMP START
ORG 000BH
JMP T0_INT
;------------;初始化
START:
MOV SP, #60H
MOV TMOD, #01H ;/*T0定時(shí)方式1*/
MOV TH0, #HIGH(65536 - 1000) ;1ms@12MHz
MOV TL0, #LOW (65536 - 1000)
SETB ET0
SETB EA
MOV R0, #0
;------------;電路:要把外部脈沖,接在P1.0
JB P1.0, $ ;等待高電平結(jié)束.
JNB P1.0, $ ;等待低電平結(jié)束.
SETB TR0 ;到了高電平,就啟動(dòng)T0開始計(jì)時(shí).
JB P1.0, $ ;等待高電平結(jié)束.
CLR TR0 ;到了低電平,結(jié)束T0計(jì)時(shí).
CALL DISPLAY ;顯示
SJMP $ ;程序到此結(jié)束, R0中就是脈寬的毫秒數(shù).
;-------------;1ms執(zhí)行一次
T0_INT:
MOV TL0, #LOW (65536 - 993) ;重新寫入初始值.
MOV TH0, #HIGH(65536 - 993) ;1ms@12MHz
INC R0 ;1ms加一次一.
RETI
;---------------------------------
;原題目,并沒有提出顯示測(cè)量結(jié)果的要求,這就不便觀察。
;為此,下面補(bǔ)充了顯示電路(以三個(gè)74HC595來(lái)驅(qū)動(dòng)數(shù)碼管)和程序。
SDAT_595 BIT P3.0
SCLK_595 BIT P3.1
S_UP_595 BIT P3.2
;**************************************************
;595發(fā)送程序
;**************************************************
OUT_595:MOV R2, #8
CPL A
O_1: RLC A
NOP
MOV SDAT_595, C
NOP
CLR SCLK_595
NOP
SETB SCLK_595
NOP
DJNZ R2, O_1
RET
;**************************************************
;顯示程序
;**************************************************
DISPLAY:
MOV A, R0 ;把脈寬數(shù)據(jù),分解成
MOV B, #100 ;BCD碼
DIV AB;
MOV 30H, A ;百位
MOV A, #10;
XCH A, B;
DIV AB;
MOV 31H, A ;十位
MOV 32H, B ;個(gè)位
MOV R0, #32H ;把30H 31H 32H
MOV R7, #3 ;送出去顯示
D_1:
MOV A, @R0
MOV DPTR, #TAB
MOVC A, @A+DPTR
CALL OUT_595
NOP
SETB S_UP_595
DEC R0
CLR S_UP_595
DJNZ R7, D_1
RET
;**************************************************
;七段碼表
;**************************************************
TAB:
DB 00111111B
DB 00000110B
DB 01011011B
DB 01001111B
DB 01100110B
DB 01101101B
DB 01111101B
DB 00000111B
DB 01111111B
DB 01101111B
DB 00000000B
END
;=================================================
;程序在PROTEUS中運(yùn)行的圖像如下: