用PIC对PT2262进行三态解码(6561个地址),地址码设置方便。
通常的单片机软件解码地址码为0或1,没有悬空(高阻)状态,地址只有256个,解码原理:使用PIC单片机的电平变化中断功能来捕捉功能判断脉冲宽度,
三态地址共6561个地址设置;
特点: 解码稳定可靠,抗干扰强。 已经删除 为什么删除? //************************PT2262三态解码程序****************************//
//////////////////////////////////////////////////////////////////////////
// //
//同步头引导低电平4mS~5mS;即震荡电阻为150K; //
//三态地址共6561个地址设置; //
//通常的单片机软件解码地址码为0或1,没有悬空(高阻)状态,地址只有256个;//
//解码原理:使用PIC单片机的电平变化中断功能来捕捉功能判断脉冲宽度; //
//特点:解码稳定可靠,抗干扰强。 //
//作者: cqgxh@163.com 2009-7-10 于重庆 //
// //
//////////////////////////////////////////////////////////////////////////
/**************************************************************************************
16F690
__ __
+5V VDD||_||VSS GND (地 )
osc20M OSC1| |AN0
osc20M OSC2| |AN1
RA3/MCLR| |AN2 IR (遥控)
PORTC5| |PORTC0
PORTC4| |PORTC1
PORTC3| |PORTC2
PORTC6| |RB4
PORTC7| |RB5/RX
RB7/TX|_______|RB6
2009-7-10 10:05:55 CQGXH@163.COM
***************************************************************************************/
#include <pic.h>
#include <stdio.h>
__CONFIG(HS&UNPROTECT&PWRTEN&BORDIS&WDTDIS);
#define IR RA2 //定义遥控信号输入端
#define uchar unsigned char //缩写
#define uint unsigned int //缩写
bank2 bitlock;
bank2ucharOUT;
bank2uint add_set;
bank2uchari,k,j,t2data;
bank2ucharirdata;
bank2uint iradd;
bank2uchara;
const uchar add_Tab={2,2,2,2,2,2,2,2} ; //设置地址码;0==低电平;1==高电平;2==悬空(高阻);
//共计6561个地址状态
//
//函数声明
void cos_js();
void add_3();
void interrupt IRQ(void); //中断处理
main(void)
{
TRISA0=0;
TRISA2=1;
ANSEL=0x00; //关闭模拟量输入
ANSELH=0x00;
RABPU=0x00; //全局上拉使能
WPUA=0x04; //RA2上拉
//Timer0初始化设置
PSA=0; //Timer0 使用预分频器
PS0=0;PS1=1;PS2=1; //Timer0选择分频率为1:128
T0CS=0; //外部时钟定时方式
IOCA2=1; //开启RA2电平中断
RABIE=1; //开启RAB口电平变化中断
PEIE =1; //PEIE:外设中断允许位1 = 允许所有未屏蔽的外设中断 0 = 禁止所有的外设中断
GIE =1; //GIE:全局中断允许位 1 = 允许所有未屏蔽的中断 0 = 禁止所有中断
add_3(); //计算设置的地址码
while(1) //循环等待中断
{
NOP();
;
}
}
//解码地址3进制计算
void add_3()
{
uchar i;
for(i=0;i<8;i++)
{
add_set=add_set*3+add_Tab;
}
}
void interrupt IRQ(void) //中断函数
{
if(RABIF&&RABIE&&IOCA2) //RA2电平变化中断解码PT2262;
{
// RABIF=0;
t2data=TMR0;
TMR0=0X00;
if((lock==0)&&IR)
{
if(t2data>0x9f) //0x9f大于4.08mS;实际同步头低电平脉宽4280uS ( 25.6uS*0xa7) ;3.2mS(0x7D)
{
if(t2data<0xc5)//0xaf小于4.48mS;0xc5=5043US
{
j=0;
k=0;
lock=1;
}
}
}
if(lock&&(IR==0))
{
if(t2data<0x09) //窄脉冲识别
//0x6小于153.6uS ;实际脉宽135uS~144US
{
if(t2data>0x02) //0x4大于102.4uS
{
a=0;
j++;
}
else j=0;
}
if(t2data>0x0d) //宽脉冲识别
//0x0f大于384uS ;实际脉宽405uS 或0x11=432US
{
if(t2data<0x18) //0x12小于460.8uS;0x14=512uS;
{
a=1;j++;
}
else j=0;
}
if(j==24) //数据接收完毕,进行译码处理
{
lock=0;
j=0;
for(i=0;i<24;i+=2)
{
if((a==0)&(a==0)){a=0;j++;} //两个都是窄脉冲为0
else if(a&a){a=1;j++;} //前窄后宽为1
else if((a==0)&a){a=2;j++;} //前宽后窄为2
else break;
}
for(iradd=0,i=0;i<8;i++)
{
iradd=iradd*3+a;
}
for(irdata=0,i=8;i<12;i++)
{
irdata=(irdata<<1)+a;
}
if(iradd==add_set)
{
OUT=irdata;
}
else if(iradd==0)
{
OUT=irdata^0x0f;
}
else OUT=0;
}
}
RABIF=0; //清中断标志,过早清除易产生错误
} //电平变化中断处理结束
} 正是我需要的,收下了。谢谢!打算移植到类似PIC10F222的小体积芯片上。解码器的整体体积就可以做的很小。 请问你在电平变化中断中,为什么要用t2data=TMR0;
这一句勒?还有为什么程序一开始就调用
void add_3()
{
uchar i;
for(i=0;i<8;i++)
{
add_set=add_set*3+add_Tab;
}
} t2data=TMR0
脉冲宽度记录用的TMR0;
void add_3()
{
uchar i;
for(i=0;i<8;i++)
{
add_set=add_set*3+add_Tab;
}
}
是设置的地址码三进制计算,对应PT2262的设置;
可以修改以下地址码表对应PT2262的设置
const uchar add_Tab={2,2,2,2,2,2,2,2} ; //设置地址码;0==低电平;1==高电平;2==悬空(高阻);
//共计6561个地址状态
// 谢谢 顶 好吔 好吔 记号 更正你的注释:
for(i=0;i<24;i+=2)
{
if((a==0)&(a==0)){a=0;j++;} //两个都是窄脉冲为0
else if(a&a){a=1;j++;} //两个都是宽为1
else if((a==0)&a){a=2;j++;} //前窄后宽为2
else break;
} 标记备用! 标记 mark 谢谢,正需要这个! mark 谢谢,正在学习2262解码 这个可以有 用的 是哪款单片机呢 标记,备用 不错不错,学习了。
页:
[1]