搜索
您的当前位置:首页超声波测距汇编程序

超声波测距汇编程序

来源:世旅网


;///////////////////////////////////////////////////////

; USE BY :超声波测距器

;测距范围xxCM-yyCM,堆栈在4FH以上,20H用于标志

;显示缓冲单元在40H-43H,使用内存44H、45H、46H用于计算距离

;

VOUT EQU P1.0 ; 红外脉冲输出端口

speak equ p1.1 ; 喇叭输出端口

;********************************************

;* 中断入口程序 *

;********************************************

;

ORG 0000H

LJMP START

ORG 0003H

LJMP PINT0

ORG 000BH

reti

ORG 0013H

RETI

ORG 001BH

LJMP INTT1

ORG 0023H

RETI

ORG 002BH

RETI

;********************************************

;* 主 程 序 *

;********************************************

START: MOV SP,#4FH

MOV 高位)

MOV CLEARDISP: MOV INC DJNZ MOV MOV MOV MOV MOV R0,#40H ;40H-43H为显示数据存放单元(40H为最

R7,#0BH

@R0,#00H

R7,CLEARDISP

20H,#00H

TMOD,#11H ;T1/T0为16位定时器

TH0,#00H ;65毫秒初值

TL0,#00H

TH1,#00H

R0

MOV TL1,#00H

MOV P0,#0FFH

MOV P1,#0FFH

start1: MOV P2,#0FFH

MOV P3,#0FFH

MOV R4,#04H SETB PX0

SETB ET1

SETB EA

SETB TR1 LCALL DISPLAY

JNB 00H,START1 CLR EA

;超声波脉冲个数控制(为赋值的一半);开启测距定时器

;收到反射信号时标志位为1

LCALL WORK ;计算距离子程序

clr EA

MOV R2,#32h;#64H ;测量间隔控制(约4*100=400MS)

LOOP: LCALL DISPLAY

DJNZ R2,LOOP

CLR 00H

setb et0

mov th0,00h

mov tl0,00h

SETB TR1 ;重新开启测距定时器

SETB EA

SJMP Start1

;****************************************************

;* 中断程序* *

;****************************************************

;T1中断,发超声波用 ;T1中断,65毫秒中断一次

INTT1: CLR EA

CLR TR0

clr ex0

MOV TH0,#00H

MOV TL0,#00H

MOV TH1,#00H

MOV TL1,#00H

SETB ET0

SETB EA

SETB TR0 ;启动计数器T0,用以计数

intt11: CPL VOUT ;40KHZ

nop

nop

nop

nop

nop

nop

nop

nop

nop

DJNZ R4,intt11 ;超声波发送完毕,

MOV R4,#04H ;只发送了两个周期

lcall delay_250 ;延时,避开发射的直达声波信号

SETB EX0 ;开启接收回波中断

RETIOUT: RETI

;外中断0,收到回波时进入

PINT0: nop

jb p3.2,pint0_exit

CLR TR0 ;关计数器

CLR EA ;

CLR EX0 ;

MOV 44H,TL0 ;将计数值移入处理单元

MOV 45H,TH0 ;

mov th0,#00h

mov tl0,#00h

jnb p3.2,$

SETB 00H ;接收成功标志

pint0_exit: RETI

;****************************************************

;* 显示程序 ;****************************************************

; 40H为最高位,43H为最低位,先扫描高位

DISPLAY: MOV R1,#40H;G

MOV R5,#7fH;G

PLAY: MOV A,R5

MOV P0,#0FFH

MOV P2,A

MOV A,@R1

MOV DPTR,#TAB

*

MOVC A,@A+DPTR

MOV P0,A

LCALL DL1MS

ENDOUT: ;

INC R1

MOV A,R5

JNB ACC.4,ENDOUT;G

RR A

MOV R5,A

AJMP PLAY

MOV P2,#0FFH

MOV P0,#0FFH

RET

TAB: DB 18h, 7Bh, 2Ch, 29h, 4Bh, 89h, 88h, 3Bh, 08h, 09h,0ffh

;共阳段码表 \"0\" \"1\" \"2\" \"3\" \"4\" \"5\"\"6\" \"7\" \"8\" \"9\" \"不亮\"\"A\"\"-\"

;****************************************************

;* 延时程序(1ms) ;****************************************************

DL1MS: push 06h

push 07h

MOV R6,#14H

DL1: MOV R7,#19H

DL2: DJNZ R7,DL2

DJNZ R6,DL1

pop 07h

pop 06h

*

RET

;****************************************************

;* 距离计算程序 (=计数值*17/1000cm) *

;****************************************************

work: PUSH ACC

PUSH PSW

PUSH B

MOV PSW, #18h

MOV R3, 45H

MOV R2, 44H

MOV R1, #00D

MOV R0, #17D

LCALL MUL2BY2

MOV R3, #03H

MOV R2, #0E8H

LCALL DIV4BY2

LCALL DIV4BY2

MOV 40H, R4

MOV A,40H

JNZ JJ0

MOV 40H,#0AH JJ0: MOV A, R0

MOV R4, A

MOV A, R1

MOV R5, A

MOV R3, #00D

;最高位为零,不点亮

MOV R2, #100D

LCALL DIV4BY2

MOV 41H, R4

MOV A,41H

JNZ JJ1

MOV A,40H ;次高位为0,先看最高位是否为不亮

SUBB A,#0AH

JNZ JJ1

MOV 41H,#0AH ;最高位不亮,次高位也不亮

JJ1: MOV A, R0

MOV R4, A

MOV A, R1

MOV R5, A

MOV R3, #00D

MOV R2, #10D

LCALL DIV4BY2

MOV 42H, R4

MOV A,42H

JNZ JJ2

MOV A,41H ;次次高位为0,先看次高位是否为不亮

SUBB A,#0AH

JNZ JJ2

MOV 42H,#0AH ;次高位不亮,次次高位也不亮

JJ2: MOV 43H, R0

POP B

POP PSW

POP ACC

RET

;****************************************************

;* 两字节无符号数乘法程序 ; R7R6R5R4 <= R3R2 * R1R0

;****************************************************

MUL2BY2: CLR A

MOV R7, A

MOV R6, A

MOV R5, A

MOV R4, A

MOV 46H, #10H

MULLOOP1: CLR C

*

MOV A, R4

RLC A

MOV R4, A

MOV A, RLC A

MOV R5, MOV A, RLC A

MOV R6, MOV A, RLC A

MOV R7, MOV A, R5

A

R6

A

R7

A

R0

RLC A

MOV R0, A

MOV A, R1

RLC A

MOV R1, A

JNC MULLOOP2

MOV A, R4

ADD A, R2

MOV R4, A

MOV A, R5

ADDC A, R3

MOV R5, A

MOV A, R6

ADDC A, #00H

MOV R6, A

MOV A, R7

ADDC A, #00H

MOV R7, A

MULLOOP2: DJNZ 46H, MULLOOP1

RET

;****************************************************

;* 四字节/两字节无符号数除法程序 *

; R7R6R5R4/R3R2=R7R6R5R4(商)...R1R0(余数)

;****************************************************

DIV4BY2: MOV 46H, #20H

MOV R0, #00H

MOV R1, #00H

DIVLOOP1: MOV A, R4

RLC A

MOV R4, MOV A, RLC A

MOV R5, MOV A, RLC A

MOV R6, MOV A, RLC A

MOV R7, A

R5

A

R6

A

R7

A

MOV A, R0

RLC A

MOV R0, A

MOV A, R1

RLC A

MOV R1, A

CLR C

MOV A, R0

SUBB A, R2

MOV B, A

MOV A, R1

SUBB A, R3

JC DIVLOOP2

MOV R0, B

MOV R1, A

DIVLOOP2: CPL C

DJNZ 46H, MOV A, RLC A

MOV R4, MOV A, RLC A

MOV R5, MOV A, RLC A

MOV R6, DIVLOOP1

R4

A

R5

A

R6

A

MOV A, R7

RLC A

MOV R7, A

RET

;****************************************************

;* 延时程序 ;****************************************************

delay_250:

push psw

push 07h

mov r7,#0ffh

delay_250_1:

nop

*

nop

nop

nop

djnz pop pop ret END

r7,delay_250_1

07h

psw

;-----------------------

因篇幅问题不能全部显示,请点此查看更多更全内容

Top