专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

单片机对PT2262的编码信号进行解码

作者:佚名   来源:本站原创   点击数:  更新时间:2009年09月19日   【字体:

/******************************************
******* 文件名:Decode.c
******* 描述:对PT2262的编码信号进行解码PT2262的输出信号经三极管反向后送入单片机的中断引脚
******* 代码:A0 -- A11 中的每bit用2bit表示:0码:00 ;1码:11
******* 版权:http://www.51hei.com/
******* 备注:PT2262输出数据的顺序:A0 A1 -- A10 A11+同步码+A0 A1 -- A10 A11+同步码,连续发四次
*******************************************/
#include<reg51.h> //51系列头文件
#include<intrins.h> //方便调用_nop_();做延时用;
unsigned char Receive[3] ;    //解码缓冲区:Receive[0]:A0 A1 A2 A3 ; Recdive[1]:A4 A5 A6 A7 ; Receive[2]: D3 D2 D1 D0
//Recdive[x]:xx xx xx xx 代表4bit
bit flag = 0 ;  //解码完成标志位
sbit RemPin = P3^2 ; //编码信号输入脚
/******************************************************
函数名:INT0_ISR( )
描  述: 外部中断0服务函数,实现对PT2262的解码
参  数:输入参数:无
输出参数:无
*******************************************************/
void INT0_ISR(void) interrupt 0 using 1
{
unsigned char i = 0 ;
unsigned char j = 0 ;
unsigned int temp = 0x0000;

//EA = 0 ;
TH0 = 0 ;
TL0 = 0 ;
while( !RemPin) ; //等待高电平的到来,检测同步头
TR0 = 1 ;   //启动定时器0,开始测量高电平的宽度
while( RemPin)
{
if( TF0 == 1 )
 {
 goto RemExit;  //定时器超时溢出则退出
 }
}

TR0 = 0 ;
temp = TH0 ;
temp = temp << 8 ;
temp = temp + TL0 ; //取得高电平的宽度

if( ( 0x36B0 < temp ) && ( temp < 0x4100) )  //检测到同步头
 {
  for( j = 0 ; j < 3 ; j ++) //循环3次
 {
   for( i = 0 ; i < 8; i ++ )
  {
  TH0 = 0 ;
  TL0 = 0 ;
  while( !RemPin);//等待高电平到来
     TR0 = 1 ;  //开启定时器0 ,测量高电平的宽度
  while( RemPin)
  {
   if( TF0 == 1 )
   {
   goto RemExit; //定时溢出则退出
   }
  }
        TR0 = 0 ;
     temp = TH0 ;
  temp = temp << 8 ;
  temp = temp + TL0 ;  //取得高电平的宽度
        
  if( ( 1000 < temp ) && (temp< 1800 ) ) //判断得窄脉冲:1表示
  {
  Receive[j] = Receive[j] << 1 ;
  Receive[j] = Receive[j] + 0x01 ;
  }
  else if( ( 300 < temp) && (temp< 700) )//判断得宽脉冲:0表示
  {
  Receive[j] = Receive[j] << 1 ;
  }
  else
   return;   
                  
  }
  }
  flag = 1 ;      //表示已解码完毕
   return;
    }
        else
 {
 goto RemExit;
 }
RemExit:
{
TR0 = 0 ;
//TR1=1;
EA = 1 ;
TF0 = 0 ;
RemPin = 1 ;
return;
}  
}
 

关闭窗口