我看过很多PT2262软件解码程序,都是用定时器测量脉冲宽度。占用系统太多资源。我自己编写的程序不用定时器,不用中断,代码最少。发射端为PT22623.3M的电阻接收端为M8内部1MRC振荡。解码成功后输出D口显示。编译软件为ICCAVR。
(原文件名:2272.JPG)
#include<iom8v.h>
#include<macros.h>
voiddelay_ms(void)//毫秒延时
{
unsignedinti;
for(i=0;i<140;i++)
{
}
}
voiddelay_nms(unsignedintn)//延时周期
{
unsignedinti;
for(i=0;i<n;i++)
{
delay_ms();
}
}
voidspaz(void)//响蜂鸣器
{
PORTC|=(1<<5);
delay_nms(50);
PORTC&=~(1<<5);
}
unsignedlongdecode(void)//无线解码
{
unsignedlongDATA;//记录数据
unsignedcharcount,i;//暂时计数
/*一共接收三字节*/
DATA=0;//
for(count=0;count<24;count++)//开始收集
{
/*测量高电平宽度*/
i=0;//宽度计数
while(PINC&(1<<4))//高位计数
{
asm("nop");//
i++;//计数增加
if(i>192)gotoend;//限时解码
}
/*分辨出电平高低*/
DATA*=2;//数据左移
if(i<64)//分辨高低
{
if(!((56>i)&(i>24)))gotoend;//电平合法
DATA+=0;//记低电平
}
else
{
if(!((168>i)&(i>72)))gotoend;//电平合法
DATA+=1;//记高电平
}
/*测量低电平宽度*/
while(!(PINC&(1<<4)))//低位计数
{
asm("nop");//
i++;//计数增加
if(i>224)gotoend;//限时解码
}
/*低电平是否过窄*/
if(i<96)gotoend;//对比宽度
}
/*解码成功返结果*/
returnDATA;//成功返回
/*有误码结束解码*/
end:
return0;//误码结束
}
voidmain(void)
{
unsignedlongDATA;//
unsignedcharD[3];//
signedchari;//
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[i]=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[i];//输出显示
}
}
}
}