void INT_timer0(void)
{//Timer0用于模拟串口收发,每139us中断一次
unsigned char i,j,bitStatu;
//unsigned char SimComOutputTemp;
TCNT0 = 0x7a;//0x75;// //reload counter value
PORTA = SimComOutputA;//发送
// PORTB = SimComOutputB;//发送
SimComBuf = PINC;//接收
++SimComTxSampleCycle;
if(SimComTxSampleCycle>=3)
{
SimComTxSampleCycle=0;
}
//------接受-------------------------
bitStatu=1;
for(j=0;j<dTotalChannel;j++)
{
//------SimCom RX-------
if(((bSimComTxing & bitStatu) == 0)
&& ((bSimComWaitCheck & bitStatu) == 0))
{
if((bSimComRxLoadBit & bitStatu) == 0)
{//检测开始位
if((bSimComRxDropEdge & bitStatu) == 0)//未检测到下降缘,继续检测
{
if((SimComBuf & bitStatu) == 0)//采样为底电平
{
SimComRxBitCount[j]=0;
bSimComRxDropEdge |= bitStatu;
SimComRxSampleCycle[j]=1;
SimComRxBit[j]=0xff;
}
}
else//已检测到下降缘,检查是否为引导位
{
SimComRxSampleCycle[j]++;
if(SimComRxSampleCycle[j]==2)
{
if((SimComBuf & bitStatu)==0)//采样为底电平
{
SimComRxBit[j]=0;
}
else
{
SimComRxBit[j]=0x80;
}
}
else if(SimComRxSampleCycle[j]>=3)//已采样3个周期--1位采样结束
{
if(SimComRxBit[j]==0)
{
bSimComRxLoadBit |= bitStatu;//==‘0’
}
bSimComRxDropEdge &= ~bitStatu;
SimComRxSampleCycle[j]=0;
SimComRxBitCount[j]=0;
}
}
}
else
{//数据位和停止位
//-----采样1位-----
SimComRxSampleCycle[j]++;
if(SimComRxSampleCycle[j]==1)
SimComRxBit[j]=0xff;
if(SimComRxSampleCycle[j]==2)
{
if((SimComBuf & bitStatu)==0)//采样为底电平
SimComRxBit[j] = 0;
else
SimComRxBit[j] = 0x80;
}
else if(SimComRxSampleCycle[j] >= 3)//每位采样3个周期
{
SimComRxSampleCycle[j] = 0;
//-----
++SimComRxBitCount[j];
if(SimComRxBitCount[j]<=8)
{
SimComRxSampleBuf[j] >>= 1;
SimComRxSampleBuf[j] |= SimComRxBit[j];
}
else
{
bSimComRxLoadBit &= ~bitStatu;
bSimComRxDropEdge &= ~bitStatu;
if(SimComRxBit[j]==0x80)
{//正确的停止位
SimComSBuf[j]=SimComRxSampleBuf[j];
bSimComByteWaitCheck |= bitStatu;
}
}
}
}
}
bitStatu <<= 1;
}
//------发送下一位 ------------------
if(SimComTxSampleCycle == 0)
{
SimComOutputA = 0xff;
if(bSimComTxing > 0)
{
SimComSendBitCount++;
if(SimComSendBitCount == 1)//引导位
{
SimComOutputA &= ~bSimComTxing;
SimComSendBuf = *ptSimComTxBuf;
}
else if(SimComSendBitCount < 10)//8个数据位
{
i=SimComSendBuf;
SimComSendBuf >>= 1;
if((i & 0x01) == 0)
SimComOutputA &= ~bSimComTxing;
}
else if(SimComSendBitCount == 10)//停止位
{
ptSimComTxBuf++;
}
else if(SimComSendBitCount >= 11)//休止位
{
SimComSendBitCount = 0;
if(SimComSendByteCount > 0)
{
SimComSendByteCount--;
}
if(SimComSendByteCount == 0)
{
_EnableSimCom1RX();
_EnableSimCom2RX();
_EnableSimCom3RX();
bSimComTxing = 0;
}
}
}
}
//SimComOutputA &=0x0f;
SEI();
}
此程序曾用于模拟8的串口,也用以产品中.稳定性及其高.
模拟串口接收、发送
我要赚赏金
