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

📄 rx_demodulation.asm

📁 一个无线接收子程序,它接收一个2mS高2mS低电平起始位
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;******************************************************
;文件名: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 + -