?? 74ls04cx20106.txt
字號:
;********************************************
;* 超聲波測距器 *
;* 12MHZ晶振 *
;* LRM 2005.07.18 *
;********************************************
;測距范圍7CM-90CM,堆棧在4FH以上,20H用于標志位
;顯示緩沖單元在40H-43H,使用內存44H、45H、46H用于計算距離
;使用內存60H-63H用于設定報警
VOUT EQU P0.6 ; 超聲波脈沖輸出端口
VIN EQU P0.7 ; 超聲波回波輸入口
KEY0 Equ P2.6 ; 報警設定與退出鍵
KEY1 Equ P2.7 ; 報警設定數值+,遠近報警選擇
KEY2 Equ P3.2 ; 報警設定數值-
BELL EQU P0.2 ; 蜂鳴器
LED1 EQU P3.3 ; 燈1
LED2 EQU P3.4 ; 燈2
YJFLAG EQU 00H ;遠近報警選擇標志
;*************************************************
LAMPBLAK EQU P1.4 ;液晶背光燈控制,=0時開,=1時關.
CS EQU P1.5 ;液晶使能,=1操作,=0禁止.
SID EQU P1.6 ;液晶串行數據輸入口
SCLK EQU P1.7 ;液晶串行操作時鐘口
;
;********************************************
;* 中斷入口程序 *
;********************************************
;
ORG 0000H
LJMP START
ORG 0003H
RETI
ORG 000BH
LJMP INTT0
ORG 0013H
RETI
ORG 001BH
RETI
ORG 0023H
RETI
ORG 002BH
RETI
;
;********************************************
;* 主 程 序 *
;********************************************
;
START: MOV SP,#80H ;堆棧在80H以上
CLR CS ;液晶操作禁止
LCALL SETUP ;LCD初始化
LCALL LOGON ;LCD開機顯示畫面
MOV R0,#40H ;40H-43H為顯示數據存放單元(40H為最高位)
MOV R7,#0BH
CLEARDISP: MOV @R0,#00H ;清內存
INC R0
DJNZ R7,CLEARDISP
MOV 20H,#00H
MOV TMOD,#21H ;T1為8位自動重裝模式,T0為16位定時器
MOV TH0,#00H ;65.536毫秒初值(發超聲波的間隔)
MOV TL0,#00H
MOV P0,#0FFH
MOV P1,#0FFH
MOV P2,#0FFH
MOV P3,#0FFH
MOV 60H,#00H ;
MOV 61H,#00H ;
MOV 62H,#00H ;
MOV 63H,#00H ;
SETB ET0
SETB EA
SETB TR0 ;開啟測距定時器
START1: JNB VIN,PINT0
JNB KEY0,SAFESET8
JNB KEY1,YJSET
AJMP START1
;
SAFESET8: LJMP SAFESET
YJSET: CLR ET0
JNB KEY1,YJSET
CPL YJFLAG
JB YJFLAG, YDISP
MOV A,#80H ;第一行左第一個字開始
LCALL WRITE_COM
MOV DPTR,#CHINESE8 ;"超聲波測距器-J "
LCALL WRITE_HZ
SETB ET0
AJMP START1
YDISP: MOV A,#80H ;第一行左第一個字開始
LCALL WRITE_COM
MOV DPTR,#CHINESE9 ;"超聲波測距器-Y "
LCALL WRITE_HZ
SETB ET0
AJMP START1
;****************************************************
;* 中斷程序* *
;****************************************************
;T0中斷,65毫秒中斷一次
INTT0: CLR ET0
CLR TR0
MOV TH0,#00H
MOV TL0,#00H
MOV R4,#06H
SETB TR0 ;啟動計數器T0,用以計算超聲來回時間
VLOOP: CPL VOUT
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DJNZ R4,VLOOP
SETB ET0
OUT: RETI
;
;回波接收程序
PINT0: CLR TR0 ;關計數器
CLR ET0 ;
MOV 44H,TL0 ;將計數值移入處理單元
MOV 45H,TH0 ;
MOV TL0,#00H
MOV TH0,#00H
LCALL WORK ;計算距離子程序
LCALL DATAUP ;將距離數據寫在LCD上
LCALL DELAY1 ;延時
JB YJFLAG,YBAO
LCALL BAOJ ;調用近報警程序
SETB TR0 ;重新開啟測距定時器
SETB ET0 ;
lJMP START1 ;返回主程序
;
YBAO: LCALL YBAOJ
SETB TR0 ;重新開啟測距定時器
SETB ET0 ;
lJMP START1 ;返回主程序
;
;****************************************************
;* 距離計算程序 (=計數值*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,#0FH ;最高位為零,不點亮
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,#0FH
JNZ JJ1
; MOV 41H,#0FH ;最高位不亮,次高位也不亮
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,#0FH
JNZ JJ2
; MOV 42H,#0FH ;次高位不亮,次次高位也不亮
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, R5
RLC A
MOV R5, A
MOV A, R6
RLC A
MOV R6, A
MOV A, R7
RLC A
MOV R7, A
MOV 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, A
MOV A, R5
RLC A
MOV R5, A
MOV A, R6
RLC A
MOV R6, A
MOV A, R7
RLC A
MOV 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, DIVLOOP1
MOV A, R4
RLC A
MOV R4, A
MOV A, R5
RLC A
MOV R5, A
MOV A, R6
RLC A
MOV R6, A
MOV A, R7
RLC A
MOV R7, A
RET
;
;**********以下液晶開機顯示程序**************
;
DATAUP:
MOV A,#93H
LCALL WRITE_COM
MOV R1,#40H ;將40-43H數據查出字碼寫入LCD
MOV DPTR,#TABLE1
MOV R2,#04H ; 查4
MOV A,#00H
MOVCLOP:MOV A,@R1 ;
MOVC A,@A+DPTR
LCALL WRITE_DAT
INC R1
DJNZ R2,MOVCLOP ;
RET
;
;***************開機顯示畫面***********************
LOGON: MOV A,#80H ;第一行左第一個字開始
LCALL WRITE_COM
MOV DPTR,#CHINESE ;浙江海洋學院
LCALL WRITE_HZ
MOV A,#90H ;第二行左第一個字開始
LCALL WRITE_COM
MOV DPTR,#CHINESE1 ;單片機實驗室
LCALL WRITE_HZ
CLR LAMPBLAK ;開背光燈
LCALL DELAY5S ;顯示5秒
SETB LAMPBLAK ;關背光燈
MOV A,#80H ;第一行左第一個字開始
LCALL WRITE_COM
MOV DPTR,#CHINESE3 ;C03電本(2)班
LCALL WRITE_HZ
MOV A,#90H ;第二行左第一個字開始
LCALL WRITE_COM
MOV DPTR,#CHINESE4 ;樓然苗設計制作
LCALL WRITE_HZ
CLR LAMPBLAK ;開背光燈
LCALL DELAY5S ;顯示5秒
SETB LAMPBLAK ;關背光燈
MOV A,#80H ;第一行左第一個字開始
LCALL WRITE_COM
MOV DPTR,#CHINESE8 ;超聲波測距器--
LCALL WRITE_HZ
MOV A,#90H ;第二行左第一個字開始
LCALL WRITE_COM
MOV DPTR,#CHINESE2 ;距離: CM
LCALL WRITE_HZ
RET
;**********初始化程序*************
SETUP:
MOV A,#01H ;CLEAR DATAUP
LCALL WRITE_COM
MOV A,#00110000B ;FUNCTION SETTING
LCALL WRITE_COM
MOV A,#00000010B ;DDRAM SET TO '00H'
LCALL WRITE_COM
MOV A,#00000100B ;
LCALL WRITE_COM
MOV A,#00001100B ;DATAUP ON
LCALL WRITE_COM
MOV A,#00000001B ;CLEARING SCREEN
LCALL WRITE_COM
MOV A,#10000000B ;SET DDRAM ADDRESS
LCALL WRITE_COM
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
RET
;************串行命令寫入子程序****************
;寫入命令字在A中
WRITE_COM:
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -