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
哎~~~~~~~~~~~
自己頂自己一下
命苦呀
利用頂定時器啊、、直接可以的呀。。在驅動一下。就產生了啊
| 歡迎光臨 (http://www.raoushi.com/bbs/) | Powered by Discuz! X3.1 |