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所傳播的距離 麻煩大家看看啊,都半個月了 很郁悶啊
csb發射.jpg (24.31 KB, 下載次數: 175)
下載附件
2008-8-1 22:00 上傳
csb接受.gif (9.29 KB, 下載次數: 152)
下載附件
2008-8-1 22:00 上傳
|