📄 wpks1.9.asm
字号:
; 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 + -