📄 hongwai.c
字号:
{ 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 + -