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

📄 hongwai.c

📁 在一个红外通道上兼容与掌上电脑进行红外通讯和接收红外遥控器码的C源程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/******************************************************************
**   红外通讯程序
**-----------------------------------------------------------------
******************************************************************/                                                       
           
#pragma   interrupt INTP1 HW_StartIn RB1   
#pragma   interrupt INTTM001 HW_Timing  RB1  // use for HONGWAI            

//用于使用 TM01 为定时控制器来模拟红外通讯                          
#define t0stop      0B00000000;       // stop timer0                                                       
#define t0on        0B00001100;       // on timer0  
#define THalfBit();    TMC01=t0stop; PRM01=0x01; CR001=0x0100; CRC01=0x00;TMC01=t0on;// half bit 1200bps =0.417ms ;change 0x0823 to 0x061a         
#define TOneBit();     TMC01=t0stop; PRM01=0x01; CR001=0x0208; CRC01=0x00;TMC01=t0on;   // one bit of 1200bps =0.833ms            
#define T4500us();     TMC01=t0stop; PRM01=0x01; CR001=0x0946; CRC01=0x00;TMC01=t0on;   // timing for 4.5ms //4e00
#define T_Over();      TMC01=t0stop; PRM01=0x01; CR001=0x0800; CRC01=0x00;TMC01=t0on;
#define MaskTimerInt   TMMK001
#define ClrHWInIF();   TMIF001=0;
#define HWTimingInt(); TMPR001=0;TMIF001=0;TMMK001=0;              //开红外定时的中断
#define Init_HWIn_En();  PIF1=0;PMK1=0;EGP=0x00;EGN=0x02;PPR1=0;   //对红外接收口接收开始位进行初始化
#define Init_HWIn_Dis(); PIF1=0;PMK1=1;EGP=0x00;EGN=0x02;PPR1=0;   //对红外接收口接收开始位进行初始化
#define DisHWInInt();    PMK1=1;                                      //不允许红外接收口接收数据
#define Re_ReStartBit(); PPR1=0; PIF1=0;PMK1=0; MaskTimerInt=1;  //从新开始接收起始位 ,允许外部中断,关闭定时中断

#define Init_HWOut();    TMC51=0x00;P3.3=low;PM3.3=output;TCL51=0x02;TMC51=0x46; CR51=0xC0; TCE51=1;//初始化红外发送口

#define   NotSquareOut(); TOE51=0;P3.3=0;                         //停止发出调制方波
#define   SquareOut();    TOE51=1;                                //发出调制方波
#define   HWIn     P3.0
#define   HWOut    P3.3   
                           
#include "hvr_meter.h"   

struct  hw_fm 
{
	uchar  BitNo;      //use to say which bit was receive
	uchar  ByteNo_In;  
	uchar  ByteNo_Out;
	uchar  Long_In;
	uchar  Long_Out;
	uchar  Sum;
	uchar  Between_2Byte;
	uchar  Temp;
	uchar  RxData;
	uchar  Delay;
	uchar  Answer_Enable;
	uchar  YKData1;
	uchar  YKData2;
	uchar  YKNo;	
	uint16  BitLong;
} Para_HW;

/******************************************************************************
//  功能:初始化红外接收口的接收中断
//  参数:无
//  外部变量 :无
//  返回:无
*******************************************************************************/
void HW_Init(void)
{ Init_HWIn_En();	
  TMPR001=0;
  PM3.0=input;
  Para_HW.ByteNo_In=0;
  Para_HW.Long_In=20;   //初始化接收字节为20个字节
  Init_HWOut();
}
/******************************************************************************
//  功能:用红外通道发送一帧数据的起始 , 发送第一个字节的开始位并且触发定时器
//  参数:无
//  外部变量 :Para_HW (struct)--红外通讯控制结构体  
//             OddBit_HW(bit)--奇偶校验位
//             EnableIn_HW(bit) EnableOut_HW(bit)--控制红外方向
//             ComData_HW(array)--红外处理和发送缓冲区。
//  返回:无
*******************************************************************************/
void  HW_SendFirstByte(void)                                          
{                                      
	if(Para_HW.Long_Out==0)      
	return;           
   Para_HW.Temp=ComData_HW[0];  //输出第一个字节
   Para_HW.Sum=Para_HW.Temp;    //开始计算发送字节的校验和
   TOneBit();
   HWTimingInt();
   Init_HWOut();    //初始化调制波的输出
   SquareOut();     //输出方波
   DisHWInInt();    //不允许红外中断的输入
   OddBit_HW=0;  
   Para_HW.BitNo=0;                                          
   EnableIn_HW=false;                                              
   EnableOut_HW=true;  
}  
       
/******************************************************************************
//  功能:用红外通道接收一帧数据的起始 , 发送第一个字节的开始位并且触发定时器
//  参数:无
//  外部变量 :Para_HW (struct)--红外通讯控制结构体  
//             OddBit_HW(bit)--奇偶校验位
//             EnableIn_HW(bit) EnableOut_HW(bit)--控制红外方向
//  返回:无
*******************************************************************************/
void   HW_StartIn(void)                                                                                                                                                                                                                                   
{ DI();          
	if( YKStation_HW == false )  //接收 数据或遥控码的最前面一位
	{ Init_HWIn_Dis();                                                                                                                                                                                                                           
    THalfBit();
    HWTimingInt();
    
    EnableIn_HW=true;    
    EnableOut_HW=false;   
    YKStation_HW=false;              
    Para_HW.BitNo=0;  
	}
	else           //接收遥控码
	{ Para_HW.YKNo++;
		Para_HW.BitLong = TM01;
		T_Over();
  	if( Para_HW.YKNo<=17 )
  	{ NOP(); }
  	else if(Para_HW.YKNo<=25) //接收正码
  	{ Para_HW.YKData1>>=1;
  		if( Para_HW.BitLong>=0x411 )
  		Para_HW.YKData1+=0x80;
  	}
  	else if(Para_HW.YKNo<=32) //接收反码    
  	{ Para_HW.YKData2>>=1;
  		if( Para_HW.BitLong>=0x411 )
  		Para_HW.YKData2+=0x80;  
  	}
  	else if(Para_HW.YKNo==33) //接收最后一个反码
  	{ Para_HW.YKData2>>=1;
  		if( Para_HW.BitLong>=0x411 )
  		Para_HW.YKData2+=0x80; 
  		if( Para_HW.YKData1==~Para_HW.YKData2 )
  		YKDisp_HW=1;  		
  		Re_ReStartBit();
  		YKStation_HW = false;
  	}  	
	}
                                                                                                                                                                                  
  EI();                                                                                                                                                                                                                                                                     
}                 
 
/******************************************************************************
//  功能:响应定时器的中断。  用于按位接收和发送通讯的数据  与及 接收红外遥控码
//  输入参数 :无
//  外部变量 :Para_HW (struct)--红外通讯控制结构体  
//             OddBit_HW(bit)--奇偶校验位
//             EnableIn_HW(bit) EnableOut_HW(bit)--控制红外方向
//             YKStation_HW(bit)--遥控接收状态标志
//             YKDisp_HW(bit)--遥控码接收结束 
//             HWINF,HWOUTF(bit)--红外通讯接收、发送一个字节结束
//  返回:无
*******************************************************************************/
                                                                                                                                                                                                                                                            
void   HW_Timing(void)                                                                                                                                                                                                                                                             
{ ClrHWInIF(); 
	if((EnableIn_HW==true)&&(EnableOut_HW==false)&&(YKStation_HW==false))  //接收掌上电脑发送出来的数据
  { Para_HW.BitNo++;     //位的序列加一
    if( Para_HW.BitNo==1 )      //接收到开始位                                                                                                                                                                                                                          
    { if(HWIn==low)             //开始位正确                                                                                                                                                                                                                                         

⌨️ 快捷键说明

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