PT2262软件解码程序
我看过很多PT2262软件解码程序,都是用定时器测量脉冲宽度。占用系统太多资源。我自己编写的程序不用定时器,不用中断,代码最少。发射端为PT2262 3.3M 的电阻 接收端为 M8 内部1M RC振荡。解码成功后输出D口显示。编译软件为 ICCAVR。 (原文件名:2272.JPG) #include <iom8v.h> #include <macros.h> 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<n;i++) { delay_ms(); } } void spaz(void) //响蜂鸣器 { PORTC|=(1<<5); delay_nms(50); PORTC&=~(1<<5); } unsigned long decode(void) //无线解码 { unsigned long DATA; //记录数据 unsigned char count,i; //暂时计数 /*一共接收三字节*/ DATA=0; // for (count=0;count<24;count++) //开始收集 { /*测量高电平宽度*/ i=0; //宽度计数 while (PINC&(1<<4)) //高位计数 { asm("nop"); // i++; //计数增加 if (i>192) goto end; //限时解码 } /*分辨出电平高低*/ DATA*=2; //数据左移 if (i<64) //分辨高低 { if (!((56>i)&(i>24))) goto end; //电平合法 DATA+=0; //记低电平 } else { if (!((168>i)&(i>72))) goto end; //电平合法 DATA+=1; //记高电平 } /*测量低电平宽度*/ while (!(PINC&(1<<4))) //低位计数 { asm("nop"); // i++; //计数增加 if (i>224) goto end; //限时解码 } /*低电平是否过窄*/ if (i<96) goto end; //对比宽度 } /*解码成功返结果*/ return DATA; //成功返回 /*有误码结束解码*/ end: return 0; //误码结束 } void main(void) { unsigned long DATA; // unsigned char D[3]; // signed char i; // DDRB =0B00000000; //定义输入 PORTB=0B11111111; //上拉使能 DDRC =0B11101111; //输入通道 PORTC=0B11011111; //上拉选择 DDRD =0B11111111; //定义输出 PORTD=0B00000000; //输出显示 while (1) { DATA =decode(); //解码程序 if (DATA>0) // { spaz(); //解码成功 for (i=2;i>=0;i--) //数据转换 { D=DATA; // DATA>>=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; //输出显示 } } } } |