PT2262软件解码程序

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

我看过很多PT2262软件解码程序,都是用定时器测量脉冲宽度。占用系统太多资源。我自己编写的程序不用定时器,不用中断,代码最少。发射端为PT2262 3.3M 的电阻接收端为M8 内部1M RC振荡。解码成功后输出D口显示。编译软件为ICCA VR。

(原文件名:2272.JPG)

引用图片

#include

#include

void delay_ms(void) //毫秒延时

{

unsigned int i;

for (i=0;i<140;i++)

{

}

}

void delay_nms(unsigned int n) //延时周期{

unsigned int i;

for (i=0;i

{

delay_ms();

}

}

void spaz(void) //响蜂鸣器{

PORTC|=(1<<5);

delay_nms(50);

PORTC&=~(1<<5);

}

unsigned long decode(void) //无线解码{

unsigned long DA TA; //记录数据

unsigned char count,i; //暂时计数

/*一共接收三字节*/

DA TA=0; //

for (count=0;count<24;count++) //开始收集{

/*测量高电平宽度*/

i=0; //宽度计数while (PINC&(1<<4)) //高位计数

{

asm("nop"); //

i++; //计数增加

if (i>192) goto end; //限时解码

}

/*分辨出电平高低*/

DA TA*=2; //数据左移

if (i<64) //分辨高低{

if (!((56>i)&(i>24))) goto end; //电平合法

DA TA+=0; //记低电平}

else

{

if (!((168>i)&(i>72))) goto end; //电平合法

DA TA+=1; //记高电平}

/*测量低电平宽度*/

while (!(PINC&(1<<4))) //低位计数

{

asm("nop"); //

i++; //计数增加

if (i>224) goto end; //限时解码

}

/*低电平是否过窄*/

if (i<96) goto end; //对比宽度}

/*解码成功返结果*/

return DA TA; //成功返回

/*有误码结束解码*/

end:

return 0; //误码结束

}

void main(void)

{

unsigned long DA TA; //

unsigned char D[3]; //

signed char i; //

DDRB =0B00000000; //定义输入PORTB=0B11111111; //上拉使能

DDRC =0B11101111; //输入通道PORTC=0B11011111; //上拉选择

DDRD =0B11111111; //定义输出PORTD=0B00000000; //输出显示

while (1)

{

DA TA =decode(); //解码程序

if (DA TA>0) //

{

spaz(); //解码成功

for (i=2;i>=0;i--) //数据转换

{

D[i]=DA TA; //

DA TA>>=8; //

}

i=0; //转换完毕

while (1) //输出显示

{

if (!(PINB&(1<<0))) //按键检查

{

delay_nms(20); //防误处理

if (!(PINB&(1<<0))) //

{

i++; //显示值加

spaz();

}

while (!(PINB&(1<<0))) //按键弹起

{

delay_nms(20); //防误处理

}

}

if (i>2) break; //

PORTD=D[i]; //输出显示}

}

}

}

相关文档
最新文档