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

📄 hongwai.c

📁 在一个红外通道上兼容与掌上电脑进行红外通讯和接收红外遥控器码的C源程序
💻 C
📖 第 1 页 / 共 2 页
字号:
      { TOneBit();              //定时器定义时间间隔为 0.833ms (1200bps)                                                                                                                                                                                                            
        OddBit_HW=0;            //初始化奇偶校验位                                                                                                                                                                                                                          
      }                                                                                                                                                                                                                                                                    
      else                                                                                                                                                                                                                         
      { Re_ReStartBit(); }      //开始位错误,从新开始接收开始位
    }                                                                                                                                                                                                                                                                          
    else if(Para_HW.BitNo<=9)   // 接收数据位 D0~D7                                                                                                                                                                                                         
    { Para_HW.Temp>>=1;                                                                                                                                                                                                                                    
      if (HWIn==high)                                                                                                                                                                                                                                                  
      { Para_HW.Temp+=0x80; OddBit_HW^=1;}                                                                                                                                                                                                                   
    }                                                                                                                                                                                                                                                                  
    else                                                                                                                                                                                                                                                                  
    if(Para_HW.BitNo==10)      //接收校验位                                                                                                                                                                                                   
    { if(HWIn!=OddBit_HW)      //如果校验位不对,从新开始接收开始位                                                                                                                                                                                                                                                              
      { Re_ReStartBit();Para_HW.ByteNo_In=0;} 
    }                                                                                                                                                                                                                                                           
    else  if(Para_HW.BitNo==11)                    // 接收停止位                                                                                                                                                                                                          
    { if(HWIn==high)          // 停止位为高,接收一个通讯字节接收                                                                                                                                                                                                                                   
      { Re_ReStartBit();             
        HWINF=1;              
        Para_HW.RxData=Para_HW.Temp; 
      }
      else                    // 停止位为低,则表示接收到的不是一个通讯字节
      { if(Para_HW.Temp==0x00) //之前接收到的字节为0x00,符合红外遥控的引导码
        { 
          T4500us();
        }   
        else
        { Re_ReStartBit(); Para_HW.ByteNo_In=0; }     //接收错误,从新开始接收字节的起始位                                                                                                                                                                                
      }                                                                                                                                                                                                                
    }   
    else
    {if(HWIn==high)
    	{ YKStation_HW=1;
        Para_HW.YKNo=0;        //开始遥控码的剩余部分的接收
        Para_HW.ByteNo_In=0;
        T_Over();
        PPR1=0;PIF1=0;PMK1=0;         //允许外部中断,但是中断优先级为低
    	}
    	else
    	{ Re_ReStartBit(); } //从新开始接收字节的起始位
    }            
  }
  else
  if((EnableIn_HW==true)&&(EnableOut_HW==false)&&(YKStation_HW==true)) //接收遥控码
  { Re_ReStartBit(); 
  	YKStation_HW=0;
  }                                                                                                                                                                                                                                        
  else
  if ((EnableIn_HW==false)&&(EnableOut_HW==true))               //向掌上电脑发送通讯数据
  { Para_HW.BitNo++;     //发送数据的位的序号
   	if(Para_HW.BitNo<=8)                //发送D0~D7
   	{ if(Para_HW.Temp&0x01)
   		{ OddBit_HW^=1; NotSquareOut(); } // 发送 1
   		else
   		{ SquareOut(); }                  // 发送 0
   		Para_HW.Temp>>=1;                 // 为发送下一位做准备
   	}
   	else if(Para_HW.BitNo==9)           //发送校验位
   	{ if(OddBit_HW)
   		{NotSquareOut();}                 // 发送 1
   		else
   		{ SquareOut(); }                  // 发送 0
   	}
   	else if(Para_HW.BitNo==10)          //发送停止位
   	{ NotSquareOut(); T4500us(); }
   	else
   	{ EnableIn_HW=false;EnableOut_HW=false;
   		MaskTimerInt=1;HWOUTF=1;          //不允许定时器中断
   	}
  }
  else
  {
  	Re_ReStartBit();
    Para_HW.Long_In=20;
  }	
}
/******************************************************************************
//  功能:     红外通讯接收一帧字节 到接收缓冲区ComDataIn_HW[i];
//             接收完一个命令帧以后再将数据写到处理和发送缓冲区ComData_HW[i]
//  输入参数 :无
//  外部变量 :Para_HW (struct)--红外通讯控制结构体  
//             HWINF(bit)--一个字节接收完毕
//             ComDataIn_HW(arry)--接收缓冲区
//             ComData_HW(arry)-- 处理和发送缓冲区
//  返回:无
*******************************************************************************/ 
void HW_ReceiveByte(void)  
{ uchar i;
	HWINF=0;                 
  Para_HW.Between_2Byte=20; 
	if(Para_HW.ByteNo_In>=61)         //接收字节不能超过62个               
	{ Para_HW.ByteNo_In=0; }
  ComDataIn_HW[Para_HW.ByteNo_In]=Para_HW.RxData;  //把数据写入缓冲区
  Para_HW.ByteNo_In++;
  
  switch(Para_HW.ByteNo_In)         //判断接收到的数据符号不符号规约
  { case 1:
      if(Para_HW.RxData!=0x68)
      { Para_HW.ByteNo_In=0; }  
  	  else
  	  { Para_HW.Sum=0x00; }
  	  break;
  	case 8:
  	  if(Para_HW.RxData!=0x68)
  	  { Para_HW.ByteNo_In=0; }  	
  	  break;
  	case 10:
  	  Para_HW.Long_In=Para_HW.RxData+12;
  	  break;
  	default:
  	  if(Para_HW.ByteNo_In==(Para_HW.Long_In-1))
  	  { if(Para_HW.RxData!=Para_HW.Sum)
  	  	{ Para_HW.ByteNo_In=0;Para_HW.Long_In=20;}
  	  }     
  	  else if(Para_HW.ByteNo_In>=Para_HW.Long_In)
  	  { if(Para_HW.RxData==0x16)
  	  	{ Para_HW.Delay=10; 
  	  		for(i=0;i<Para_HW.ByteNo_In;i++)
  	  		{ ComData_HW[i]=ComDataIn_HW[i]; }
  	  	}
  	  	Para_HW.ByteNo_In=0;Para_HW.Long_In=20;
  	  }
  }	
  Para_HW.Sum+=Para_HW.RxData;      //计算校验和
  
}  
/******************************************************************************
//  功能:     红外通讯发送一帧的数据
//  输入参数 :无
//  外部变量 :Para_HW (struct)--红外通讯控制结构体  
//             HWOUTF(bit)--一个字节发送完毕
//             ComData_HW(arry)-- 处理和发送缓冲区
//  返回:无
*******************************************************************************/ 	
void HW_SendByte(void) 	
{ HWOUTF=0;  	
 	Para_HW.ByteNo_Out++;  
 	if(Para_HW.ByteNo_Out<Para_HW.Long_Out)
 	{ SquareOut();          //发送出调制方波,发送开始位
 		TOneBit();   
 		HWTimingInt();         		
 		EnableIn_HW=false;
 		EnableOut_HW=true; 
 		Para_HW.BitNo=0;
 		OddBit_HW=0; 
 		if(Para_HW.ByteNo_Out==(Para_HW.Long_Out-2))     //发送校验和
 		{ Para_HW.Temp=Para_HW.Sum; }
 		else if(Para_HW.ByteNo_Out==(Para_HW.Long_Out-1))//发送结束码
 		{ Para_HW.Temp=0x16; }
 		else
 		{ Para_HW.Temp=ComData_HW[Para_HW.ByteNo_Out];Para_HW.Sum+=Para_HW.Temp;} //发送其他数据
 	}
 	else
 	{ Para_HW.ByteNo_Out=0;Re_ReStartBit();Para_HW.Long_In=20;}  //发送完毕
}

⌨️ 快捷键说明

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