📄 hongwai.c
字号:
/******************************************************************
** 红外通讯程序
**-----------------------------------------------------------------
******************************************************************/
#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 + -