编码程序

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

发射端用IO发射前导码(如10mS高电平)+数据(多少位自己定)+停止码(10mS低电平)

通常ASK信道用1200bps。低端ASK信道用曼彻斯特编码的意义不大,虽然引入曼码可有效的提高信号品质和通讯距离,但对ASK信道而言,基础就有限,高要求的话应基于FSK 信道。

曼彻斯特编码有硬件法和软件法两类,显然对你采用的低档平台硬件法是无意义的,软件法就是用01和10分别替代01逻辑即可,只是编程需要一定技巧以保证码流的连续性和稳定性,这方面由你的编程思想和能力决定。

模仿红外遥控器编码格式,设置一个开始码,约5-10ms!

接收开始码时,延迟5-10ms,确认后,再接收其他代码!

1、接收端等待低L电平(超再生接收整形输出有信号为低L),得到后开始延时一个脉冲宽度,再次确认为L后再延时半个脉冲宽度开始按位读取输入口线电平,保证读取信号是在每一位脉冲的中部。我以前测试的脉冲串就是8位,智能车由主控机器指挥其他车子能完成预定的统一最大255种动作组合。

2、发射就简单了,只要发射两个脉冲宽度的同步头信号+8个数据位脉冲。并且连续发送同样信号数次,由接收端评估接收相同结果大于某个值即算确认一个动作。循环发送的时候结束延时则要保证十个脉冲的宽度,也就是静默间隔必须大与整个发送十个脉冲的间隔。

3、用于数据传递的时候,我就不知道可靠性和效率如何了。期待楼主的实践反馈!

基本上没有发射信号时接收输出都是小脉冲,这种方法用中断来做反而不对,直接用延时来判断位置却很好,另外就是上面很多人都有说的前面加一个比较大的同步框,判断的时候将同步框分

成几个小框,连续判断几次都是同一电平则说明是真正的同步头,这样才延时接收后面的'数据'位,,详细看一下下面的图就知道,

前面是没有发射时接收的信号,可见没有发射时几乎全是脉冲,真的是多如牛毛,而发射了接收到的就很干净,

我现在确定同步头的方法是将同步头分成10份,比如上面的我每份为400US,做一个10次循环判断,延迟400后判断数据线是否为1,是则循环递增,不是马上就退出,其实这样已经可以相当程度的排除了毛刺的干扰,因为虽然毛刺是随机的,但是还从来没有遇到过刚好每次判断同步头时每一个小份的延迟后就遇上毛刺是高电平,当然理论上不是完全可靠的,

曾经为了这个做过实际的测试,就是发射和接收在确保接收范围内,将发射次数和接收正确解码次数进行自动操作的比较,发射了20000次,接收无一次遗漏和多出,可见是比较可靠的了,这个已经用于实际产品N年了,

当然如果要不在主处理器上消耗CPU的精力去做这些低层的工作,可以用另外的一个便宜简单的小MCU作为专用的解码IC来工作,解码正确后输出有效的数据出去,就类似与

2262/2272这样的IC了,只是更加灵活的用自己的编解码方法.比如可以用T13,PIC508等等少管脚便宜的MCU

在这里简单序述一下,解码思想.网上很多采用查询方式做解码,我这里才用的中断方式;查询方式适合单片机简单应用,无其他控制或采集信号或做显示LCD等复杂应用,因为这样太耗资源.我这里采用的中断处理方法接在IN T0上,感觉还不错,包括自学习功能以及LCD 显示,IIC程序模块..等功能无任何冲突.效果不错

1. 因为无线接收模块平时为低电平,将其信号反向后接入INT0

2. 下将沿中断产生,检测同步头信息,如果同步头错误则跳出中断,如果正确则在中断中不要出中断

3. 同步头检测到后,用T0或T1 计算高电平和低电平的时间,这样就可以解析出码流了.

该方法误码率极低,几乎只要同步头检测到,并最后解析到的数据都是正确的.我还没发现有错误的.感觉很爽啊,争取以后在家里智能控制方面做个简单应用.

前导码:400us高,200us低

“1”:150高,150低

“0“:100高,150低

结束码:400us高,300us低或者数据码的反码

我设计的是先200us宽度高电平,下跳后等200us后再来一个2ms的高。(前导码),逻辑1是800us的高电平,400us的低;0是400us的高电平,400us的低。

#include

/*

说明:接收模块收到的高电平持续时间比发射模块发射的高电平持续时间少20us左右

接收模块收到的低电平持续时间比发射模块发射的低电平持续时间多20us左右

*/

void send_byte(unsigned char *dat,unsigned char data_num)

{

unsigned char a=0,b=0,c=0,temp=0;

unsigned int time=0;

//****************发前导码********************

rf_send=1;

delay_ms(1);

rf_send=0;

delay_us(200);

//************************************************ //********************发数据********************** // 1--高--100us--低--25us

// 0--高--50us--低--25us

for(a=0;a

{

temp = dat[a];

for(b=0;b<8;b++)//高位先发

{

c=temp&0x80;

if(c==0x80)

{

rf_send=1;

delay_us(200);

rf_send=0;

delay_us(100);

}

else

{

rf_send=1;

delay_us(100);

rf_send=0;

delay_us(100);

}

temp=temp<<1;

}

}

rf_send = 0;

}

//*******************收数据********************** // 前导码--高--800us--低--800us(0x0190)

// 1--高--600us--低--400us

// 0--高--400us--低--600us

// 600us--0x012c--400us--0x0096

unsigned char get_byte()

{

unsigned char b=0,d=0,g=0;

//*********处理前导码***********

while(rf_get==0)

{

delay_us(5);

d++;

相关文档
最新文档