编码芯片PT2262宣布的编码由:地址码、数据码、同步码组成。地址码和数据码都用宽度不同的脉冲来表明,两个窄脉冲表明“0”;两个宽脉冲表明“1”;一个窄脉冲和一个宽脉冲表明“F”,也便是地址码的“悬空”;同步码为时刻较长的低电平距离,下图为PT2262编码图:
从图中能够看出,发送码的周期是持平的,仅仅脉冲宽度不同(宽脉冲与窄脉冲之比为3:1)。而同步码的低电平时刻约为这个周期的8倍.
解码的关键是辨认同步码,然后对后边的字码的脉冲宽度进行辨认,就能够解出这个编码。pt2262每次发射时至少发射4组字码,每组字码由25个脉冲组成,前24个脉冲为地址和数据,最终一个脉冲和一低电平距离组成同步码。下面咱们来说说如何用51单片机对其进行解码。由于程序结构不杂乱,就不再画流程图,首要咱们让Timer0作业在守时状况,初始化值使其能在同步码未结束时溢出,使用Timer0的溢出中止来初始化,预备接纳后来数据,一起将Timer0设为门控守时,也便是TMOD的GATE0位为1,此形式下,只要TR0=1而且INT0=1才计数,此形式能够用来丈量脉冲宽度.这样就辨认出了同步码.数据由INT0输入,INT0设为跳变触发,每中止一次就取TH0和TL0之和,这个和便是前一个的脉冲宽度.判别出是宽脉冲仍是窄脉冲.由于上述的同步码周期与地址数据周期都远小于守时器0的守时时刻,地点守时器0正常作业时,是不会溢出的.以下为程序,程序的功用是别离解出地址码与按键码(也便是数据码),然后用串口输出.解码时宽脉冲为1,窄脉冲为0.低位放到接纳码的最高位,也便是解码成果与原数据位颠倒了.至于想要什么成果,能够做相应的处理,当然包含变换成地址的三进制格局.由于宽脉冲的脉宽与低脉冲的脉宽相差很大,所以解码很简单,下面为振动电阻为1M时的程序,相同可用来解码振动电阻为1.2M的编码.振动电阻决议脉冲的宽度,能够修正程序来习惯不同的震动电阻,下面是c程序代码:
//测验条件:单片机为AT89S51,晶振12M,振动电阻1MΩ
#include< AT89X51.h>
#include< stdio.h>
unsigned int addr,key;
unsigned char cntint;//外部中止0计数
void eint0(void) interrupt 0//外部中止0
{
static unsigned int tempaddr;//接纳地址缓存
static unsigned int tempkey;//接纳数据缓存
unsigned int timecnt;
timecnt=TH0*256+TL0;
TH0=0;
TL0=0;
if(cntint<16)//接纳地址码
{
tempaddr=tempaddr<<1;//将接纳的到最低位移到最高位
if(timecnt>210)//210为宽脉冲与低脉冲界限,当振动电阻为1M时,窄脉冲为110uS,宽脉冲为320uS
{
tempaddr|=1;//宽脉冲为1
}
cntint++;//中止次数加1
}
else if(cntint<24)//接纳数据码
{
tempkey=tempkey<<1;
if(timecnt>120)
{
tempkey|=1;
}
cntint++;
}
else//cntint大于24也便是中止了25次时,封闭外部中止0,等候同步码
{
TMOD&=0xf0;//设守时器0为守时方法
TMOD|=0x01;
TH0=0xf9;
TL0=0x66;
cntint=0;
EX0=0;//关外部中止0
addr=tempaddr;
key=tempkey;
tempaddr=0;
tempkey=0;
}
}
void timer0(void) interrupt 1//守时器0中止,只要初始化时,空闲时和同步码到来时才中止
{
TMOD&=0xf0;//将守时器0的作业方法设为门控守时,用以检测脉宽。
TMOD|=0x09;
cntint=0;//外部中止0中止次数设为0
TH0=0;//设守时器0守时初值为0
TL0=0;
EX0=1;//答应外部中止0
IE0=0;//铲除外部中止0标志
}
void main(void)
{
void sendd(unsigned int intnum);
unsigned int i;
TMOD=0x21;//设定守时器0和守时器1,守时器1用来驱动串口
TH0=0xf9;//设定守时器的初始值,这个值必小于同步码
TL0=0x66;
TH1=243;//12M晶振时,串口波特率为2400
TL1=243;
SCON=0x50;//设定串口作业方法
TI=1;//要用printf就将其设为1
EA=1;//开一切中止
ET0=1;//开守时器0中止
EX0=0;//关外部中止0,在Timer0中止里边将其翻开
IT0=1;//外部中止0设为跳变触发
TR0=1;//守时器0发动
TR1=1;//守时器1发动
while(1)
{
printf(“%u”,addr);//输出解码地址
printf(“%u”,key);//输出解码数据
for(i=0;i<3000;i++);//这个用来避免串口不同步
}
}
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/xinnengyuan/261089.html