|
楼主 |
发表于 2008-8-5 22:17:16
|
显示全部楼层
;遥控开关
.include"tn13def.inc"
;*************************************************
.def FLAG =R24 ;寄存器定义
.equ LOCK_KY=0 ;按键0标记,设防
.equ SEEK_KY=1 ;按键1标记,寻车
.equ UNLK_KY=2 ;按键2标记,解锁
.equ K3=3 ;按键3标记
.equ VT=4 ;记录有没有按键按下
.equ XUE_XI=5 ;学习标记
.equ ADR_OK=6 ;地址比较标记
.equ UP_XUE=7 ;上电时判断是否学习标记
;*************************************************
.def TEMP =R16 ;暂存
.def RF_TEMP0=R27 ;记录RF接收的低8位
.def RF_TEMP1=R1 ;记录RF接收的中8位
.def RF_TEMP2=R2 ;记录RF接收的高8位
.def CNT24 =R23 ;用于记录24位数据是否接收完
.def RF_T =R22 ;脉冲宽度延时计数
.def R_RB =R3 ;读端口B暂存
.def TEMP1 =R17 ;用于记录键值的D0-D3
.def EE_DATA =R4 ;将写入或读出EEPROM的数据
.def EE_ADR =R18 ;将写入或读出EEPROM的地址
.def EE_CON =R19 ;EEPROM的控制
.def dt =R20 ;延时
.def COUNT_1 =R21 ;同一频率循环次数
.def SOU_DWN =R6 ;频率增量或减量:1或2
.def COU_FLG =R7 ;频率起点
.def COU_T =R8 ;频率起点暂存
.def COUNT_S =R25 ;报警次数
.def JIAN_COUNT1=R28 ;判断是否按键的计数器1
.def JIAN_COUNT2=R29 ;判断是否按键的计数器2
.def FLAG1 =R30 ;
;*************************************************
;PORTB定义
.equ ZHEN_DONG=2
.equ RFIN =1
.equ FF_OPEN =4 ;非法开锁
.equ BL_F72 =3
.equ CON_48V =5
.equ SOU_OUT =0
;*************************************************
.equ RF01= 55;43 ;窄脉宽容限
.equ RF00= 32;28 ;窄脉宽容限
.equ RF11= 145;130 ;宽脉宽容限
.equ RF10= 100;87 ;宽脉宽容限
;*************************************************
.ORG 0x00
RJMP START ;
RJMP START ;外部中断请求0
RJMP START ;
RJMP START ;定时器/ 计数器溢出
RJMP START ;
RJMP START ;
RJMP START ;定时器/ 计数器比较匹配A
RJMP START ;
RJMP START ;
START:
LDI dt,25
RCALL delay
CLI
LDI R26, $80 ;
OUT CLKPR, R26
LDI R26, $01 ;时钟分频因子为2
OUT CLKPR, R26 ;
LDI R26, $9F ;
OUT SPL, R26 ;堆栈指针
LDI R26, $03 ;P51
OUT MCUCR, R26 ;上拉使能,INT0 的上升沿产生异步中断请求
WDR
LDI R26, $18 ;WDCE: 看门狗修改使能 WDE: 看门狗系统复位使能
OUT WDTCR, R26 ;
LDI R26, $0C ;看门狗振荡器周期32K, 0.25S
OUT WDTCR, R26 ;看门狗中断不使能
LDI R26, $80 ;
OUT ACSR, R26 ;模拟比较器禁用
LDI R26, $0 ;
OUT DIDR0, R26 ;数字信号输入使能,
OUT ADCSRA, R26 ;禁用ADC,中断不使能
OUT TCCR0A, R26 ;正常的端口操作,不与OC0A,OC0B 相连接
OUT TCCR0B, R26 ;无时钟, T/C 不工作
OUT TIMSK0, R26 ;T/C0屏蔽寄存器,输出比较A,B中断禁用,溢出中断禁用
OUT TIFR0, R26 ;T/C0中断标志寄存器清0
LDI R26, 0B00111001;0B00101001 ;??????????????????????????
OUT DDRB, R26 ;方向,PB0,PB3,PB5为输出,PB1,PB2,PB4输入
CLR R26 ;
OUT GIFR, R26 ;外部中断标志,引脚电平变化中断标志清0
OUT PCMSK, R26 ;引脚变化屏蔽寄存器清0
OUT GIMSK, R26 ;外部中断禁止,引脚电平变化中断禁止,P52
;不开中断,
CLR FLAG ;
CLR FLAG1
CLR EE_ADR
LDI JIAN_COUNT2,100 ;100*1250us=125ms
SWS224:
LDI JIAN_COUNT1,250 ;250*5us=1250us
SWS223: RJMP SWS222111
IN R_RB, PINB ;1T,读端口B
SBRC R_RB, RFIN ;2T,位'RFIN'被清0跳行,
RCALL RF_INYN
SBRC FLAG,UP_XUE ;2T
RJMP SWS222
RCALL YS1 ;3T+13T
DEC JIAN_COUNT1 ;1T
BRNE SWS223 ;2T
;约5us
DEC JIAN_COUNT2
BRNE SWS224
RJMP MAIN ;超过125ms时间没有遥控按下,跳入正常状态
SWS222: ;有遥控按下,再判断是否为专门学习的遥控?
CPI RF_TEMP0,0 ;学习遥控键值
BRNE MAIN
LDI TEMP,0xD6
CP TEMP,RF_TEMP1
BRNE MAIN
LDI TEMP,0x41
CP TEMP,RF_TEMP2
BRNE MAIN
SWS222111:
IN R_RB, PINB ;读端口B
SBRC R_RB, 2 ;位'RFIN'被清0跳行,
RJMP MAIN
SBR FLAG, 0B00100000 ;学习标记置1
RCALL SER_EE ;EEPROM置FF,取消学习
RCALL SOUND02
RCALL SOUND12 ;
RCALL SOUND02
RCALL SOUND12 ;
RCALL SOUND02
RCALL SOUND12 ;学习响3声
LDI dt,255
RCALL delay
WAIT:
WDR
IN R_RB, PINB ;1T,读端口B
SBRC R_RB, RFIN ;2T,位'RFIN'被清0跳行,
RCALL RF_INYN
RJMP WAIT ;学习完应重新上电
MAIN:
RCALL SOUND01
RCALL SOUND11 ;上电响一声
CLR FLAG
CLR FLAG1
; SBI PORTB, BL_F72 ;蓝线为高
MAIN1:
LDI dt, 200 ;延时
RCALL delay
MAIN_LOOP:
WDR
RCALL JIAN_PD
SBRS FLAG, VT ;位置位跳行
RJMP MAIN_LOOP
SBRC FLAG, LOCK_KY ;设防?
RJMP LOCK_SF ;设防
SBRS FLAG, SEEK_KY ;寻车?
RJMP NEXT1
ANDI FLAG, 0B11100000 ;清0!!!!!!!!!!!!!!!!!!!
SBRC FLAG1, SEEK_KY ;
RJMP SWS_101
SBI PORTB,4
ORI FLAG1, 0B00000010
RJMP MAIN1
SWS_101:
CBI PORTB,4
ANDI FLAG1, 0B11111101
RJMP MAIN1
NEXT1:
SBRC FLAG, UNLK_KY ;解锁?
RJMP UP1
ANDI FLAG, 0B11100000 ;清0!!!!!!!!!!!!!!!!!!!
RJMP MAIN1
UP1:
ANDI FLAG, 0B11100000 ;清0!!!!!!!!!!!!!!!!!!!
SBRC FLAG1, UNLK_KY ;
RJMP SWS_102
SBI PORTB,5
ORI FLAG1, 0B00000100
RJMP MAIN1
SWS_102:
CBI PORTB,5
ANDI FLAG1, 0B11111011
RJMP MAIN1
LOCK_SF:
ANDI FLAG, 0B11100000 ;清0!!!!!!!!!!!!!!!!!!!
SBRC FLAG1, LOCK_KY ;
RJMP SWS_100
SBI PORTB,3
ORI FLAG1, 0B00000001
RJMP MAIN1
SWS_100:
CBI PORTB,3
ANDI FLAG1, 0B11111110
RJMP MAIN1
;*****************************************************************************
JIAN_PD: ;按键判断
LDI JIAN_COUNT2,13 ;13*1250us=16.25ms
SWS324:
LDI JIAN_COUNT1,250 ;250*5us=1250us
SWS323:
IN R_RB, PINB ;1T,读端口B
SBRC R_RB, RFIN ;2T,位'RFIN'被清0跳行,
RCALL RF_INYN
SBRC FLAG,VT ;2T
RJMP SWS322
RCALL YS1 ;3T+13T
DEC JIAN_COUNT1 ;1T
BRNE SWS323 ;2T
;约5us
DEC JIAN_COUNT2
BRNE SWS324
SWS322: RET
;*****************************************************************************
SER_EE: ;EEPROM置FF,取消学习,EE_ADR之前应清0
CLR TEMP ;置FF
LP111:
INC EE_ADR ;1,2,3,4,5,6
MOV EE_DATA,TEMP
RCALL EE_W
CPI EE_ADR, 6
BRNE LP111 ;若不相等,转,
CLR EE_ADR
RET
;****************************;寻车响10声******************************************
SEEK10:
LDI COUNT_S,10 ;寻车响10声
SEEK101:
RCALL SOUND01
RCALL SOUND11
; RCALL JIAN_PD
; SBRC FLAG, VT ;没有遥控,跳行
; RJMP SWS666
DEC COUNT_S
BRNE SEEK101
SWS666:
LDI dt, 150 ;延时500ms
RCALL delay
ANDI FLAG, 0B11100000 ;清0!!!!!!!!!!!!!!!!!!!
RET
;**********************************************************************
SOUND01:
LDI TEMP, 1
MOV SOU_DWN,TEMP
RJMP SWS01
SOUND02:
LDI TEMP, 2
MOV SOU_DWN,TEMP
SWS01:
LDI TEMP, 122
MOV COU_FLG,TEMP
LOOP55:
LDI COUNT_1,4 ;同一频率循环次数
SOU03:
SBI PORTB, SOU_OUT ;
MOV COU_T, COU_FLG ;频率起点
DEYS01:
RCALL YS5 ;8T
DEC COU_T ;1T
BRNE DEYS01 ;2T 不为0,转
;11T (1/4.8)*11=2.29us*122=280us
CBI PORTB, SOU_OUT ;
MOV COU_T, COU_FLG ;
DEYS02:
RCALL YS5 ;8T
DEC COU_T ;1T
BRNE DEYS02 ;2T 不为0,转
;11T (1/4.8)*11=2.29us*122=280us
DEC COUNT_1 ;同一频率循环次数
BRNE SOU03
SUB COU_FLG,SOU_DWN ;递减,频率递增
MOV TEMP, COU_FLG
CPI TEMP, 42 ;(1/4.8)*11=2.29us*42=96us
BRCC LOOP55 ;TEMP>=42
RET
;**********************************************************************
SOUND11:
LDI TEMP, 1
MOV SOU_DWN,TEMP
RJMP SWS11
SOUND12:
LDI TEMP, 2
MOV SOU_DWN,TEMP
SWS11:
LDI TEMP, 42
MOV COU_FLG,TEMP
LOOP99:
LDI COUNT_1,4 ;同一频率循环次数
SOU13:
SBI PORTB, SOU_OUT ;
MOV COU_T, COU_FLG ;频率起点
DEYS11:
RCALL YS5 ;8T
DEC COU_T ;1T
BRNE DEYS11 ;2T 不为0,转
;11T (1/4.8)*11=2.29us*42=96us
CBI PORTB, SOU_OUT ;
MOV COU_T, COU_FLG ;
DEYS12:
RCALL YS5 ;8T
DEC COU_T ;1T
BRNE DEYS12 ;2T 不为0,转
;11T (1/4.8)*11=2.29us*42=96us
DEC COUNT_1 ;同一频率循环次数
BRNE SOU13
ADD COU_FLG,SOU_DWN ;递增,频率递减
MOV TEMP, COU_FLG
CPI TEMP, 122 ;(1/4.8)*11=2.29us*122=280us
BRCS LOOP99 ;TEMP<122
RET
;***************************************************************
EE_W: ;EEPROM写
KKK8: SBIC EECR, EEPE ;等待上一次写操作结束
RJMP KKK8 ;
LDI EE_CON, $00 ;
OUT EECR, EE_CON ;擦除与写入操作在一个时钟周期中完成
OUT EEDR, EE_DATA ;将数据写入数据寄器
OUT EEAR, EE_ADR ;设置地址寄存器
SBI EECR, EEMPE ;
SBI EECR, EEPE ;位EEWE 以启动写操作
RET
;***************************************************************
EE_R: ;EEPROM读
KKK9: SBIC EECR, EEPE ;
RJMP KKK9 ;
OUT EEAR, EE_ADR ;
SBI EECR, EERE ;启动读
IN EE_DATA,EEDR ;
RET
;********************************************************************
;* 二次嵌套通用延时程序*
;* *
;* if fos=4.8mhz time (3.5us------1s) *
;* dt time *
;* 22 2ms *
;* 29 4.3ms
;* 39 10ms *
;* 50 20ms *
;* 75 65ms *
;* 100 150ms *
;* 120 250ms *
;* 150 492ms *
;* 200 1.15s *
;*************
delay:
push dt
del1: push dt
del2: push dt
del3: WDR
dec dt
brne del3
pop dt
dec dt
brne del2
pop dt
dec dt
brne del1
pop dt
ret
;********************************************************************
ADR_CMP: ;20位地址比较
INC EE_ADR
RCALL EE_R
CP EE_DATA,RF_TEMP2
BRNE NEXT200 ;不相等,转
INC EE_ADR
RCALL EE_R
CP EE_DATA,RF_TEMP1
BRNE NEXT200 ;不相等,转
INC EE_ADR
RCALL EE_R
CP EE_DATA,RF_TEMP0
BRNE NEXT200 ;不相等,转
ORI FLAG, 0B01000000 ;ADR_OK,置位
NEXT200:
RET
;********************************************************************
YS1: ;2.71us
RJMP YS2 ;2T
YS2: RJMP YS3 ;2T
YS3: RJMP YS4 ;2T
YS4: RJMP YS5 ;2T
YS5: WDR ;1T
RET ;4T
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
RF_INYN: ;遥控输入
ANDI FLAG, 0B10111111 ;ADR_OK,位清0
CLR CNT24
HIGH_LOOP0:
CLR RF_T
HIGH_LOOP: ;最大脉宽(2.4MΩ):1684*(3/4)*1.2=1515us
CPI RF_T, 160 ;1T 135*11.67=1575us
BRCC RFOUT ;1T/2T ;>宽脉宽,转,解码不成功
WDR ;1T
RCALL YS1 ;3T+13T
RCALL YS1 ;3T+13T
RCALL YS1 ;3T+13T
INC RF_T ;1T
IN R_RB, PINB ;1T ;读端口B
SBRC R_RB, RFIN ;1T/2T/3T ;位 RFIN 被清0跳行,
RJMP HIGH_LOOP ;2T
;8T+3*16T=56T 4.8MHz (1/4.8)*56=11.67us
INC CNT24
CPI CNT24, 25
BREQ RFBIT ;若相等,转,24位数据接收完
CPI RF_T, RF10
BRCS BIT0 ;小于,转
CPI RF_T, RF11
BRCC RFOUT ;>RF11,解码不成功
SEC ;读到1
RJMP YYY
BIT0:
CPI RF_T, RF00
BRCS RFOUT ;小于,转,解码不成功
CPI RF_T, RF01
BRCC RFOUT ;RF10>RF_T>RF01,解码不成功
CLC ;读到0
YYY:
ROL RF_TEMP0 ;接收的低8位:C16,C17,C18,C19,D0,D1,D2,D3
ROL RF_TEMP1 ;接收的中8位:C8--C15
ROL RF_TEMP2 ;接收的高8位:C0--C7
CLR RF_T
LOOP0:
CPI RF_T, 160 ;1T 135*11.67=1575us
BRCC RFOUT ;1T/2T ;>宽脉宽,过长时间不出现高
WDR ;1T
RCALL YS1 ;3T+13T
RCALL YS1 ;3T+13T
RCALL YS1 ;3T+13T
INC RF_T ;1T
IN R_RB, PINB ;1T ;读端口B
SBRS R_RB, RFIN ;1T/2T/3T ;位 RFIN 被置1跳行,
RJMP LOOP0 ;2T
;8T+3*16T=56T 4.8MHz (1/4.8)*56=11.67us
RJMP HIGH_LOOP0 ;
RFBIT: ;解码成功,同步的低电平未判断
ORI FLAG, 0B10000000 ;此标记在刚上电时判断是否要进入学习状态
MOV TEMP1, RF_TEMP0
ANDI TEMP1, 0B00001111 ;得到键值:D0-D3
ANDI RF_TEMP0,0B11110000 ;得到C16,C17,C18,C19
SBRS FLAG, XUE_XI ;学习
RJMP CMP_K
INC EE_ADR ;EEPROM地址:(1,2,3)(4,5,6)
MOV EE_DATA,RF_TEMP2
RCALL EE_W
INC EE_ADR
MOV EE_DATA,RF_TEMP1
RCALL EE_W
INC EE_ADR
MOV EE_DATA,RF_TEMP0
RCALL EE_W
CPI EE_ADR, 6
BRNE NEXT100 ;若不相等,转,
CLR EE_ADR
NEXT100:
RCALL SOUND01
RCALL SOUND11 ;学习成功,响一声
LDI dt, 249 ;延时
RCALL delay
RFOUT:
RET
;*************************
CMP_K: ;比较按键
LDI EE_ADR, 0 ;20位地址比较
RCALL ADR_CMP
SBRC FLAG, ADR_OK ;位清0跳行
RJMP CMP_K1
LDI EE_ADR, 3 ;另一组20位地址比较
RCALL ADR_CMP
SBRS FLAG, ADR_OK ;位置1跳行
RJMP RFOUT ;20位地址比较不成功
CMP_K1: ;20位地址比较成功
CPI TEMP1, 0B00000010
BRNE NEXT300
ORI FLAG, 0B00000001 ;LOCK_KY:K2按下,标记
RJMP RFOUT1
NEXT300:
CPI TEMP1, 0B00001000
BRNE NEXT400
ORI FLAG, 0B00000010 ;SEEK_KY:K0按下,标记
RJMP RFOUT1
NEXT400:
CPI TEMP1, 0B00000100
BRNE NEXT500
ORI FLAG, 0B00000100 ;UNLK_KY:K3按下,标记
RJMP RFOUT1
NEXT500:
CPI TEMP1, 0B00000001
BRNE RFOUT
ORI FLAG, 0B00001000 ;K1按下,标记
RFOUT1:
ORI FLAG, 0B00010000 ;VT
RJMP RFOUT |
|