单片机脉宽测量C语言,单片机脉宽测量的程序

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

全部

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值