ORG 0000H LJMP START ORG 0003H LJMP PINT0 ORG 000BH LJMP INTT0
ORG 001BH LJMP INTT1
ORG 0030H
START: MOV SP, #4FH MOV R0,#30H ;;30~35H为显示数据存放单元(30为最高位) MOV R7,#0AH MOV 20H,#00H ;标志位 CLEARDISP:MOV @R0,#00H INC R0 DJNZ R7, CLEARDISP mov tcon,#01h MOV TMOD, #21H ; ;T1为8位自动重装模式,T0为16位定时器 MOV TH0, #00H ; ;65ms初值 MOV TL0, #00H MOV TH1, #0F2H ;;40KHz初值 MOV TL1, #0F2H MOV P0, #0FFH MOV P1, #0FFH MOV P2, #0FFH MOV P3, #0FFH
mov 36h,#20h ;显示位控 mov 37h,#30h mov 38h,#40h mov 39h,#50h mov 3ah,#60h MOV R4, #10h ; ;超声波脉冲个数控制(为赋值的一半) SETB PX0 SETB ET0 SETB EA clr 20H SETB TR0 ; ;开启测距定时器
START1: LCALL DISPLAY JNB 20H, START1 ; ;收到反射信号时标志位为1 CLR EA LCALL WORK ; ;计算距离子程序 SETB EA CLR 20H SETB TR0 ; ;重新开启测距定时器
LOOP: LCALL DISPLAY DJNZ R5, LOOP SJMP START1
;*中断程序* ;;T0中断,65ms中断一次 INTT0: CLR EA CLR TR0 MOV TH0,#00H MOV TL0,#00H SETB ET1 SETB EA SETB TR0 ; ;启动计时器T0,用以计算超声波来回时间 SETB TR1 ; ;开启发超声波用定时器T1 RETI
;;T1中断,发超声波用 INTT1: CPL P1.0 DJNZ R4,RETIOUT CLR TR1 ; ;超声波发送完毕,关T1 CLR ET1 MOV R4,#10h ;发送8个,约200us(最小距离)后开启外部中断, SETB EX0 ; ;开启接收回波中断 RETIOUT: RETI
;;外中断0,收到回波时进入 PINT0:
CLR TR0 ; ;关计数器 CLR TR1 clr et1 CLR ea clr ex0 MOV 40H,TL0 ; ;将计数值移入处理单元 MOV 41H,TH0 SETB 20H RETI
。。。 设计方案:每隔65ms发射一次,每次发射8个周期。 问题一:发不出40k 的脉冲,只有30k 问题二:一开启外部中断,外部中断就一直位于低电平了,所测的的距离就是那200us所传播的距离 麻烦大家看看啊,都半个月了 很郁闷啊
|