一个简单的遥控器接收程序

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


发射码规则:开始码,数据1,数据2,数据3
1 开始码
5ms低电平,然后5ms高电平代表开始码。
2“0”位表示方法
1ms低电平,然后1ms高电平代表“0”位。
3“1”位表示方法
1ms低电平,然后2ms高电平代表“1”位。
4 数据长度
数据长度定位为开始码然后加上3个字节位,一共24位。
5 数据格式
数据内容一共有十阶,分别为0x51,0x52,0x53…ox59,分别表示电位器所处的位置,10%,20%,30%。。。90%。

软件实现
采用AT89C2051的INT0进行中断。
1 先进行开始码检测,如果确认为开始码进行数据检测;
2 每接收一位数据,数据计数器进行递增,当数据接收完成后,退出接收状态;
3 进行“0”“1”检测,如果高电平为1ms则设置该位为“0”,如果高电平时间为2ms则说明该位为“1”。
4 进行数据处理


中断初始化程序
void InitINT0 (void)
{
IT0 = 1; // Configure interrupt 0 for falling edge on /INT0 (P3.2)
EX0 = 1; // Enable EX0 Interrupt
EA = 1; // Enable Global Interrupt Flag
RFStartFlag = 0;
RFPermitFlag = 0;
}

信号中断采样
void ex0_isr (void) interrupt 0
{
RFTickTime = 0;
RFPermitFlag = 1;
}

脉冲时间的计算方法:
void timer0_ISR (void) interrupt 1 //50us中断处理程序
{
RFTickTime ++; //计算脉冲的时间
if(++RFRunTime>=2000) //如果中断长时间没有相应,则认为是发射信号中断
{
RFStartFlag = 0;
RFPermitFlag=0;
}
}

数据记录程序

void RFSamplePro(void)
{
if((INT0)&(RFPermitFlag))
{
RFPermitFlag = 0;

RFTickTimeBak = RFTickTime;

if(RFStartFlag)
{
//Sample Data
if((RFTickTimeBak>12)&(RFTickTimeBak<28)) //Tick Time 20
{
RFData<<=1;
RFTickCounter ++;
}
else if((RFTickTimeBak>32)&(RFTickTimeBak<48)) //Tick Time 40
{
RFData <<=1;
RFData ++;
RFTickCounter ++;
}
else
{
RFStartFlag = 0;
}
if(RFTickCounter>=24)
{
RFStartFlag = 0;
RFOKFlag = 1;
RFDataOut = RFData;
RFData = 0;
//RFFreeTime = 0;
}
}
else
{
//Start Flag Check
if((RFTickTimeBak>80)&(RFTickTimeBak<120))
{
RFStartFlag = 1;
RFTickCounter = 0;
RFData = 0;
RFRunTime = 0;
}
}
}
}

采样完成后对采样数据进行分析、转换和处理
if(RFOKFlag)
{
RFOKFlag

= 0;
RFData3 = RFDataOut;
RFData2 = RFDataOut>>8;
RFData1 = RFDataOut>>16;
if(RFData1&&0x50==0x50)PWM_LM = (RFData1&0xF)*10;
if(RFData2&&0x50==0x50)PWM_RM = (RFData2&0xF)*10;
if(RFData3&&0x50==0x50)PWM_FW = (RFData3&0xF)*10;
}



相关文档
最新文档