5104摇控解码程序
请教一下,不用外部中断,利用定时中断扫描来实现5104的解码?
全部回复(4)
正序查看
倒序查看
现在还没有回复呢,说说你的想法
@meidi688
没人帮忙,自己顶一下,已经做出来了!求人不如求已,这句话永远是真理!
松翰写的.
;;date:2006/02/28
;;版本:1
;;说明:芯片选用SN8P2602A
;;-------------------------------------------------
CHIP SN8P2602A
//{{SONIX_CODE_OPTION
.Code_Option Noise_Filter Enable
.Code_Option Reset_Pin Reset
.Code_Option Watch_Dog Disable ; Disable Watchdog
.Code_Option High_Clk 4M_X'tal ; Crystal/Resonator: 2Mhz~10Mhz
.Code_Option Fcpu #2 ; Fcpu = High_Clk/4
.Code_Option Security Enable
//}}SONIX_CODE_OPTION
;;=================================================
.DATA
;;通用寄存器定义:
ACC_BUF DS 1
PFLAG_BUF DS 1
TIME_ADD DS 1
PASHE_BUF DS 1
LOOP_A DS 1
LOOP_B DS 1
PASHE_TIME DS 1 ;;相位延迟时间寄存器
YW_2 DS 1
YW_1 DS 1
CMD_BUF DS 1
MC_BUF DS 1
NUMBER DS 1
MC_BIAO DS 1
BIAO03 DS 1
D_TIMER DS 1
T0_BUF DS 1
BIAO DS 1
YK_ING EQU BIAO.0 ;;处理遥控标志
B_BELL EQU BIAO.1 ;;响蜂鸣器标志
ON_OFF EQU BIAO.7 ;;开关状态标志
ON_FLAME EQU BIAO.6 ;;火焰状态标志
HEAT_EN EQU BIAO.4 ;;加热开关状态标志
LOW_HIGH EQU BIAO.5 ;;加热档位状态标志
;;=================================================
_LOAD_H EQU P1.3 ;;负载输出高档
_LOAD_L EQU P1.2 ;;负载输出低档
_LOAD EQU P5.7 ;;火焰输出
_MG EQU P1.0 ;;电机输出
_YK EQU P5.0 ;;遥控信号输入
_BUZZER EQU P5.4 ;;蜂鸣器驱动
;;=================================================
.CODE
ORG 000H
JMP MAIN
ORG 008H
JMP INT_ING
ORG 010H
;;=================================================
;;****************************************************
;;****************************************************
INT_ING:
B0XCH A,ACC_BUF ;;保护ACC
NOP
B0MOV A,PFLAG
MOV PFLAG_BUF,A ;;保护PFLAG
;;-------------------------
INCMS T0_BUF
NOP
NOP
MOV A,T0_BUF
B0ADD PCL,A
NOP
JMP INT_ONE
JMP INT_TWO
JMP INT_THREE
NOP
NOP
CLR T0_BUF
JMP INT_OUT
;;==================================
INT_ONE:
NOP
B0BCLR _LOAD ;;进入中断首先关负载
NOP
B0BCLR _LOAD
NOP
;;=====================================
NOP
B0BCLR FP00IRQ ;;p0中断
NOP
;;-------------------------------------
/*
;;------------------------
INCMS TIME_ADD
NOP
NOP
MOV A,#4D
SUB A,TIME_ADD
B0BTS0 FC
JMP INT_ONE_AA
NOP
CLR TIME_ADD
;;------------------------
MOV A,PASHE_BUF
CMPRS A,PASHE_TIME
JMP INT_ONE_CC
NOP
JMP INT_ONE_AA
NOP
;;------------------------
INT_ONE_CC:
NOP
B0BTS0 FC
JMP ONE_ONE
NOP
INCMS PASHE_BUF
NOP
NOP
JMP INT_ONE_AA
ONE_ONE:
NOP
DECMS PASHE_BUF
NOP
NOP
*/
;; === === === === === === === === === ===
;; --- P0.0中断的任务是关闭负载并启动定时
;; === === === === === === === === === ===
INT_ONE_AA:
B0BCLR FT0ENB ;;!!!!!!!
B0BCLR FT0IRQ
B0BCLR FT0IEN
;;-----------------------
;;-----------------------
INT_AAA:
B0BCLR FT0ENB
NOP
B0BCLR FT0IRQ
NOP
;;----------------------
MOV A,PASHE_TIME
B0MOV T0C,A ;;加载T0
NOP
B0BCLR FT0IRQ
NOP
B0BSET FT0IEN ;;
NOP
B0BSET FT0ENB ;;启动T0
B0BCLR FP00IEN
B0BCLR FP00IRQ
JMP INT_OUT
;; === === === === === === === ===
;; T0中断的任务是开启负载并启动1ms定时
;; === === === === === === === ===
INT_TWO:
NOP
NOP
B0BCLR FT0ENB
NOP
MOV A,#240D
B0MOV T0C,A
NOP
B0BCLR FT0IRQ
B0BSET FT0IEN
B0BSET FT0ENB
B0BCLR FP00IRQ
B0BCLR FP00IEN
;;---------------------------
B0BSET _LOAD
NOP
JMP INT_OUT
INT_THREE:
NOP
B0BCLR FT0ENB
CLR T0_BUF
B0BCLR _LOAD
NOP
NOP
B0BCLR FT0IRQ
B0BCLR FT0IEN
B0BCLR FP00IRQ
B0BSET FP00IEN
NOP
;;************************************************
INT_OUT:
MOV A,PFLAG_BUF
B0MOV PFLAG,A ;;恢复PFLAG
NOP
B0XCH A,ACC_BUF ;;恢复ACC
RETI
;;=================================================上电初始化
MAIN:
NOP
MOV A,#0X00
B0MOV P1,A ;;设置P1口初值
MOV A,#0X0F
B0MOV P1M,A
NOP
;;--------------------------
MOV A,#00000001B
B0MOV P5,A
NOP
MOV A,#11111110B
B0MOV P5M,A
NOP
;;------------------------------
B0BCLR _BUZZER
NOP
B0BSET FP54M
;;-------------------------------
MOV A,#0X18
B0MOV PEDGE,A ;;双边沿触发中断
;;-------------------------------
;;------------------------------- T0 定时器设置:
NOP
MOV A,#20H
B0MOV T0M,A ;;64 div
MOV A,#130D
B0MOV T0C,A ;;83ms
B0BCLR FT0IRQ
;;-------------------------------
MOV A,#47D
MOV ACC_BUF,A
CLR Y
CLR Z
CLR_RAM:
INCMS Z
NOP
NOP
CLR @YZ
NOP
DECMS ACC_BUF
JMP CLR_RAM
NOP
MOV A,#250D
MOV PASHE_TIME,A
NOP
;; -------------------------------
CALL BUZZER_OPEN
NOP
MOV A,#250D
MOV LOOP_A,A
NOP
DELAY_A:
MOV A,#100D
MOV LOOP_B,A
NOP
DELAY_B:
NOP
DECMS LOOP_B
JMP DELAY_B
NOP
DECMS LOOP_A
JMP DELAY_A
NOP
CALL BUZZER_OFF
NOP
;; ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **
;; ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **
START:
NOP
;; --- --- --- --- --- --- --- 检测遥控信号
;; --- 起始位: 8ms
;; --- 电平 1: 1.25ms
;; --- 电平 0: 0.54ms
NOP
CLR NUMBER
CLR MC_BUF
CLR MC_BIAO
B0BCLR FTC0ENB
CLR YW_1
CLR YW_2
CLR BIAO03
NOP
B0BTS1 _YK
JMP START ;;未检测到低电平
NOP
;;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;;---------------------------------------------起始位宽度
MOV A,#00100000B ;;选择对时钟64分频
B0MOV TC0M,A
MOV A,#00D
B0MOV TC0C,A
B0BCLR FTC0IRQ
B0BSET FTC0ENB
KDKD:
NOP
B0BTS0 _YK
JMP KDKD
NOP
B0BCLR FTC0ENB
NOP
B0MOV A,TC0C
MOV MC_BUF,A
;;********************************************开始判断脉冲宽度:
B0BTS0 FTC0IRQ
JMP START_DY ;;脉冲太宽,不符合同步脉冲要求
NOP
MOV A,#60D
SUB A,MC_BUF
NOP
B0BTS0 FC
JMP START ;;脉冲太窄,不符合同步脉冲要求
;;--------------------------------------------已检测到有效的同步信号:
MC_QS:
B0BCLR FTC0ENB
NOP
CLR MC_BUF
MOV A,#12D
MOV NUMBER,A ;;待检测的脉冲序列为12个
MOV A,#01010000B ;;选择对时钟8分频
B0MOV TC0M,A
NOP
;;///////////////////////////////////启动TC0:
HHH:
CLR TC0C
B0BCLR FTC0IRQ
B0BSET FTC0ENB
;;*******************************************只检测高电平宽度
MC_B1:
NOP
B0BTS1 _YK
JMP MC_B1
NOP
B0BCLR FTC0ENB
NOP
B0BTS0 FTC0IRQ
JMP START
NOP
B0MOV A,TC0C ;;取脉冲宽度值
MOV MC_BUF,A ;;暂存
;;**************************************************
;;***============高电平结束,利用低电平持续时间判断
;;***============标准宽脉冲=1.25ms;标准窄脉冲=540us
;;**************************************************
MC_AG1:
MOV A,#37D
SUB A,MC_BUF
NOP
B0BTS0 FC
JMP START ;;脉冲太窄,不符合编码脉冲要求
NOP
MOV A,#200D
SUB A,MC_BUF
NOP
B0BTS1 FC
JMP START ;;脉冲太宽,不符合编码脉冲要求
NOP
;;-----------------------------------------------
MOV A,#95D
SUB A,MC_BUF
NOP ;;
B0BTS0 FC
JMP MC_LOW
MOV A,#105D
SUB A,MC_BUF
NOP ;;
B0BTS1 FC
JMP MC_HIGH
NOP
JMP START
;;-----------------------------------------
MC_LOW:
NOP
BCLR BIAO03.7
JMP AGIN
MC_HIGH:
BSET BIAO03.7
NOP
;;-----------------------------------------------宽度识别:
AGIN:
B0BCLR FC
NOP
RLCM BIAO03
RLCM YW_1
RLCM YW_2
NOP
B0BCLR FTC0ENB
DECMS NUMBER
JMP KKK ;;检测下一个脉冲
NOP
CLR NUMBER
JMP JIEMA
KKK:
NOP
B0BTS0 _YK
JMP KKK
NOP
JMP HHH
;;====================================== 等待高电平再次出现:
MC_AG2:
NOP
B0BTS1 _YK
JMP MC_AG2
NOP
CLR TC0C
B0BCLR FTC0IRQ
CLR MC_BUF ;;!!!
B0BSET FTC0ENB
JMP MC_B1
JIEMA:
NOP
MOV A,YW_1
MOV CMD_BUF,A ;;控制码
NOP
;;--------------------------------------
;; *** *** *** *** *** *** *** *** ***
;; --- --- 解码完成,执行遥控指令 ---
;; *** *** *** *** *** *** *** *** ***
MOV A,#0X81
XOR A,YW_1
B0BTS0 FZ
JMP K_POWER ;;开关键
;; ---- ---- ---- ---- ---- ---- ----
BTS1 ON_OFF ;;若开关键未开
JMP START ;;禁止其他操作
NOP
;; ---- ---- ---- ---- ---- ---- ----
;;date:2006/02/28
;;版本:1
;;说明:芯片选用SN8P2602A
;;-------------------------------------------------
CHIP SN8P2602A
//{{SONIX_CODE_OPTION
.Code_Option Noise_Filter Enable
.Code_Option Reset_Pin Reset
.Code_Option Watch_Dog Disable ; Disable Watchdog
.Code_Option High_Clk 4M_X'tal ; Crystal/Resonator: 2Mhz~10Mhz
.Code_Option Fcpu #2 ; Fcpu = High_Clk/4
.Code_Option Security Enable
//}}SONIX_CODE_OPTION
;;=================================================
.DATA
;;通用寄存器定义:
ACC_BUF DS 1
PFLAG_BUF DS 1
TIME_ADD DS 1
PASHE_BUF DS 1
LOOP_A DS 1
LOOP_B DS 1
PASHE_TIME DS 1 ;;相位延迟时间寄存器
YW_2 DS 1
YW_1 DS 1
CMD_BUF DS 1
MC_BUF DS 1
NUMBER DS 1
MC_BIAO DS 1
BIAO03 DS 1
D_TIMER DS 1
T0_BUF DS 1
BIAO DS 1
YK_ING EQU BIAO.0 ;;处理遥控标志
B_BELL EQU BIAO.1 ;;响蜂鸣器标志
ON_OFF EQU BIAO.7 ;;开关状态标志
ON_FLAME EQU BIAO.6 ;;火焰状态标志
HEAT_EN EQU BIAO.4 ;;加热开关状态标志
LOW_HIGH EQU BIAO.5 ;;加热档位状态标志
;;=================================================
_LOAD_H EQU P1.3 ;;负载输出高档
_LOAD_L EQU P1.2 ;;负载输出低档
_LOAD EQU P5.7 ;;火焰输出
_MG EQU P1.0 ;;电机输出
_YK EQU P5.0 ;;遥控信号输入
_BUZZER EQU P5.4 ;;蜂鸣器驱动
;;=================================================
.CODE
ORG 000H
JMP MAIN
ORG 008H
JMP INT_ING
ORG 010H
;;=================================================
;;****************************************************
;;****************************************************
INT_ING:
B0XCH A,ACC_BUF ;;保护ACC
NOP
B0MOV A,PFLAG
MOV PFLAG_BUF,A ;;保护PFLAG
;;-------------------------
INCMS T0_BUF
NOP
NOP
MOV A,T0_BUF
B0ADD PCL,A
NOP
JMP INT_ONE
JMP INT_TWO
JMP INT_THREE
NOP
NOP
CLR T0_BUF
JMP INT_OUT
;;==================================
INT_ONE:
NOP
B0BCLR _LOAD ;;进入中断首先关负载
NOP
B0BCLR _LOAD
NOP
;;=====================================
NOP
B0BCLR FP00IRQ ;;p0中断
NOP
;;-------------------------------------
/*
;;------------------------
INCMS TIME_ADD
NOP
NOP
MOV A,#4D
SUB A,TIME_ADD
B0BTS0 FC
JMP INT_ONE_AA
NOP
CLR TIME_ADD
;;------------------------
MOV A,PASHE_BUF
CMPRS A,PASHE_TIME
JMP INT_ONE_CC
NOP
JMP INT_ONE_AA
NOP
;;------------------------
INT_ONE_CC:
NOP
B0BTS0 FC
JMP ONE_ONE
NOP
INCMS PASHE_BUF
NOP
NOP
JMP INT_ONE_AA
ONE_ONE:
NOP
DECMS PASHE_BUF
NOP
NOP
*/
;; === === === === === === === === === ===
;; --- P0.0中断的任务是关闭负载并启动定时
;; === === === === === === === === === ===
INT_ONE_AA:
B0BCLR FT0ENB ;;!!!!!!!
B0BCLR FT0IRQ
B0BCLR FT0IEN
;;-----------------------
;;-----------------------
INT_AAA:
B0BCLR FT0ENB
NOP
B0BCLR FT0IRQ
NOP
;;----------------------
MOV A,PASHE_TIME
B0MOV T0C,A ;;加载T0
NOP
B0BCLR FT0IRQ
NOP
B0BSET FT0IEN ;;
NOP
B0BSET FT0ENB ;;启动T0
B0BCLR FP00IEN
B0BCLR FP00IRQ
JMP INT_OUT
;; === === === === === === === ===
;; T0中断的任务是开启负载并启动1ms定时
;; === === === === === === === ===
INT_TWO:
NOP
NOP
B0BCLR FT0ENB
NOP
MOV A,#240D
B0MOV T0C,A
NOP
B0BCLR FT0IRQ
B0BSET FT0IEN
B0BSET FT0ENB
B0BCLR FP00IRQ
B0BCLR FP00IEN
;;---------------------------
B0BSET _LOAD
NOP
JMP INT_OUT
INT_THREE:
NOP
B0BCLR FT0ENB
CLR T0_BUF
B0BCLR _LOAD
NOP
NOP
B0BCLR FT0IRQ
B0BCLR FT0IEN
B0BCLR FP00IRQ
B0BSET FP00IEN
NOP
;;************************************************
INT_OUT:
MOV A,PFLAG_BUF
B0MOV PFLAG,A ;;恢复PFLAG
NOP
B0XCH A,ACC_BUF ;;恢复ACC
RETI
;;=================================================上电初始化
MAIN:
NOP
MOV A,#0X00
B0MOV P1,A ;;设置P1口初值
MOV A,#0X0F
B0MOV P1M,A
NOP
;;--------------------------
MOV A,#00000001B
B0MOV P5,A
NOP
MOV A,#11111110B
B0MOV P5M,A
NOP
;;------------------------------
B0BCLR _BUZZER
NOP
B0BSET FP54M
;;-------------------------------
MOV A,#0X18
B0MOV PEDGE,A ;;双边沿触发中断
;;-------------------------------
;;------------------------------- T0 定时器设置:
NOP
MOV A,#20H
B0MOV T0M,A ;;64 div
MOV A,#130D
B0MOV T0C,A ;;83ms
B0BCLR FT0IRQ
;;-------------------------------
MOV A,#47D
MOV ACC_BUF,A
CLR Y
CLR Z
CLR_RAM:
INCMS Z
NOP
NOP
CLR @YZ
NOP
DECMS ACC_BUF
JMP CLR_RAM
NOP
MOV A,#250D
MOV PASHE_TIME,A
NOP
;; -------------------------------
CALL BUZZER_OPEN
NOP
MOV A,#250D
MOV LOOP_A,A
NOP
DELAY_A:
MOV A,#100D
MOV LOOP_B,A
NOP
DELAY_B:
NOP
DECMS LOOP_B
JMP DELAY_B
NOP
DECMS LOOP_A
JMP DELAY_A
NOP
CALL BUZZER_OFF
NOP
;; ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **
;; ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **
START:
NOP
;; --- --- --- --- --- --- --- 检测遥控信号
;; --- 起始位: 8ms
;; --- 电平 1: 1.25ms
;; --- 电平 0: 0.54ms
NOP
CLR NUMBER
CLR MC_BUF
CLR MC_BIAO
B0BCLR FTC0ENB
CLR YW_1
CLR YW_2
CLR BIAO03
NOP
B0BTS1 _YK
JMP START ;;未检测到低电平
NOP
;;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;;---------------------------------------------起始位宽度
MOV A,#00100000B ;;选择对时钟64分频
B0MOV TC0M,A
MOV A,#00D
B0MOV TC0C,A
B0BCLR FTC0IRQ
B0BSET FTC0ENB
KDKD:
NOP
B0BTS0 _YK
JMP KDKD
NOP
B0BCLR FTC0ENB
NOP
B0MOV A,TC0C
MOV MC_BUF,A
;;********************************************开始判断脉冲宽度:
B0BTS0 FTC0IRQ
JMP START_DY ;;脉冲太宽,不符合同步脉冲要求
NOP
MOV A,#60D
SUB A,MC_BUF
NOP
B0BTS0 FC
JMP START ;;脉冲太窄,不符合同步脉冲要求
;;--------------------------------------------已检测到有效的同步信号:
MC_QS:
B0BCLR FTC0ENB
NOP
CLR MC_BUF
MOV A,#12D
MOV NUMBER,A ;;待检测的脉冲序列为12个
MOV A,#01010000B ;;选择对时钟8分频
B0MOV TC0M,A
NOP
;;///////////////////////////////////启动TC0:
HHH:
CLR TC0C
B0BCLR FTC0IRQ
B0BSET FTC0ENB
;;*******************************************只检测高电平宽度
MC_B1:
NOP
B0BTS1 _YK
JMP MC_B1
NOP
B0BCLR FTC0ENB
NOP
B0BTS0 FTC0IRQ
JMP START
NOP
B0MOV A,TC0C ;;取脉冲宽度值
MOV MC_BUF,A ;;暂存
;;**************************************************
;;***============高电平结束,利用低电平持续时间判断
;;***============标准宽脉冲=1.25ms;标准窄脉冲=540us
;;**************************************************
MC_AG1:
MOV A,#37D
SUB A,MC_BUF
NOP
B0BTS0 FC
JMP START ;;脉冲太窄,不符合编码脉冲要求
NOP
MOV A,#200D
SUB A,MC_BUF
NOP
B0BTS1 FC
JMP START ;;脉冲太宽,不符合编码脉冲要求
NOP
;;-----------------------------------------------
MOV A,#95D
SUB A,MC_BUF
NOP ;;
B0BTS0 FC
JMP MC_LOW
MOV A,#105D
SUB A,MC_BUF
NOP ;;
B0BTS1 FC
JMP MC_HIGH
NOP
JMP START
;;-----------------------------------------
MC_LOW:
NOP
BCLR BIAO03.7
JMP AGIN
MC_HIGH:
BSET BIAO03.7
NOP
;;-----------------------------------------------宽度识别:
AGIN:
B0BCLR FC
NOP
RLCM BIAO03
RLCM YW_1
RLCM YW_2
NOP
B0BCLR FTC0ENB
DECMS NUMBER
JMP KKK ;;检测下一个脉冲
NOP
CLR NUMBER
JMP JIEMA
KKK:
NOP
B0BTS0 _YK
JMP KKK
NOP
JMP HHH
;;====================================== 等待高电平再次出现:
MC_AG2:
NOP
B0BTS1 _YK
JMP MC_AG2
NOP
CLR TC0C
B0BCLR FTC0IRQ
CLR MC_BUF ;;!!!
B0BSET FTC0ENB
JMP MC_B1
JIEMA:
NOP
MOV A,YW_1
MOV CMD_BUF,A ;;控制码
NOP
;;--------------------------------------
;; *** *** *** *** *** *** *** *** ***
;; --- --- 解码完成,执行遥控指令 ---
;; *** *** *** *** *** *** *** *** ***
MOV A,#0X81
XOR A,YW_1
B0BTS0 FZ
JMP K_POWER ;;开关键
;; ---- ---- ---- ---- ---- ---- ----
BTS1 ON_OFF ;;若开关键未开
JMP START ;;禁止其他操作
NOP
;; ---- ---- ---- ---- ---- ---- ----
1
回复
提示