特性:
- 20 位地址码:支持 1048576 组唯一编码,降低重复概率。
- 4 位按键码:支持 16 种按键组合。
- 同步脉冲:每帧数据以同步码开头,便于接收端识别。
- 软件解码:需通过单片机解析信号,灵活性高。
硬件:
某宝买的H34S(发射模块),JJ43S(接收模块),买前先咨询编码方式是哪种。很重要
注:JJ43S需将低功耗引脚SLP接地才能正常使用。
时序图
如时序图和振荡周期表,以330K/3V为例,1.69ms是完整一个周期的时间,一个周期为4+12LCK=16LCK,即一个LCK=1.69/16=105.625us,故需要使用定时器产生105.625us的延时。
软件:
只需按正常协议发波即可,重点是需要连续发3次确定被接收到,刚开始发1次,330K的振荡周期都试过了,还是不行,后面观察自动发射的模块波形才发现是连续发3次,可能是JJ43S软件解码的原因导致。
总结软件实施步骤:
1.延时函数通过定时器中断产生1us,再根据需要的振荡周期进行配置
2.保证同步码在前,接着是地址和数据,除同步码外,共需发送24位(20位地址+4位数据)
具体如下:
延时函数:
// 延时一个振荡周期
void delay_one_osc_period(void) {
TIM_SetCounter(TIM3, 0);
while (TIM_GetCounter(TIM3) < TIM_PERIOD);
}
同步码:
// 发送同步码
void send_sync_code(void) {
uint8_t i;
// 高电平部分
GPIO_SetBits(GPIOA, GPIO_Pin_0);
for (i = 0; i < SYNC_CODE_LENGTH_HIGH; i++) {
delay_one_osc_period();
}
// 低电平部分
GPIO_ResetBits(GPIOA, GPIO_Pin_0);
for (i = 0; i < SYNC_CODE_LENGTH_LOW; i++) {
delay_one_osc_period();
}
}
数据位:
// 发送一个数据位
void send_data_bit(bool bit) {
uint8_t i;
if (bit) {
// DATA(H) 12LCK高 + 4LCK低
GPIO_SetBits(GPIOA, GPIO_Pin_0);
for (i = 0; i < 12; i++) {
delay_one_osc_period();
}
GPIO_ResetBits(GPIOA, GPIO_Pin_0);
for (i = 0; i < 4; i++) {
delay_one_osc_period();
}
} else {
// DATA(L) 4LCK高 + 12LCK低
GPIO_SetBits(GPIOA, GPIO_Pin_0);
for (i = 0; i < 4; i++) {
delay_one_osc_period();
}
GPIO_ResetBits(GPIOA, GPIO_Pin_0);
for (i = 0; i < 12; i++) {
delay_one_osc_period();
}
}
}
发送整帧:
// 发送编码数据
void send_encoded_data(uint32_t data) {
uint8_t i;
for (i = 0; i < 24; i++) {
send_data_bit((data >> (23 - i)) & 0x01);
}
}
波形:
总结:
1.连续发送3次,正常接收,330K所有等级电压均适合,按需选择