📄 rx_demodulation.asm
字号:
;******************************************************
;文件名:RX_Demodulation.asm
;创建日期:Mar 22, 07
;版本: 1.0
;设计: MORSE WONG
;公司名称:
;******************************************************
;功能描述
;解调超再生接收模块的信号
;芯片选择EM78P153 使用内部4M基准
;******************************************************
;******************************************************
;无线发射定义
;高位在前,先发射高字节再发射低字节
;start(起始信号) 11(同步码) xxxxxxxx(地址高位) xxxxxxxx
;(地址低位) xxxxxxxx(遥控信息码见下附注) xxxxxxxx(和校验
;位,地址高位+地址低位+遥控信息位取最后八位=和校验位(取
;最后八位))
;遥控信息位说明:
;Start信号为2mS高电平加2mS低电平
;Logic'0'为1.5mS高电平加0.5mS高电平
;Logic'0'为0.5mS高电平加1.5mS高电平
;******************************************************
;I/O口分配 P5 P6
;******************************************************
en_rx equ 0 ;P5.0接收使能端,高电平开始接收
buz equ 1 ;p5.1
rx_dat equ 6 ;P6.6无线接收数据输入端
;******************************************************
;数据存储器分配
;******************************************************
dell equ 0x10 ;延时常数
delr equ 0x11 ;延时常数
flag equ 0x12 ;标志位存放寄存器
temp equ 0x13 ;临时寄存器
save equ 0x14 ;中断时作A中值暂存器
temp1 equ 0x15 ;临时寄存器
flag1 equ 0x16 ;start_ti重分配
rx_data equ 0x17 ;数据接收寄存器
rx_8bit equ 0x18 ;接收8位数据
;---->
add0 equ 0x19 ;接收地址码低位
add1 equ 0x1a ;接收地址码高位
rx_file equ 0x1b ;接收遥控信息位
rx_check equ 0x1c ;接收校验位
;---->
rfr_ti equ 0x1d ;无线接收时间控制
pulse_ti equ 0x1e ;脉冲时间寄存器
;---->
unit0_l equ 0x27 ;设备0地址低位
unit0_h equ 0x28 ;设备0地址高位
unit1_l equ 0x29 ;设备1地址低位
unit1_h equ 0x2a ;设备1地址高位
;******************************************************
;标志位分配
;******************************************************
logic0 equ 0 ;逻辑零标志位
logic1 equ 1 ;逻辑壹标志位
start_fl equ 2 ;起始位标志
rx_ing equ 3 ;接收中标志位
add0_fl equ 4 ;接收完地址低位标志
add1_fl equ 5 ;接收完地址高位标志
rxfi_fl equ 6 ;接收完遥控信息标志
rx_right equ 7 ;接收有效标志位
;---->
error equ 0 ;读写错误标志位
add_right equ 1 ;sn_fl重定义为地址正确位
ck_right equ 2 ;校验位有效
;******************************************************
;******************************************************
;入口地址分配
;******************************************************
org 0x00
jmp main ;主程序入口地址
org 0x08
jmp int_ser ;时钟中断入口地址
org 0x10
;******************************************************
;主程序区
;******************************************************
main:
disi
mov a,@0x00 ;禁止WDT
iow wdtcg
mov a,@0x00 ;配置CONT
contw
;---->
mov a,@0b00000000
iow ioc5 ;P5口设置,0为输出,1为输入
mov a,@0b01001000
iow ioc6 ;P6口设置,0为输出,1为输入
mov a,@0b11111111
iow io6_ph ;上拉P67~P60
mov a,@0b11111111 ;1禁止,0使能
iow io6_pd ;下拉-P62/61/60 - P52/51/50
;---->
mov a,@0b01001000
mov prot6,a ;P6口初始化输出
mov a,@0b00000000
mov prot5,a ;P5口初始化输出
;---->
jbc status,p ;是否WDT溢出
jmp main_n0
jbc status,t ;是否由于SLEEP时间到
jmp main_n0
jmp rf_receiver ;是Sleep时间到
;---->
main_n0:
mov a,@0xe0
mov 0x10,a
mov a,@0x11
mov fsr,a
clear_ram:
clra
mov indf,a
inc fsr
jz 0x10
jmp clear_ram
;---->设置上电睡眠
mov a,@0x08 ;0x0c 320mS接收40mS
mov rfr_ti,a
main_sleep:
call int_sleep ;设置40mS睡眠
jmp main
;---->WDT唤醒后执行以下程序
;******************************************************
rf_receiver:
djz rfr_ti
jmp main_sleep
bs prot5,en_rx ;使能接收开始
mov a,@0x02
mov rfr_ti,a ;接收20mS
clr flag1
call int_timer ;定时器初始化开始定时
rfr_n0:
call high_pulse ;检测高电平脉冲
call det_pulse_ti ;判断脉冲时间
jbs flag1,logic1
jmp rfr_n1
call low_pulse ;判断低电平
call det_pulse_ti
jbs flag1,logic0
jmp rfr_n0 ;不是低电平继续判断
jmp rx_start ;正式开始收一帧信号
rfr_n1:
jbs flag1,logic0
jmp rfr_n0 ;非零重新接收
call low_pulse ;判断低电平
call det_pulse_ti
jbs flag1,logic1
jmp rfr_n0 ;不是低电平继续判断
rx_start:
mov a,@0x10
mov rfr_ti,a ;接收320mS
rxst_n0:
call high_pulse ;检测高电平
call det_spulse ;判断起始位时间是否为2.5mS
jbs flag1,start_fl
jmp rxst_n0
call low_pulse ;检测低电平
call det_spulse ;判断起始位时间是否为2.5mS
jbs flag1,start_fl
jmp rxst_n0
call high_pulse ;检测高电平脉冲
call det_pulse_ti ;判断脉冲时间
jbs flag1,logic1
jmp rxst_n0
call high_pulse ;检测高电平脉冲
call det_pulse_ti ;判断脉冲时间
jbs flag1,logic1
jmp rxst_n0
clr add0 ;清除接收寄存器
clr add1
clr rx_file
clr rx_check
rxst_n1:
call high_pulse ;检测高电平脉冲
call det_pulse_ti ;判断脉冲时间
jbs flag,error ;看是否为无效数据
jmp rxst_n2
call clr_rxreg ;清除寄存器重接收
jmp rxst_n0 ;重新接收帧信号
rxst_n2:
call dat_process ;接收数据处理
jbs flag1,rx_right
jmp rxst_n1
call count_check
jbs flag,ck_right
jmp rxst_n4
disi
clr rf
nop ;收完一帧数据
mov a,@0x7b
sub a,rx_file
jbs status,z
jmp rem_n0
call buzzer
call buzzer
call buzzer
call buzzer
call buzzer
call buzzer
call del200ms
jmp rxst_n4
rem_n0:
mov a,@0x7d
sub a,rx_file
jbs status,z
jmp rem_n1
call buzzer
call buzzer
call buzzer
call del200ms
call buzzer
call buzzer
call buzzer
call del200ms
jmp rxst_n4
rem_n1:
mov a,@0x7e
sub a,rx_file
jbs status,z
jmp rxst_n4
call buzzer
call buzzer
call del200ms
call buzzer
call buzzer
call del200ms
call buzzer
call buzzer
call del200ms
jmp rxst_n4
; mov a,@0xaa ;假设接收到的数据是0xaa则执行地址码学习
; sub a,rx_file
; jbs status,z
; jmp rxst_n3
;---->
; disi
; call add_compare
; jbc flag,add_right
; jmp exit_rx
; call learn_code ;地址码学习
; call clr_rxreg
; jmp exit_rx ;重接收
;rxst_n3:
; call add_compare
; jbs flag,add_right
; jmp rxst_n4 ;重接收
;此处加接收结果处理程序
; jmp exit_rx
rxst_n4:
call clr_rxreg
jmp rxst_n0 ;重接收
;---->以上为无线接收主程序
;******************************************************
;接收数据处理
;接收地址码信息码校验码
;影响:
;******************************************************
dat_process:
jbc flag1,rx_ing
jmp datp_n0
mov a,@0x08
mov rx_8bit,a ;接收8位计数
bs flag1,rx_ing ;置正在接收标志位
mov a,@0x00
mov rx_data,a
bc status,c ;清C
datp_n0:
jbs flag1,logic1
jmp datp_n1
bs rx_data,0 ;置接收位1
jmp datp_n2
datp_n1:
bc rx_data,0 ;数据位为0
datp_n2:
rlc rx_data ;左移temp中的内容
djz rx_8bit
jmp datp_exit ;未收完8位
rrc rx_data
;---->
jbc flag1,add1_fl
jmp datp_n3
mov a,rx_data
mov add1,a
bs flag1,add1_fl
bc flag1,rx_ing
jmp datp_exit
datp_n3:
jbc flag1,add0_fl
jmp datp_n4
mov a,rx_data
mov add0,a
bs flag1,add0_fl
bc flag1,rx_ing
jmp datp_exit
datp_n4:
jbc flag1,rxfi_fl
jmp datp_n5
mov a,rx_data
mov rx_file,a
bs flag1,rxfi_fl
bc flag1,rx_ing
jmp datp_exit
datp_n5:
mov a,rx_data
mov rx_check,a
bc flag1,rx_ing
bs flag1,rx_right ;接收完一帧位号标志位置1
datp_exit:
nop
ret
;******************************************************
;高电平脉冲时间判断
;判断高电平时间是多少
;影响:
;******************************************************
high_pulse:
clr pulse_ti
high_n0:
jbs prot6,rx_dat
jmp high_n0
high_n1:
call del10us
inc pulse_ti ;脉冲高电平时间
jbc prot6,rx_dat
jmp high_n1
ret
;******************************************************
;低电平脉冲时间判断
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -