⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 +

📁 PT2262编码芯片的软件解码
💻
字号:
/****************************************Copyright (c)**************************************************
**                               Guangzhou ZHIYUAN electronics Co.,LTD.
**                                     
**                                 http://www.embedtools.com
**
**--------------File Info-------------------------------------------------------------------------------
** File Name:           SoftDecode.c
** Last modified Date:  2008-07-18 
** Last Version:        v1.0
** Description:         PT2262芯片的软件解码
** 
**------------------------------------------------------------------------------------------------------
** Created By:          ChaiLiMing
** Created date:        2008-08-13 
** Version:             v1.0
** Descriptions:        PA0接受无线编码信号  
**		 		     
**
**------------------------------------------------------------------------------------------------------
** Modified by:        
** Modified date:
** Version:
** Description:
**
********************************************************************************************************/

/*  程序配置文件         */
#include  "config.h"

/*  定义按键  */
#define  KEY5             GPIO_PIN_5



/*   定义变量    */

uint8   gbRxData;                           /*  接受数据变量                     */
uint8   gbRxAddr;                           /*  接受地址变量                     */
uint8   gbRxDataBuf;                        /*  数据缓存,用来返回解码后的数据   */
uint8   gbRxAddrBuf;                        /*  地址缓存,用来返回解码后的地址   */
uint32  ulStart , ulStop;                   /*  测量低电平时的起始时间和结束时间 */  
uint32  ulInterval;                         /*  低电平时间                       */
uint8   acEnCode1[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; /* 8421编码数组  */ 
uint32  giRxBuf[MAX_RX];	            /* 缓冲脉冲宽度,接收一个完整的数据需要24+2个单元 */

/*******************************************************************************************
 **函数原形:void Go2JTAG(void)
 **功能描述:防止JTAG失效程序
 **参数说明:无
 **返回值:无
********************************************************************************************/

void GTAG_WAIT(void)
{
   SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);            /*  使能GPIO端口B模块            */
   GPIODirModeSet(GPIO_PORTB_BASE,KEY5,GPIO_DIR_MODE_IN);  /*  设置PB1为输入                */
   if(GPIOPinRead(GPIO_PORTB_BASE,KEY5)==0)                /*  读写PB1的电平状态            */
   {
     while(1);                                             /*  循环                         */
   }
}


/*************************************************************************************************
** 函数名称   GPIO_Init
** 函数功能  初始化GPIO口、端口方向、触发方式和中断使能。
** 输入参数  无。
** 输出参数  无。
**************************************************************************************************/
void GPIO_Init(void)
{
  SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);                    /*  使能GPIO PA口           */
  GPIODirModeSet(GPIO_PORTA_BASE, GPIO_PIN_0, GPIO_DIR_MODE_IN);  /*  设置PA0为输入           */
  GPIOIntTypeSet(GPIO_PORTA_BASE, GPIO_PIN_0, GPIO_RISING_EDGE);  /*  PA0上升沿触发           */
  GPIOPinIntEnable(GPIO_PORTA_BASE, GPIO_PIN_0);                  /*  使能PA0中断             */
  IntEnable(INT_GPIOA);                                           /*  使能PA口中断            */
  IntMasterEnable();                                              /*  使能处理器中断          */  
}



/***********************************************************************************************
 **函数原形:void GPIO_Port_A_ISR(void)
 **功能描述:测低电平时间,并进行解码
 **参数说明:gbRxAddr和gbRxData为解码后的地址和数据存储区
 **返回值:  无
************************************************************************************************/

void GPIO_Port_A_ISR(void)
{     
  GPIOPinIntClear(GPIO_PORTA_BASE,GPIO_PIN_0);          /*  清除中断标志,重要            */   
      uint8  fRxStart;                                  /*  同步码已接受标志             */         
      uint8  gbPtRx;                                    /*  缓存区指针                   */  
      uint8  bTemp;                                     /*  将解码后的位(0或1)存于bTemp  */
      uint8  gbRxPos;                                   /*  接受地址和数据位计数器       */
      fRxStart = 0;                              
      gbPtRx = 0;
      gbRxPos = 0; 
   while(1)
    { 
      SysTickPeriodSet(10000000UL);                       /*  设置SysTick计数器的周期值     */
      ulStart  =  SysTickValueGet();                      /*  读取SysTick当前值(初值)     */
      while(GPIOPinRead(GPIO_PORTA_BASE,GPIO_PIN_0) );    /*  PA0为高电平,则等待           */
      SysTickEnable();                                    /*  使能SysTick计数器             */
      while(GPIOPinRead(GPIO_PORTA_BASE,GPIO_PIN_0) == 0);/*  PA0为低电平等待,测低电平时间 */
      ulStop  =  SysTickValueGet();                       /*  读取SysTick当前值(终值)     */ 
      SysTickDisable();                                   /*  关闭SysTick计数器             */
      ulInterval  =  ulStart - ulStop;                    /*  计算时间间隔,即低电平宽度,只有
                                                           检测低电平宽度才能得到有效同步位 */
      
      if(ulInterval > PULSE_TIME_OUT){                    /*  超时 跳出循环                 */
         break;
      }   
      
      giRxBuf[0] = gbPtRx;
      giRxBuf[gbPtRx++] = ulInterval;                      /*  将低电平宽度存于缓存区中     */
      if(gbPtRx > MAX_RX)                                  
      gbPtRx = 1; 
      
     /* 检测低脉冲低电平时间, 用于检测同步位, 同步位长度大约为 2 ms */
      if((ulInterval>SYN_MIN)&&(ulInterval<SYN_MAX)){	  /* 寻找同步位                     */
	  fRxStart = 1;                                   /* 开始接受地址和数据标志置位      */
          giRxBuf[0]=1;                                                                          
	  giRxBuf[1]=ulInterval;                         
	  gbPtRx=2;                                       
          gbRxData = 0;
	  gbRxAddr = 0;
	  gbRxPos = 0;
	  }
      else if(fRxStart){                        /*   判断是否接受数据               */
		if(((ulInterval>SHORT_MIN)&&(ulInterval<SHORT_MAX))||((ulInterval>LONG_MIN)&&(ulInterval<LONG_MAX))){
		    if((gbPtRx%2) == 0){        /*  接收偶数位数据,奇数位已在giRxbuf缓存中 */
                         /*   两次检测到的低电平宽度如果都小于中界点,bTemp为1        */
                         if((giRxBuf[gbPtRx-1]<PULSE_WIDE)&&(ulInterval<PULSE_WIDE)){     
				bTemp = 1;                
			  }
                          /*   两次检测到的低电平宽度如果都大于中界点,bTemp为0        */
			 else if((giRxBuf[gbPtRx-1]>PULSE_WIDE)&&(ulInterval>PULSE_WIDE)){  
				bTemp = 0;
			  }
			 else{
			        fRxStart = 0;     /*  收到错误脉冲,退出中断,等待下次同步 */
			        break;
			  }
                                
			  if(gbRxPos < 8){       /*  gbRxPos小于8为地址信号             */
			        if(bTemp == 1)   /*  如果发送的相应地址为1,将1存于相应的gbRxAddr中 */
			        gbRxAddr+=acEnCode1[gbRxPos];
			  }
			  else{
				if(bTemp==1)     /*  将发送的数据位存于gbRxData中        */
				gbRxData+=acEnCode1[gbRxPos-8];
			  }
			  if(++gbRxPos>=12){     /*  gbRxPos>=12接受完成             */ 
				gbRxDataBuf = gbRxData; /*  返回解码后数据,根据数据值可执行不同代码 */
                                gbRxAddrBuf = gbRxAddr; /*  返回解码后地址,根据地址值可执行不同代码 */ 
                                gbRxPos=0;       /*  接受地址和数据计数器清零        */    
				fRxStart=0;      /*  重新开始同步                    */ 
                               // GPIOPinIntDisable(GPIO_PORTA_BASE, GPIO_PIN_0);  /*  禁止PA0中断           */
                                break;
                          }
                       }
	           }
			
	     else{
		    fRxStart=0;
		    break;	                         /*  收到错误脉冲,退出中断,等待下次同步 */
                 } 
          }
    }
                    
}

/***********************************************************************************************
 **函数原形:int  main(void)
 **功能描述:设置时钟,初始化GPIO口,等待中断
 **参数说明:无
 **返回值:  无
************************************************************************************************/
int  main(void)
{   
    GTAG_WAIT();                                          /*  防止GATG失效                 */

    SysCtlClockSet( SYSCTL_SYSDIV_20 | SYSCTL_USE_PLL | 
                    SYSCTL_OSC_MAIN | SYSCTL_XTAL_6MHZ );  /*  设置系统时钟,系统工作在10M   */ 
    
    GPIO_Init();                                           /* 初始化PA0口                   */
    while(1);
  
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -