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

📄 jbinit.c

📁 电话PSTN线路上FSK处理软件。。。。。。。。。
💻 C
📖 第 1 页 / 共 2 页
字号:

/*************************************************************
 *
 *		文 件 名:	jbMain.c
 *		说    明:	JJF24-1B型计费器主程序文件
 *		起始日期: 	1999.11.25
 *
 ************************************************************/

//#pragma SRC
//#pragma DEBUG
 
#include <jbInit.h>

byte code aVersion[]={'J','F','B','0','5','0','4','4','0','1'};
 
/***********************************************************
 *
 *		函  数:ApiProgram(void)
 *		说  明:应用程序主循环
 *
 ************************************************************/

void ApiProgram(void)
{
	bFailTimes=0;
	fWaitExit=0;
	fFirstCmd=0;
	bLastCmd=0xff;
    bStatusWord=S_HARDWAREINIT;				// 程序主循环        
    bFailTimes=0;
    bEnterFlag=0;
   	while(TRUE){
 		switch(bStatusWord){
 			case S_HARDWAREINIT:			// 00:硬件初始化过程
 				HardwareInit();
 				break;

 			case S_OLDPARAINIT:				// 01:OLD模式变量初始化
 				OldParaInit();
 				break;
			
 			case S_OLDMASTERCALL:			// 09:NEW模式主叫通话过程	
 				OldMasterCall();
 				break;

 			case S_OLDSLAVECALL:			// 10:NEW模式被叫通话过程
 				OldSlaveCall();
            	break;

			case S_OLDLOCKWAIT:				// 07:NEW模式锁机等待过程
			case S_NEWLOCKWAIT:				// 07:NEW模式锁机等待过程
 				LockWait();
 				TR2=0;
				ET2=0;
 				break;

 			case S_OLDUNLOCKWAIT:			// 08:NEW模式开锁(挂机)等待过程
 			case S_NEWUNLOCKWAIT:			// 08:NEW模式开锁(挂机)等待过程
 				UnLockWait();
 				break;

			case S_NEWPARAINIT:			// 06:NEW模式变量初始化过程
				NewParaInit();
				break;
			
 			case S_NEWMASTERCALL:		// 09:NEW模式主叫通话过程	
 				NewMasterCall();
 				break;

 			case S_NEWSLAVECALL:		// 10:NEW模式被叫通话过程
 				NewSlaveCall();
            	break;

			// MODEM通信上呼状态散转:		
	 		case S_UPCALL:				// 11:拨号呼叫管理机过程
 				UpCall();		
 				break;
 			
 			case S_OLDUPCOMM:			// 12:OLD模式数据上传过程
 				OldComm();
 				break;	
 		
 			case S_NEWUPCOMM:			// 13:NEW模式数据上传过程
 				NewComm();
 				break;	
	
			// MODEM通信下传状态散转:
	 		case S_DOWNCALL:			// 14:管理机下呼过程
 				DownCall();
 				break;

 			case S_OLDDOWNCOMM:			// 15:OLD模式数据下传过程
	 			OldComm();
 				break;	

 			case S_NEWDOWNCOMM:			// 16:NEW模式数据下传过程
 				NewComm();
 				break;	

			// 公共过程处理: 
	 		case S_SERIALCOMM:			// 17:RS232串行口通信过程
 				UartComm();   
 				break;

	 		case S_SERVICE:				// 18:维护状态
 				Server();
 				break;

 			default:						// 出现异常时,重新进行初始化
 				bStatusWord=S_HARDWAREINIT;
 				break;	
 		} // End switch(bStatusWord)
 		if(bDlpReason!=0)
 			return;	
	} // End while(TRUE) 		
}
// End	function: Main()

/*************************************************************
 *
 *	函	数: HardwareInit()
 *	说  明:	JJF24-1B型计费器上电硬件初始化函数
 *			处理定时器,中断,外部口及12887初始化、
 *
 ************************************************************/
void HardwareInit(void)
{
 	byte i;
 	byte bdata *Point;

    TMOD=0x21;				// 定时器0选择工作模式1 
    TH0=L5MS_H;				// 主频为11.0592MHZ,5MS定时常数
    TL0=L5MS_L;
    TH1=L9600;				// 串口9600BPS定时常数
	TL1=L9600;
	T2CON=0x00;     	  	/* time2 16-bits reload mode        */
    RCAP2H=L278us_H;
    RCAP2L=L278us_L;
    	
    SCON=0x40;				// 串口工作模式1,8位UART
    PCON=0x80;
   	
    for(Point=0x20;Point<=0x2f;Point++)
        *Point=0;
	IP=0x20;						// 中断初始化, 278us 为最高级中断
	IT0=0;EX0=0;
	IT1=1;EX1=0;
	TR0=1;ET0=1;
	TR1=0;ET1=0;
	TR2=0;ET2=0;
	ES=0;
	
	EA=1;
	cbDelay5MS=30;
	fDelay5MS=0;
	while(!fDelay5MS) IDLE;

 	DispInit();						// 显示初始化
 	DispClr();						// 清除大显示器
    ReadByte(RTC_CONTROLC,6); 		// 取消12887中断请求信号
	Close(MLD);
	Open(RLY);
	Close(POWER_ON);
	ResetModem();
	Speaker(80);

	pReadNumber=0;					// 全局共用变量初始化
	pWriteNumber=0;
	cbFangDao=200;
	// yxw 2001-05-12 16:08 add
 	Page(6);
	OutBuf|=0x04;
	XBYTE[OUT_CE]=OutBuf;
	Page(5);
	
	bErrorCode=ERR_NO;
	fWaitExit=0;
 	
	AutoReadPara(47);				// 读处计费器当前工作模式
	if(bParaByte==0x88)
		fWorkMode=0;
	else{
		fWorkMode=1;
		if(bParaByte!=0x99){
			bParaByte=0x99;
			AutoWritePara(47);
		}
	}		
	CheckPara();
 	if(KeyProcess())
		return;
	AutoReadPara(49);
	if(bParaByte!=0x55){
		memset(&aDataBuf,0x00,20);
		WriteData(1,PARA_100,20,&aDataBuf);
		bParaByte=0x55;
		AutoWritePara(49);
	}
	AutoReadPara(50);
	for(i=0;i<10;i++){
		if(aVersion[i]!=aParaBuf[i]){
			bErrorCode=ERR_34;
			break;
		}
	}			
	if(bErrorCode==ERR_34){
		for(i=0;i<10;i++)
			aParaBuf[i]=aVersion[i];	
		WriteData(1,PARA_50,10,&aParaBuf);	//填入版本号
	}	
	bErrorCode=ERR_NO;
	CheckRTCTime();					// 检查12887中时间值的合法性
	CheckSumTest();					// 检查各种重要参数检验和 
	
	//
	bErrorCode=ERR_NO;
	//
	if(bErrorCode!=ERR_NO){
		DispErrorCode();
		if(fWorkMode){
			AutoReadPara(16);
			if(bParaByte>8)
				bParaByte=8;
			if(bParaByte<1)
				bParaByte=1;	
		}
		else
			bParaByte=3;
		if(bFailTimes>9)
			bFailTimes=0;		
		if(bFailTimes<bParaByte){
           	if(fWorkMode)
           		bCallReason=NEW_TEST;
           	else	
           		bCallReason=OLD_TEST;
           	bStatusWord=S_UPCALL;
           	return;
        }	
        else{
        	bStatusWord=S_NEWLOCKWAIT;
		    cbRingTimes=0;
    		cbRingPulseNum=0;
		    while(1){								//多次呼叫不成功后,等待系统呼入
		    	IDLE;
				if((cbRingTimes>3)||(OffHook()&&InComingCall())){
				    if(DetectConnectTone(1)){
					   	bStatusWord=S_DOWNCALL;
					  	Open(POWER_ON);    
					}	
					else
		        		bStatusWord=S_HARDWAREINIT;
	    	    	return;	
				}  	
			}
		}	
	}	
	DispCurrentDate();	
	SavePowerOnOff();
	InBuf=ReadByte(IN_CE,6);		// 检查外线是否接反
	if((InBuf&0x08)==0){
		Close(RLY);
		DelaySecond(2);
		InBuf=ReadByte(IN_CE,6);
		Open(RLY);
		if((InBuf&0x08)!=0){
			bErrorCode=ERR_20;
			DispErrorCode();
		}	
	}
	else	
		DelaySecond(2);
	//
	EX0=1;	
	fMustReport=0;
	fDelaySecond=1;
	fLocked=1;
	
	if(fWorkMode)
		bStatusWord=S_NEWPARAINIT;				
	else
		bStatusWord=S_OLDPARAINIT;				
	Page(5);	
}
// End function: HardWareInit()
	
/****************************************************************
 *
 *	函	数: OldParaInit()
 *	说	明: OLD模式参数初始化处理
 *			调整记录指针,记录开关机记录
 *
 **************************************************************/	
byte code aParaCode[]={67,68,69,70,71,72};
byte code aOldRange[]={199,199,200,31,14,34};
uint code aNewRange[]={499,499,500,31,31,34};
byte code aAccumulateCode[]={60,65};

void CheckPara(void)
{
	byte i;
	byte j,bTemp;
	uint iTemp;
	//判断主、被叫统计参数是否越界
	for(i=0;i<2;i++){
		j=aAccumulateCode[i];
		AutoReadPara(j);
		if(iParaWord>9999){
			iParaWord=0;
			lParaLWord=0;
			AutoWritePara(j);
			AutoWritePara(j+1);
		}	
	}	
	//判断各指针是否超出范围
	for(i=0;i<6;i++){
		if(fWorkMode)
			iTemp=aNewRange[i];
		else
			iTemp=aOldRange[i];
		if(i>2)		
			bTemp=(byte)iTemp;
		j=aParaCode[i];
		AutoReadPara(j);
		if(i>2){
			if(bParaByte>bTemp)
				bParaByte=0;
			else
				continue;	
		}
		else{
			if(iParaWord>iTemp)
				iParaWord=0;
			else 
				continue;
		}				
		AutoWritePara(j);
	}
	//判断日分项合计的时间是否为非法
	WaitRTC();
	Page(6);
	if((XBYTE[0xc02c]>0x12)||(XBYTE[0xc02d]>0x31)
	 ||(XBYTE[0xc02c]==0)||(XBYTE[0xc02d]==0)){
	    XBYTE[0xc02a]=0x20;
    	XBYTE[0xc02b]=XBYTE[0xc009];
    	XBYTE[0xc02c]=XBYTE[0xc008];
    	XBYTE[0xc02d]=XBYTE[0xc007];
		for(iTemp=0xc02e,i=0;i<17;i++,iTemp++)
			XBYTE[iTemp]=0;
	}
	Page(5);		
}		
		
void OldParaInit(void)
{
	AutoReadPara(211);					// 初始化各种控制标志位
	fbBuf1=bParaByte;					
	fIDDPrintLimit=fDDDPrintLimit;
	AutoReadPara(212);
	fbBuf2=bParaByte;
	//
    AutoReadPara(203);
    bAutoOffHookTimes=bParaByte>>4;
    bReDialTimes=bParaByte&0x0f;
    AutoReadPara(205);
    bResetTime=bParaByte;
    AutoReadPara(209);
    bReportNum=bParaByte;	
	//
	if(fAutoReport)
	    bReportWord=1;
	else
		bReportWord=0;    
    iDetectCarrierTime=50;
    iCancelCodeDelay=0;
    bStationFDLength=0;
    iOffHookTime=20;
    bAutoOnOffHookTime=20;
    bTalkDispTime=20;
    bOffHookDelay=120;	
    fSaveFreeTalk=0;
    fSaveInTalk=0;
   	fStartFangDao=0;
   	fFanjiFangDao=0;
   	// Use For Wait Status
    iTalkLength=199;	
    bDayTotalLength=14;
    fUnlockStat=0;
    // Read Old Mode Control Parameter.
    AutoReadPara(51);
//    if((bParaByte&0x01)!=0)		// FDD
//    	fFDD=1;
//    else
    	fFDD=0;	
    if((bParaByte&0x02)!=0)		// NO
    	fDispTalkPointer=1;
    else
    	fDispTalkPointer=0;	
    if((bParaByte&0x08)!=0)		// BHY
    	fDetectDialTone=1;
    else
    	fDetectDialTone=0;	
    if((bParaByte&0x20)!=0)		// FPU
    	fPluseFD=1;
    else
    	fPluseFD=0;
    if((bParaByte&0x40)!=0)		// CDY
    	iWaitDDTime=400;
    else
    	iWaitDDTime=320;
    //
	bStatusWord=S_OLDLOCKWAIT;
}
// End function: OldParaInit()	
			
/****************************************************************
 *
 *
 *		函	数: NewParaInit()
 *		说	明: NEW模式参数初始化处理
 *
 *
 **************************************************************/	
void NewParaInit(void)
{
	fUnlockStat=0;   
	ReadData(1,PARA_07,14,&aNumBuf);
	if(aNumBuf[0]!=0)
   		fIDDCallLimit=1;			// IDD呼出限制
	if(aNumBuf[1]!=0)			
   		fDDDCallLimit=1;			// DDD呼出限制
	if(aNumBuf[2]!=0)			
   		fLOCCallLimit=1;			// LOCLA呼出限制
	if(aNumBuf[3]!=0)
    	fIDDPrintLimit=1;			// IDD打印限制
	if(aNumBuf[4]!=0)
    	fDDDPrintLimit=1;			// DDD打印限制
	if(aNumBuf[5]!=0)
    	fLOCPrintLimit=1;			// LOCAL打印限制
	if(aNumBuf[6]!=0)
    	fDialForm=1;				// 主叫拨号方式
	if(aNumBuf[7]!=0)
    	fSecretSelect=1;			// 通讯加密选择
	if(aNumBuf[8]!=0)
    	fHanderEnable=1;			// 手动计时允许
	if(aNumBuf[9]!=0)
    	fErrorAutoCall=1;			// 自检出错呼叫管理系统
	if(aNumBuf[10]!=0)
    	fClearTotalEnable=1;		// 允许手动清累计值
	if(aNumBuf[11]!=0)
		fUnlockStat=1;
	if(aNumBuf[12]!=0)
    	fEndLockEnable=1;			// 话毕锁机
	if(aNumBuf[13]!=0)
    	fSlaveCalcForm=1;			// 呼入是否自动计费
    AutoReadPara(03);
    bAutoOffHookTimes=bParaByte;
    AutoReadPara(04);
    bReDialTimes=bParaByte;
    AutoReadPara(05);
    bReportWord=bParaByte;

⌨️ 快捷键说明

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