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

📄 st3lib10.c

📁 SPWM三相波形发生器
💻 C
📖 第 1 页 / 共 5 页
字号:
	uchar   i, j, cc, dd;
	uint    OverTime, OverTime2;
	ulong   HangupTimes;

	i = _ModemReset();
	if( i != (DEF_MODEM_RESET | DEF_MODEM_STATUS_OK) )
		return  i;

/*
	if( strcmp(PUB_TelNo, pTelNo) == 0 )
	{
		OverTime = 400;
	  	while ( 1 ) 
		{
			HangupTimes = _GetTickCount() - PUB_Hang_Timer;
			if( HangupTimes > (ulong)OverTime)
				break;
 			_Delay(100);
		}
	}
	else
	{
		strcpy(PUB_TelNo, pTelNo);
	}
*/
	XBYTE[DEF_MODEM_DR];
	_SelAddrMain();
	PUB_HIGH_Card = (PUB_HIGH_Card | 0x10);
	XBYTE[DEF_HIGH_Card] = PUB_HIGH_Card;
	_SelAddrModem();
	XBYTE[DEF_MODEM_CR0] = 0x05;
    XBYTE[DEF_MODEM_CR1] = 0x30;
    XBYTE[DEF_MODEM_TR]  = 0x00;

	i = j = 0;
	while ( i < 0xFF )
	{
	    _Delay(10);
	    cc = XBYTE[DEF_MODEM_DR];
		if ( cc & 0x02 )
		{
			j++;
 			if ( j >= 50 )	break;
		}
		else
			j = 0;
		i++;
	}
	if ( i == 0xFF )
	{
		_ModemHangUp();
		return DEF_MODEM_DIAL | DEF_MODEM_STATUS_NOLINE;
	}

	for (i=0; i<10; i++)
	{
	    cc = XBYTE[DEF_MODEM_DR];
		if ( (cc & 0x02) == 0 )
		{
			_ModemHangUp();
			return DEF_MODEM_DIAL | DEF_MODEM_STATUS_BUSY;
		}
		_Delay(100);
	}

		_SelAddrMain();
		PUB_HIGH_Card_Rest = PUB_HIGH_Card_Rest | 0x40;
		XBYTE[DEF_HIGH_Card_Rest] = PUB_HIGH_Card_Rest;
		_SelAddrModem();

	dd = strlen(pTelNo);
 	for (i=0; i<dd; i++)
	{
		j = pTelNo[i];
		if ( (j<'0') || (j >'9') )
			_Delay(1000);
		else
		{
			cc = j & 0x0F;
			if ( cc == 0x00 ) 
				cc = 0x0A;
			XBYTE[DEF_MODEM_TR] = 0x10 | cc;
			XBYTE[DEF_MODEM_CR0] = 0x07;
            _Delay(100);
			XBYTE[DEF_MODEM_CR0] = 0x05;
            _Delay(50);
		}		 
	}
	_SelAddrMain();
	PUB_HIGH_Card_Rest = (PUB_HIGH_Card_Rest & (~0x40));
	XBYTE[DEF_HIGH_Card_Rest] = PUB_HIGH_Card_Rest;
	_SelAddrModem();
	XBYTE[DEF_MODEM_CR0] = 0x05;
	XBYTE[DEF_MODEM_CR1] = 0x30;
    XBYTE[DEF_MODEM_TR] =  0x80;
	OverTime2 = i = j = 0;	OverTime = 15000;
	while (1)
	{
		_Delay(1);
	    cc = XBYTE[DEF_MODEM_DR];
		if ( cc & 0x02 )
			OverTime2++;
		else
		{
			if ( (OverTime2>150) && (OverTime2<8000) )
			{
				j++;
 				if ( j > 4 )
				{
					_ModemHangUp();
					return DEF_MODEM_DIAL | DEF_MODEM_STATUS_BUSY;
				}
			}
			OverTime2 = 0;
		}
		if ( (cc&0x08) && (cc&0x10) )
		{
			i++;
 			if ( i >= 15 )	break;
		}
 		else
			i = 0;

		if ( _KeyBoardTest() )
			if (_KeyBoardGet() == 0x1B)
			{
				_ModemHangUp();
				return  DEF_MODEM_DIAL | DEF_MODEM_STATUS_USERCANCEL;
			}
		_SelAddrModem();

		OverTime--;
 		if ( OverTime == 13000 )
		{
			_SelAddrMain();
			PUB_HIGH_Card_Rest = PUB_HIGH_Card_Rest | 0x40;
			XBYTE[DEF_HIGH_Card_Rest] = PUB_HIGH_Card_Rest;
			_SelAddrModem();
		}
 		if ( OverTime == 0 )
		{
			_ModemHangUp();
			return DEF_MODEM_DIAL | DEF_MODEM_STATUS_NOANSWER;
		}
	}

	_SelAddrMain();
	PUB_HIGH_Card_Rest = (PUB_HIGH_Card_Rest & (~0x40));
	XBYTE[DEF_HIGH_Card_Rest] = PUB_HIGH_Card_Rest;
	_SelAddrModem();
	XBYTE[DEF_MODEM_CR1] = 0xA0;
	XBYTE[DEF_MODEM_CR0] = 0x07;
	OverTime = 3000;
	while (1)
	{
	    cc = XBYTE[DEF_MODEM_DR];
		if ( (cc&0x08) && (cc&0x20) )
		{
			XBYTE[DEF_MODEM_TR] = 0x00;
			break;
	    }
	    else
		{
			_Delay(1);	OverTime--;
			if ( OverTime == 0 )
			{
				_ModemHangUp();
				return DEF_MODEM_DIAL | DEF_MODEM_STATUS_NOCARRY;
			}
		}
	}
	DEF_MODEM_TXD = 0x01;
	XBYTE[DEF_MODEM_CR1] = 0x20;
	return DEF_MODEM_DIAL | DEF_MODEM_STATUS_OK;
}

uchar	_ModemHeadTail(uchar ht)
{
	bit    rTXCLK = 1;
	uchar  Tcounter = 0;
	uchar  NoCarryCount = 0;

	_SelAddrModem();
	while ( 1 )
	{
		if ( (XBYTE[DEF_MODEM_DR] & 0x08) == 0 )
		{
			if ( (++NoCarryCount) > 20 )
			{
				_ModemHangUp();
				return DEF_MODEM_SEND | DEF_MODEM_STATUS_NOCARRY;
			}
		}
		else 
			NoCarryCount = 0;
		if ( rTXCLK != DEF_MODEM_TXC )
		{
			rTXCLK = DEF_MODEM_TXC;
			if ( rTXCLK )
			{
				if ( (Tcounter == 0) || (Tcounter == 7) )
					DEF_MODEM_TXD = 0x00;
				else
					DEF_MODEM_TXD = 0x01;
				Tcounter++;
 				if (( Tcounter == 8 )&&(ht==0))	break;
 				if ( Tcounter >= 14 )	break;
			}
		}
	}
	return  DEF_MODEM_SEND | DEF_MODEM_STATUS_OK;
}

uchar	_ModemSd(uchar *SendBuff, uint SendLen)
{
	bit    rTXCLK = 1;
	uchar  Tcounter = 0;
	uchar  Bit1CounterT = 0;	
	uint   Pt = 0;
	uchar  NoCarryCount = 0;
	uchar  Tdata;
	uint   CrcBuff;
	uchar  CRC = 0;

	_SelAddrModem();
	Tdata = PUB_AddrNo;
	while ( 1 )
	{
		if ( (XBYTE[DEF_MODEM_DR] & 0x08) == 0 )
		{
			if ( (++NoCarryCount) > 20 )
			{
				_ModemHangUp();
				return DEF_MODEM_SEND | DEF_MODEM_STATUS_NOCARRY;
			}
		}
		else 
			NoCarryCount = 0;
		if ( rTXCLK != DEF_MODEM_TXC )
		{
			rTXCLK = DEF_MODEM_TXC;
			if ( rTXCLK )
			{
				if ( Bit1CounterT == 5 )
				{
					DEF_MODEM_TXD = 0x00;
					Bit1CounterT = 0x00;
					continue;
				}
				if ( (Tdata & 0x01 ) == 0x00 )
					Bit1CounterT = 0;
				else  
					Bit1CounterT++;
				DEF_MODEM_TXD = Tdata & 0x01;
				Tdata = Tdata >> 1;
				Tcounter++;
				if ( Tcounter == 8 )
				{
					Tcounter = 0;
					Pt++;
					if ( Pt == 1 )
					{
						if ( PUB_SendData )
							Tdata = (PUB_NS << 1) | 0x10 | (PUB_NR << 5 );
						else
							Tdata = PUB_SendCtrlData;
						CrcBuff = CrcData(0xFFFF, PUB_AddrNo);
						CrcBuff = CrcData(CrcBuff, Tdata);
					}
					else
					{
						if ( PUB_SendData )
						{
							if ( Pt < (SendLen+2) )
							{
								Tdata = SendBuff[Pt-2];
								CrcBuff = CrcData(CrcBuff,Tdata);
								continue;
							}
						}
						switch ( CRC )
						{
							case 0:	
								CrcBuff = CrcBuff ^ 0xFFFF;
								Tdata = CrcBuff >> 8;
								CRC++;
								break;
							case 1:	
								Tdata = CrcBuff & 0xFF;
								CRC++;
								break;
							case 2:	
								if ( Bit1CounterT == 5 )
								{
									Bit1CounterT = 0;
									Tdata = 0x00;
									Tcounter = 7;
								}
								else
									return DEF_MODEM_SEND | DEF_MODEM_STATUS_OK;
						}
					}
				}
            }
		}
	}
}


uchar	_ModemRc(uchar *RecBuff, uint *RecLen)
{
	bit    rTXCLK = 1;
	bit    rRXCLK = 1;
	uchar  Tcounter = 0, Rcounter = 0;
	uchar  Rdata = 0;
	uchar  Bit1CounterR = 0;
	uchar  RecStatus = DEF_REC_STATUS_NULL;
	bit    Flag_ToExitRec = 0;
	bit    BitData;
	uchar  CtrlData;
	uint   CrcBuff, RecCount,OverTime;
	uchar  NoCarryCount = 0;

	OverTime=12000;
	_SelAddrModem();
	while ( 1 )
	{
		if ( (XBYTE[DEF_MODEM_DR] & 0x08) == 0 )
		{
			if ( (++NoCarryCount) > 20 )
			{
				_ModemHangUp();
				return DEF_MODEM_REC | DEF_MODEM_STATUS_NOCARRY;
			}
		}
		else  
			NoCarryCount = 0;
		if ( rTXCLK != DEF_MODEM_TXC )
		{
			rTXCLK = DEF_MODEM_TXC;
			if ( rTXCLK )
			{
				if ( (Tcounter==0) || (Tcounter==7) )
					DEF_MODEM_TXD = 0x00;
				else
					DEF_MODEM_TXD = 0x01;
				Tcounter++;
				if ( Tcounter >= 8 )
				{
					Tcounter = 0;
					if ( Flag_ToExitRec )  break;
				}
			}
		}
		if ( Flag_ToExitRec )	continue;
		if ( rRXCLK != DEF_MODEM_RXC )
		{
			rRXCLK = DEF_MODEM_RXC;
			if( rRXCLK == 0 )
			{
				OverTime--;
				if(OverTime==0)
				{
					_ModemHangUp();
					return DEF_MODEM_REC | DEF_MODEM_STATUS_OVERTIME;
				}
				if ( DEF_MODEM_RXD )
				{
					BitData = 1;
					Bit1CounterR++;
					if ( Bit1CounterR > 6 )
					{
						RecStatus = DEF_REC_STATUS_NULL;
 						continue;
					}
				}
				else
				{
					BitData = 0;
					if ( Bit1CounterR == 6 )
					{
						if ( (RecStatus==DEF_REC_STATUS_INFO) || 
							 (RecStatus==DEF_REC_STATUS_CTRLCRC) )
						{
							Flag_ToExitRec = 1;
							continue;
						}
						else
						{
							CrcBuff = 0xFFFF;
							RecStatus = DEF_REC_STATUS_ADDR;
							Rdata = 0x00;
							Rcounter = 0;
							Bit1CounterR = 0;
							continue;
						}
					}
					else
					{
						if ( Bit1CounterR == 5 )
						{
							Bit1CounterR = 0;
							continue;
						}
						else  
							Bit1CounterR = 0;
					}
				}
				Rdata = Rdata >> 1;
				if ( BitData ) Rdata |= 0x80;
				if ( (++Rcounter) < 8 ) 
					continue;
				Rcounter = 0;
				CrcBuff =  CrcData(CrcBuff, Rdata);
				switch( RecStatus )
				{
					case  DEF_REC_STATUS_ADDR:
						PUB_AddrNo2  = Rdata;
						RecStatus = DEF_REC_STATUS_CTRL;
						break;
					case  DEF_REC_STATUS_CTRL:
						CtrlData = Rdata;
						if ( Rdata & 0x01 )
							RecStatus = DEF_REC_STATUS_CTRLCRC;
						else
						{
							RecStatus = DEF_REC_STATUS_INFO;
							RecCount = 0;
						}
						break;
					case  DEF_REC_STATUS_INFO:
						*(RecBuff + RecCount) = Rdata;
						RecCount++;
  						break;
				}
			}
		}
	}

    if ( CrcBuff != DEF_CRC_OK )
	{
		if ( RecStatus == DEF_REC_STATUS_INFO )
		{
			*RecLen = RecCount;
			PUB_SendCtrlData = 0x11 | (PUB_NR << 5);
			return DEF_MODEM_DATAINFO | DEF_DATAINFO_CANCEL;
		}
	}
	if ( RecStatus == DEF_REC_STATUS_INFO )
	{
		if ( ((PUB_NS+1) & 0x07) == (CtrlData >> 5) )
			PUB_NS = ( PUB_NS+1) & 0x07;
		PUB_NR = (((CtrlData & 0x0f) >> 1 ) + 1 ) & 0x07;
		PUB_SendCtrlData = 0x11 | ( PUB_NR << 5);
		*RecLen = RecCount;
		return DEF_MODEM_DATAINFO | DEF_DATAINFO_END ;
	}
	if ( (CtrlData & 0x0F) == 0x01 )
	{
		if ( ((PUB_NS+1) & 0x07) == (CtrlData >> 5) )
		{
			PUB_NS = ( PUB_NS+1) & 0x07;
			if ( PUB_SendData )
				PUB_ModemStatus = 1;
		}
		if ( PUB_ModemStatus )
		{
			PUB_SendCtrlData = 0x11 | (PUB_NR << 5);
			PUB_SendData = 0;
		}
		else
		{
			PUB_SendData = 1;
		}
		CtrlData = CtrlData & 0x0F;
	}
	else if (CtrlData == 0x93)
	{
		PUB_AddrNo = PUB_AddrNo2;
		PUB_NS = PUB_NR = 0;
		PUB_SendCtrlData = 0x73;
		PUB_ModemStatus = 1;
		PUB_SendData = 0;
	}
	return CtrlData;
}

void _ModemSetStatus(uchar Val)
{
	PUB_ModemStatus = (bit)Val;
	return;
}

void _ModemGetErrStr(uchar ErrCode, uchar *ErrString)
{
	uchar Buf[20];

	memset(Buf, 0, 20);
	BCDtoChar(&ErrCode, 1, Buf);
	switch (ErrCode & 0x0F)
	{
		case  DEF_MODEM_STATUS_NOMODEM : strcat(Buf, ":没有Modem");		break;
		case  DEF_MODEM_STATUS_NOLINE  : strcat(Buf, ":未连接线路");	break;
		case  DEF_MODEM_STATUS_BUSY    : strcat(Buf, ":线路忙");		break;
		case  DEF_MODEM_STATUS_NOCARRY : strcat(Buf, ":载波不存在");	break;
		case  DEF_MODEM_STATUS_NOANSWER: strcat(Buf, ":没有应答");		break;
		case  DEF_MODEM_STATUS_NOHDLC  : strcat(Buf, ":没有HDLC");		break;
		case  DEF_MODEM_STATUS_USERCANCEL: strcat(Buf, ":用户中断");	break;
		case  DEF_MODEM_STATUS_OVERTIME: strcat(Buf, ":超时退出");		break;
		case  DEF_MODEM_STATUS_CRCERROR: strcat(Buf, ":CRC错误");		break;
		default: strcat(Buf, ":未知错误");								break;
	}
	strcpy(ErrString, Buf);
	return;
}

void _ModemDispErr(uchar ErrCode, DispLine)
{
	uchar Buf[20];

	_ModemGetErrStr(ErrCode, Buf);
	_Display(DispLine, Buf);
	return;
}

uchar	_ModemDial(uchar *pTelNo)
{
	uchar cc, j,k;
	uint  i;

	cc = _ModemDl( pTelNo );
	if ( (cc & 0x0F) != 0 )
		return cc;
	else
	{
		j = 0;
		while ( 1 )
		{
			cc = _ModemRc(PixelBuff, &i);
			if((cc == (DEF_MODEM_REC | DEF_MODEM_STATUS_NOCARRY))||(cc ==(DEF_MODEM_REC | DEF_MODEM_STATUS_OVERTIME)) )
				return	cc;
			if ( cc == 0x93 )
			{
			_ModemHeadTail(0);
			_ModemHeadTail(0);
			_ModemSd(PixelBuff, 1 );
			_ModemHeadTail(0);
			k= 10;
			do 
				{
					cc = _ModemRc(PixelBuff, &i);
					k -- ;
				}	while ((cc != 01) && (cc != (DEF_MODEM_REC | DEF_MODEM_STATUS_NOCARRY))
					&&(cc !=(DEF_MODEM_REC | DEF_MODEM_STATUS_OVERTIME)) && (k !=0 ));
				_ModemHeadTail(1);
				if (cc != 01) return cc;
				return DEF_MODEM_CONNECT | DEF_MODEM_STATUS_OK;
			}
			j++;
			if ( j > 10 )
				return DEF_MODEM_CONNECT | (cc & 0x0F);
		}
	}
}

uchar	_ModemSend(uchar *SendBuff,  uint SendLen)
{
	uchar cc,j;
	uint  i;

	_ModemHeadTail(0);
	cc = _ModemSd(SendBuff, 1);
	_ModemHeadTail(0);
	if ( cc == (DEF_MODEM_SEND | DEF_MODEM_STATUS_NOCARRY) )
		return DEF_MODEM_SEND | DEF_MODEM_STATUS_NOCARRY;
	_ModemSetStatus(0);
	j= 10 ;
	do 
	{
		cc = _ModemRc(PixelBuff, &i);
		j -- ;
	}	while ((cc != 01) && (cc != (DEF_MODEM_REC | DEF_MODEM_STATUS_NOCARRY))
		&&(cc !=(DEF_MODEM_REC | DEF_M

⌨️ 快捷键说明

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