⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wpks1.9.asm

📁 此程序是无线发射与接收
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;                     Tunefu Wireless Parking System
;                            Copyright by TF
;                          Correting by Veblen
;                              2006-06-05
;
;MCU: Philips P89LPC921/924/9221   
;=================================================
;For Philips 89lpc900 Series CPU
;=================================================
	ORG	0000H              ;
	LJMP	Initial            ;初始化
	ORG	0003H
	LJMP	Ex0_Int            ;外部中断0
	ORG	000BH
	LJMP	Timer0_Int         ;定时器0中断
	ORG	0013H
	LJMP	Ex1_Int            ;外部中断1
	ORG	001BH
	LJMP	Timer1_Int         ;定时器1中断
	ORG	0023H
	LJMP	Serial_Int         ;
	ORG	002BH
	LJMP	BrouwnOut_Detect   ;欠压检测
	ORG	0033H
	LJMP	I2C_Int            ;
	ORG	003BH
	LJMP	KBI_Int            ;键盘中断
	ORG	0043H
	LJMP	Cmp2_Int           ;比较器中断
	ORG	0053H
	LJMP	WatchDog_Timer     ;看门狗
	ORG	0063H
	LJMP	Cmp1_Int           ;比较器1中断
	ORG	0073H
	RETI
;==============================================
;Bit Ram Define Area(Byte:20-2fH)
;==============================================
BitStart	EQU	00H
Time60ms	EQU	00H		;中断60ms标志
Puls_Num_F1	EQU	01H		;是否接收到一个完整的PULS
Zero_R_F	EQU	02H		;右通道零距离标志
Not_Zero_R_F	EQU	03H		;右通道非零距离标志
Zero_L_F	EQU	04H		;右通道零距离标志
Not_Zero_L_F	EQU	05H		;右通道非零距离标志
Beep_Flag	EQU	06H
Timer1_F	EQU	07H
Fresh_F		EQU	08H
Bit_Buf		EQU	09H
Flash_Flag	EQU	0AH
Horse_Effect_F	EQU	0BH
Mute_F		EQU	0CH
Off_F		EQU	0DH
Left_Large_F	EQU	0EH
Right_Large_F	EQU	0FH
BitEnd		EQU	7FH
;==============================================
;Byte Ram Define Area(Byte:18-1FH)
;==============================================
Ch0_Up_TL	EQU	08H
Ch0_Up_TH	EQU	Ch0_Up_TL+1	;通道0盲点时间值
Ch1_Up_TL	EQU	Ch0_Up_TH+1
Ch1_Up_TH	EQU	Ch1_Up_TL+1	;通道1盲点时间值
Ch2_Up_TL	EQU	Ch1_Up_TH+1
Ch2_Up_TH	EQU	Ch2_Up_TL+1	;通道2盲点时间值
Ch3_Up_TL	EQU	Ch2_Up_TH+1
Ch3_Up_TH	EQU	Ch3_Up_TL+1	;通道3盲点时间值
Ch0_Dis		EQU	Ch3_Up_TH+1	;1C
Ch1_Dis		EQU	Ch0_Dis+1	;1D
Ch2_Dis		EQU	Ch1_Dis+1	;1E
Ch3_Dis		EQU	Ch2_Dis+1	;1F
;==============================================
;Byte Ram Define Area(Byte:24-2FH)
;==============================================
IDH         EQU 24H
IDL         EQU 25H
;LCD_Ram1	EQU	24H
;LCD_Ram2	EQU	25H
LCD_Ram3	EQU	26H
LCD_Ram4	EQU	27H
LCD_Ram5	EQU	28H
LCD_Ram6	EQU	29H

;==============================================
;Byte Ram Define Area(Byte:30-7fH)
;==============================================
RamStart	EQU	30H
Data_Buf	EQU	30H		;存贮距离
Data_min	EQU	Data_Buf+1
Data_Cpl	EQU	Data_min+1
;Bit_Pt		EQU	Data_Buf+1	;同显示通讯时做为BIT计数指针
Channel		EQU	Data_Cpl+1	;测距通道(0-3)
Puls_Time_TL	EQU	Channel+1+1	;第一个PULS上升沿时间的低8位
Puls_Time_TH	EQU	Puls_Time_TL+1	;第一个PULS上升沿时间的高8位
Scot_Time_L	    EQU Puls_Time_TH+1	;因探头余振造成的盲点时间的低8位
Scot_Time_H		EQU Scot_Time_L+1	;因探头余振造成的盲点时间的高8位
Temp1		EQU	Scot_Time_H+1	;临时存贮RAM
Temp2		EQU	Temp1+1
Temp3		EQU	Temp2+1
Temp4		EQU	Temp3+1
Temp5		EQU	Temp4+1
MsCount		EQU	Temp5+1
Two_Digital_Dis	EQU	MsCount+1
Two_Digital_Min	EQU	Two_Digital_Dis+1
;Two_Digi_Dis0	EQU	Two_Digital_Min+1	;左测距非零个数计数
;Two_Digi_Dis1	EQU	Two_Digi_Dis0+1
;Two_Digi_Dis2	EQU	Two_Digi_Dis1+1
;Two_Digi_Dis3	EQU	Two_Digi_Dis2+1
;N_Zero_CL	EQU	Two_Digi_Dis3+1
;N_Zero_CR	EQU	N_Zero_CL+1		;右测距非零个数计数
Send_data	EQU	Two_Digital_Min+1
;Beep_Time
Min_Distance	EQU	Send_data+1
Dis_Left	EQU	Min_Distance+1
Dis_Right	EQU	Dis_Left+1
Count0		EQU	Dis_Right+1
Count1		EQU	Count0+1
Count2		EQU	Count1+1
Count3		EQU	Count2+1
M_Channel_num	EQU	Count3+1
;Flash_Time	EQU	Count3+1

;;ID1		EQU	Channel_num+1
;;ID2		EQU	ID1+1

;Horse_Step_L	EQU	Flash_Time+1
;Horse_Step_D	EQU	Horse_Step_L+1
Min_Channel_num	EQU	M_Channel_num+1
S_Channel_num	EQU	Min_Channel_num+1
;Horse_En_Time	EQU	ID2+1
;Idle_Wait_Time	EQU	Horse_En_Time+1
Min_channel	EQU	S_Channel_num+1
;Old_Dis		EQU	L1_Channel_num+1
SpRam		EQU	Min_channel+1
RamEnd		EQU	7FH
;--------------------------------------------
;SFR
P0M1		EQU	084H
P0M2		EQU	085H
P1M1		EQU	091H
P1M2		EQU	092H
P2M1		EQU	0A4H
P2M2		EQU	0A5H
DIVM		EQU	095H
WDRST		EQU	0A6H
WDCON		EQU	0A7H
AUXR1		EQU	0A2H

;====================================
WDL EQU 0C1H 
WFEED1 EQU 0C2H 
WFEED2 EQU 0C3H 
;====================================

;==============================================
;	Const	Define
T4msL		EQU	078H	;时钟设定值低8位
T4msH		EQU	0ECH	;时钟设定值高8位

T60msL		EQU	0A0H	;时钟设定值低8位   ;设置定时时间为60ms
T60msH		EQU	015H	;时钟设定值高8位
;==============================================
;PortBit Define	  
;WR_Bit		EQU	P0.1	;P0.1为无线数据发送端
WR_Bit		EQU	P0.2	;P0.2为无线数据发送端
;WR_Bit      EQU P0.3	;P0.3为无线数据发送端

On_Sw		EQU	P0.4	;正常工作
Off_Sw		EQU	P0.5	;关机
T40k_Bit	EQU	P1.4	;超声波信号发送端
Ch_Se_Bit0	EQU	P1.3	;超声波发送及接收通道选择端0
Ch_Se_Bit1	EQU	P1.2	;超声波发送及接收通道选择端1
Ultrasonic_Bit	EQU	P1.1	;超声波返回信号接收端

;==============================================
;==============================================
;==============================================
;==============================================
;==============================================


;===================================================程序开始,初始化=======================================
	ORG	0080H
    DB  '"TFWPKS19"060605'     ;程序版本号及日期  
ID:
    DB  12H;00H		           ;ID码存放区,用于批量烧写
	DB	34H;00H 
	NOP
Initial:                        ;初始化IO口
SetPort:
   	;MOV	P0M1,#00000010b
	;MOV	P0M2,#00000010b            ;P0.1为开漏输出

	;MOV	P0M1,#00000100b
	;MOV	P0M2,#00000100b            ;P0.2为开漏输出

	MOV	P0M1,#00000000b
	MOV	P0M2,#00000100b            ;P0.2为推挽输出
    
	;MOV	P0M1,#00001000b
	;MOV	P0M2,#00001000b            ;P0.3为开漏输出
;;	MOV	P0,#00000000b
	
	MOV	P1M1,#00001110b            ;;p1.1为仅输入模式.   1.4推挽输出
	MOV	P1M2,#00011100b            ;;1.2,1.3为开漏输出.
;;	MOV	P1,#2              ;;
									
;------------------------------------
	MOV	AUXR1,#00000000b
	MOV	DIVM,#2			;;八M四分频,一个机器周期一微秒(2个CPU时钟周期)
;;---------------------------------------------------------------------------------------------------
;;	About	AUXR1		;清KEY中断,开掉电检测,产生复位,低功耗工作模式
;---------------------------------------------------------------------------------------------------
;;Bit7	KBF	键盘中断标志,当P0口任何一个脚作为键盘中断功能变低使能时KBF置位,须软件清除
;;Bit6	BOD	禁能掉电检测.当BOD置位时关闭掉电检测以节省电能.
;;Bit5	BOI	掉电检测中断,当BOI置位时禁止掉电检测产生芯片复位,但允许将其做为一个中断
;;Bit4	LPEP	低功耗EPROM控制位.允许软件设置系统工作在低电压(1-2.5V,0-3.8V).只在上电复位和掉电复位位时LPEP才被清零.
;;Bit3	SRST	软件复位功能.
;;Bit2	0	该位为零.允许通过将DPTR加1切换DPS位而不影响寄存器的其它位.
;;Bit1	备用,不可为1
;;Bit0	DPS	数据指针选择.通过用户程序选择两个数据指针中的一个
;;---------------------------------------------------------------------------------------------------
	MOV	A,#0
	MOV	R0,#RamEnd
ClrRam:                                         ;清RAM
	MOV	@R0,A
	DJNZ	R0,ClrRam
	MOV	R0,A
	
	MOV	SP,#SpRam
SetInt:                                         ;开中断
	SETB	EA
	SETB	EA
	SETB	ET0
	SETB	ET1
SetTimer:                                       ;设置定时器1时间
	MOV	TMOD,#00010001B
	MOV	TL1,#T60msL
	MOV	TH1,#T60msH
;SetWatchDog:                                    ;看门狗设定
;	CALL	WDFeed
;	MOV	WDCON,#00010100b	  

;-----------------------------------初始化看门狗 
INI_WDT: 
MOV ACC,WDCON ;读取WDT控制寄存器 
SETB ACC.2 ;置位ACC.2准备启动WDT 
MOV WDL,#80H ;设置8位倒计时器初值 
MOV WDCON,ACC ;启动WDT 
MOV WFEED1,#0A5H ;清零第一部分 
MOV WFEED2,#5AH ;清零第二部分 
;-------------------------- 

Start_Delay:                                    ;
	MOV	R7,#5
Set_T0_60ms:
	MOV	TL0,#T60msL
	MOV	TH0,#T60msH
	SETB	TR0
;==============================================


;======================================================主程序==============================================
Main:  
    MOV  A,#00H		  ;获得ID码
	MOV  DPTR,#ID
	MOVC A,@A+DPTR
	MOV  IDH,A
	INC  DPTR
	MOV  A,#00H
	MOVC A,@A+DPTR
	MOV  IDL,A	

	MOV	A,#085H				 ;设置初始盲点时间为(1C)(85)-(T60msH)(T60msL),即1C85H-15A0H=6E5H,为1765us
	MOV	Ch0_Up_TL,A			 ;最大盲点时间应为1765us(对应距离0.3m)
	MOV	Ch1_Up_TL,A
	MOV	Ch2_Up_TL,A
	MOV	Ch3_Up_TL,A
	MOV	A,#01CH
	MOV	Ch0_Up_TH,A
	MOV	Ch1_Up_TH,A
	MOV	Ch2_Up_TH,A
	MOV	Ch3_Up_TH,A
/*
	MOV	A,#13
	MOV	Count0,A
	MOV	Count1,A
	MOV	Count2,A
	MOV	Count3,A                      ;

	MOV	Dis_Left,#25
	MOV	Dis_Right,#25 */
	MOV	Min_Distance,#25      ;最小距离初值
	        ;
;============================================================
;主循环
;============================================================
Main_Loop:	
;	SETB    WR_Bit  		   	
	CALL	Distance_Measure 		;超声波测距
	CALL   	Get_MinDst			;获得最小距离值
Watch_Dog_Clear:
	CALL	WDFeed			        ;清看门狗
RF_Data_Send:				        ;
    CALL    RF_SEND				;高频发送

	LJMP	Main_Loop
;============================================================
 

;==============================================
;	Subroutine Area
;==============================================
;================================================四路探头测距程序==========================================
Distance_Measure:
	MOV	A,Channel
	RL	A			        ;乘以2,因为AJMP为两个字节
	MOV	DPTR,#Channel_Jump_Tbl
	JMP	@A+DPTR
Channel_Jump_Tbl: 				;;选择通道
	AJMP	Ch0_Detect
	AJMP	Ch1_Detect
	AJMP	Ch2_Detect
	AJMP	Ch3_Detect	

;------------------------------	
Ch0_Detect:			;Left_Side
	CLR	  Ch_Se_Bit0
	CLR	  Ch_Se_Bit1
	INC	  Channel		 ;指向下一通道
	MOV   Scot_Time_L,Ch0_Up_TL	 ;更新盲点时间
	MOV   Scot_Time_H,Ch0_Up_TH
	CALL  Ultrasonic_Rx
	MOV   Ch0_Up_TL,Scot_Time_L	 ;保存盲点时间
	MOV   Ch0_Up_TH,Scot_Time_H
;	MOV	  Temp3,Ch0_Dis
;   CALL  DstCompWithLastTime	 ;与上次数据比较
	MOV	  Ch0_Dis,Data_Buf	    ;;保存第一通道的数据
	JMP   Distance_Measure
;------------------------------	
Ch1_Detect:			;Left_Middle   
	CLR	  Ch_Se_Bit0
	SETB  Ch_Se_Bit1
	INC	  Channel
	MOV   Scot_Time_L,Ch1_Up_TL
	MOV   Scot_Time_H,Ch1_Up_TH	   
	CALL  Ultrasonic_Rx
	MOV   Ch1_Up_TL,Scot_Time_L	 ;保存盲点时间
	MOV   Ch1_Up_TH,Scot_Time_H
;	MOV	  Temp3,Ch1_Dis
;   CALL  DstCompWithLastTime
	MOV	  Ch1_Dis,Data_Buf	    ;;保存第二通道的数据
	JMP   Distance_Measure
;-------------------------------
Ch2_Detect:			;Right_Middle
	SETB  Ch_Se_Bit0
	CLR	  Ch_Se_Bit1
	INC	  Channel
	MOV   Scot_Time_L,Ch2_Up_TL
	MOV   Scot_Time_H,Ch2_Up_TH	   
	CALL  Ultrasonic_Rx
	MOV   Ch2_Up_TL,Scot_Time_L	 ;保存盲点时间
	MOV   Ch2_Up_TH,Scot_Time_H	
;	MOV	  Temp3,Ch2_Dis
;   CALL  DstCompWithLastTime
	MOV	  Ch2_Dis,Data_Buf  		;;保存第三通道的数据
	JMP	  Distance_Measure				 
;-------------------------------
Ch3_Detect:			;Right_Side
 	SETB  Ch_Se_Bit0
	SETB  Ch_Se_Bit1
	MOV   Channel,#0				;清通道指针,再次指向0通道
	MOV   Scot_Time_L,Ch3_Up_TL
	MOV   Scot_Time_H,Ch3_Up_TH	 
	CAll  Ultrasonic_Rx
	MOV   Ch3_Up_TL,Scot_Time_L	 ;保存盲点时间
	MOV   Ch3_Up_TH,Scot_Time_H
;	MOV	  Temp3,Ch3_Dis
;   CALL  DstCompWithLastTime
    MOV	  Ch3_Dis,Data_Buf  		;;保存第四通道的数据
    RET
;==============================================


;============================================计算四路探头最小距离值========================================
Get_MinDst:
    MOV A,Ch0_Dis	      
	MOV Min_channel,#0
	MOV Data_Buf,A
	CLR C
	SUBB A,Ch1_Dis
	JC  Comp1
	MOV Data_Buf,Ch1_Dis	 ;2 byte
	MOV Min_channel,#1		 ;3	byte
Comp1:
	MOV A,Data_Buf
	CLR C					 ;1	byte
	SUBB A,Ch2_Dis			 ;2	byte
	JC  Comp2				 ;2	byte
	MOV Data_Buf,Ch2_Dis
	MOV Min_channel,#2
Comp2:
	MOV A,Data_Buf
	CLR C
	SUBB A,Ch3_Dis
	JC  Comp3
	MOV Data_Buf,Ch3_Dis
	MOV Min_channel,#3
Comp3:
	MOV	Min_Distance,Data_Buf
	MOV	Min_Channel_num,Min_channel
	RET  
;==============================================


;=================================================超声波收发程序===========================================	  
Ultrasonic_Rx:					;超声波发送接收程序,各通道轮流检测5次

	MOV	Data_Buf,#25  	;首先假设是远距离,如果测到近距离会刷新
	MOV	Two_Digital_Dis,#250
	CLR	Puls_Num_F1	;0Puls Or 1Puls
	CLR	Time60ms	;清60ms标志,清接收到PULS的标志,开60ms的时钟
;----------------------------------------------
;Send 40k Ultrasonic 20 Puls.Open Timer 60ms
;----------------------------------------------
Tx_40k20Puls:
	MOV	R7,#20
	MOV	TL0,#T60msL
	MOV	TH0,#T60msH
	SETB	TR0		;start count time(For calculate Distance)
	CLR	TR1
	CLR	TR1
Next_Puls:			;发送要求个数的超声波PULS
	SETB	T40k_Bit	;1
	NOP			;1   ;; 2
	NOP			;1   ;; 3
	NOP			;1   ;; 4
	NOP			;1   ;; 5
	NOP			;1   ;; 6
	NOP			;1   ;; 7
	NOP			;1   ;; 8
	NOP			;1   ;; 9
	NOP			;1   ;; 10
	NOP			;1   ;; 11
	NOP			;1   ;; 12
	NOP			;1   ;; 13		

	CLR	    T40k_Bit	;1    
	NOP			;1   ;; 2
	NOP			;1   ;; 3
	NOP			;1   ;; 4
	NOP			;1   ;; 5
	NOP			;1   ;; 6
	NOP			;1   ;; 7
	NOP			;1   ;; 8
	NOP			;1   ;; 9
	NOP			;1   ;; 10

;	NOP			;1	38K/40K
	DJNZ	R7,Next_Puls	;2
;----------------------------------------
;40k	Puls have send out
;	Next receive
;----------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -