单片机脉宽测量的程序
DATL EQU 30H ;计数低位
DATH EQU 31H ;计数高位
DATC EQU 32H ;计数进位
LEDBuf EQU 33H ;显示缓存
ORG 0000H
JMP MAIN
ORG 0003H
AJMP INT_0
ORG 0050H
MAIN:AJMP START
;*************************************
;显示子程序
LEDMAP: ; 八段管显示...全部
DATL EQU 30H ;计数低位
DATH EQU 31H ;计数高位
DATC EQU 32H ;计数进位
LEDBuf EQU 33H ;显示缓存
ORG 0000H
JMP MAIN
ORG 0003H
AJMP INT_0
ORG 0050H
MAIN:AJMP START
;*************************************
;显示子程序
LEDMAP: ; 八段管显示码
DB 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h
DB 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h
LED:
MOV R0 ,#LEDBuf
MOV R1 ,#6 ; 共6个八段管
MOV R2 ,#00100000b ; 从左边开始显示
Loop:
MOV DPTR ,#8002H
MOV A ,#0
MOVX @DPTR,A ; 关所有八段管
MOV A ,@R0
MOV DPTR ,#8004H
MOVX @DPTR,A
MOV DPTR ,#8002H
MOV A ,R2
MOVX @DPTR,A ; 显示一位八段管
MOV R6 ,#1
MOV R7 ,#0
L:
DJNZ R7 ,L
DJNZ R6 ,L
MOV A ,R2 ; 显示下一位
RR A
MOV R2, A
INC R0
DJNZ R1 ,Loop
RET
;*******************************************
;中断服务子程序 (启动定时功能)
INT_0:
CLR EX0 ;关中断
MOV DATC ,#00H
MOV TH1 ,#00H
MOV TL1 ,#00H
JB P3。
3
SETB TR1 ;启动定时器1,但不计数
JNB P3。3 ,$ ;等待脉冲由低电平变为高电平 ;等待正脉冲
CH0: JNB TF1 ,CH1 ;计数没溢出,跳转
INC DATC
CLR TF1
MOV TH1 ,#00H ;装入初值
MOV TL1 ,#00H
SETB TR1 ;启动定时器
CH1: JB P3。
3 ,CH0 ;判断正脉冲是否结束
CLR TR1 ;停止计数
MOV A ,TL1
MOV DATL ,A
MOV A ,TH1
MOV DATH ,A
;************************************
; 计数值*机器周期(6MHz 为2us)
CLR C ;带进位左移等同乘2
MOV A ,DATL
RLC A
MOV DATL ,A
MOV A ,DATH
RLC A
MOV DATH ,A
MOV A ,DATC
RLC A
MOV DATC ,A
;*********************************
;数制转换
CLR A
MOV R3 ,A
MOV R4 ,A
MOV R5 ,A
MOV R7 ,#24
HB0:
MOV A ,DATL ;**********************
RLC A ;依次移出高位
MOV DATL ,A ;
MOV A ,DATH
RLC A
MOV DATH ,A
MOV A ,DATC
RLC A
MOV DATC ,A
MOV A ,R3 ;将累加器自身带进位相加(与*2等效)
ADDC A ,R3 ;累加器依次从低位开始
DA A
MOV R3 ,A
MOV A ,R4
ADDC A ,R4
DA A
MOV R4 ,A
MOV A ,R5
ADDC A ,R5
DA A
MOV R5 ,A
DJNZ R7 ,HB0 ;判断24位是否处理完
;****************************************
;压缩BCD码转换成非压缩BCD码
MOV DPTR ,#LEDMAP
MOV A ,R5
SWAP A
ANL A ,#0FH ;屏蔽高位
MOVC A ,@A+DPTR
MOV LEDBuF,A ;分离出第6位
MOV A ,R5
ANL A ,#0FH
MOVC A ,@A+DPTR
MOV LEDBuf+1,A ;分离出第5位
MOV A ,R4
SWAP A
ANL A ,#0FH ;屏蔽高位
MOVC A ,@A+DPTR
MOV LEDBuF+2,A ;分离出第4位
MOV A ,R4
ANL A ,#0FH
MOVC A ,@A+DPTR
MOV LEDBuf+3,A ;分离出第3位
MOV A ,R3
SWAP A
ANL A ,#0FH ;屏蔽高位
MOVC A ,@A+DPTR
MOV LEDBuF+4,A ;分离出第2位
MOV A ,R3
ANL A ,#0FH
MOVC A ,@A+DPTR
MOV LEDBuf+5,A ;分离出第1位
SETB EX0 ;开中断
RETI
;**********************************************
;主程序开始
START:
MOV SP ,#50H
MOV TMOD ,#90H ;设置定时器1的工作方式为1,GEAE置1
MOV TH1 ,#00H
MOV TL1 ,#00H ;定时器时间初值置零
MOV IE ,#81H ;开外部中断0
CALL LED ; 调显示
LJMP MAIN
END
。
收起