工作中遇到客户想采用AD检测的不同地电压方式发送不同RF值出来,下面就是具体发送的
做法。
硬件电路:
协议设计
1、引导码--10ms ;2、键码;3、键码反码,如果长按发送会一直输出这样的波形;4、结束码-20ms;
有按键按下就发送3次 ,防止接收设备接收时出现意外。
逻辑0:高电平0.4ms,低电平1ms
逻辑1:高电平1ms,低电平0.4ms
编码的波形
代码是汇编程序,软件流程是有按键按下,AD采集识别具体按键,然后分配键值,使能发送标志F_RF_TX_EN。然后在采用在100us的中断中发送,发送一次完成计数一次,计数到达3次,清除F_RF_TX_EN使能标志。
D_RF_TX_CNT EQU D'16' ;发送数据位数
;
D_RF_TX_10MS EQU D'100' ;10MS的最大时间,基值100us
;
D_RF_TX_0_H EQU 4 ;0的高电平时间.基值100us
D_RF_TX_0_L EQU 10 ;0的低电平时间.基值100us
;
D_RF_TX_1_H EQU 10 ;1的高电平时间.基值100us
D_RF_TX_1_L EQU 4 ;1的低电平时间.基值100us
;
D_RF_WAIT_TIME EQU 200 ;重新发送的等待时间,基值100us
;
D_RF_RELEASE_TIME EQU 12 ;单击发送延时,基值10ms
D_RF_TX_RELEASE_CNT EQU 3
R_RF_TX_FLAG EQU 0X36
#DEFINE F_RF_TX_10MS R_RF_TX_FLAG,0 ;10MS低电平发射完成标志, 1:发射完成. 0:发射未完成.
#DEFINE F_RF_EN R_RF_TX_FLAG,1 ;RF使能标志. 1:启动RF发送, 0:停止RF发送
#DEFINE F_RF_EN_START R_RF_TX_FLAG,2 ;RF发送标志. 1:RF发送 0:RF不发送
#DEFINE F_RF_TX_STATUS R_RF_TX_FLAG,3 ;RF发送电平状态. 1:发送低电平 0:发送高电平
#DEFINE F_RF_EN_STATUS R_RF_TX_FLAG,4 ;RF发送 状态. 1:使能发送 0:等待时间.
#DEFINE F_RF_EN_FLAG R_RF_TX_FLAG,5
RF_CTRL:
BTRSS F_RF_EN ;
LGOTO RF_CTRL_OFF_2
RF_CTRL_ON:
BTRSC F_RF_EN_FLAG
LGOTO RF_CTRL_ON_WAIT
;
BTRSC F_RF_EN_START
RET
;
BSR F_RF_EN_FLAG ;置等待标志.
;
MOVR R_RF_DATA1,0
MOVAR R_RF_TX_DATA1
;
MOVR R_RF_DATA1,0
XORIA 0XFF ;取反键值
MOVAR R_RF_TX_DATA2
;
BCR F_RF_TX_STATUS
MOVIA 16 ;2*8
MOVAR R_RF_TX_CNT
CLRR R_RF_TX_TIME
;
BCR P_RF_OUT ;拉低
;
BCR F_RF_TX_10MS ;
BSR F_RF_EN_START ;启动发送.
;
RET
;LGOTO RF_CTRL_OFF
RF_CTRL_ON_WAIT:
BTRSC F_RF_EN_START ;发送一次完成,START置0.
LGOTO RF_CTRL_ON_WAIT_1
;
BSR P_RF_OUT ;空闲状态 拉高
;
MOVIA D_RF_WAIT_TIME ;间隔时间 200*100us--20ms
SUBAR R_RF_WAIT_TIME,0
BTRSS C
RET
CLRR R_RF_WAIT_TIME
;
BCR F_RF_EN_FLAG
;
LGOTO RF_CTRL_OFF ;去判断计数次数
RF_CTRL_ON_WAIT_1:
CLRR R_RF_WAIT_TIME ;清除发送等待时间
BSR F_RF_EN_FLAG ;置等待标志.
RET
RF_CTRL_OFF:
MOVIA D_RF_TX_RELEASE_CNT
SUBAR R_RF_TX_RELEASE_CNT,0 ;R – ACC
BTRSS C
RET
LGOTO RF_CTRL_OFF_3
RF_CTRL_OFF_2:
;
CLRR R_RF_TX_RELEASE_CNT
;
BCR F_RF_EN
;
BCR F_RF_EN_FLAG
BCR F_RF_EN_START
BCR F_RF_TX_FREE ;
BSR P_RF_OUT ;结束,置1
RET
RF_CTRL_OFF_3:
BCR P_RF_OUT ;拉低
LGOTO RF_CTRL_OFF_2
;RF发送--中断调用--100us发送一次
RF_TX:
INCR R_RF_WAIT_TIME,1 ;等待时间
BTRSC Z
DECR R_RF_WAIT_TIME,1
;
BTRSS F_RF_EN_START ;发送标志位是否置起
RET
;
BTRSS F_RF_TX_10MS ;引导码
LGOTO RF_TX_10MS
;
CLRR R_RF_WAIT_TIME
INCR R_RF_TX_TIME,1
;
BTRSC F_RF_TX_STATUS ;数据状态标志位
LGOTO RF_TX_L
RF_TX_H: ;发送1bit的高电平
BTRSC R_RF_TX_DATA1,7 ;高位先发送---
LGOTO RF_TX_H_1
RF_TX_H_0:
MOVIA D_RF_TX_0_H ;“1”的低电平时间
LGOTO RF_TX_H_2
RF_TX_H_1:
MOVIA D_RF_TX_1_H ;“1”的高电平时间
RF_TX_H_2:
BSR P_RF_OUT
;
SUBAR R_RF_TX_TIME,0
BTRSS C
RET
CLRR R_RF_TX_TIME;
;
BSR F_RF_TX_STATUS ;一个bit,发送完高电平,再发送低电平.
RET
RF_TX_L: ;发送1bit的低电平
BTRSC R_RF_TX_DATA1,7 ;高位先发送
LGOTO RF_TX_L_1
RF_TX_L_0:
MOVIA D_RF_TX_0_L ;“0”的低电平时间
LGOTO RF_TX_L_2
RF_TX_L_1:
MOVIA D_RF_TX_1_L ;“0”的高电平时间
RF_TX_L_2:
BCR P_RF_OUT
;
SUBAR R_RF_TX_TIME,0
BTRSS C
RET
CLRR R_RF_TX_TIME;
;
RLR R_RF_TX_DATA2,1
RLR R_RF_TX_DATA1,1
;
BCR F_RF_TX_STATUS ;一个bit,发送完高电平,再发送低电平.
;
DECRSZ R_RF_TX_CNT,1 ;发送个数.
RET
;
BCR F_RF_EN_START ;发送停止.
CLRR R_RF_WAIT_TIME ;清除等待计数
INCR R_RF_TX_RELEASE_CNT,1 ;发送完成 计数一次。
RET
RF_TX_10MS:
BCR P_RF_OUT ;发送10ms 低电平 ------引导码
;
INCR R_RF_TX_TIME,1
;
MOVIA D_RF_TX_10MS
SUBAR R_RF_TX_TIME,0 ;100US 时间基值
BTRSS C
RET
;
CLRR R_RF_TX_TIME ;
;
BSR F_RF_TX_10MS ;10MS发送完成,置位该标志.并输出高电平
BSR P_RF_OUT ;拉高
;
RET
RF_TX_RET:
;BSR P_RF_OUT ;默认发送脚为高电平
RET
解码思路
定时中断中处理 时间(80-100us),然后在中断调用接收解码函数,接收起始码判断。判断 L 电平的时间5MS<P_RF_RX<9MS这个范围内说明有启动信号,这个时才往后面接收数据的判断。否则就是不对的起始信号,退出解码函数。逻辑电平1和0的判断都是可以这么处理。具体实现可以看下其他网上的思路。