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

📄 main.c

📁 使用单片机开发的16路电话同时进行号码解析和CID功能
💻 C
📖 第 1 页 / 共 2 页
字号:
/**************************************
pj name:           DTMF CID
author:             RPJ
version:            V0.1
description:      the code for 16 channel CID of dtmf mode.
                          hook off/ on register ADDR at 8000h and 9000h,
                          data for cid decoder register ADDR at A000h and B000h,
                          8870 stb single at hight  4 bit of P1 port,
**************************************/
#include "micro.h"



sbit SWITCH_4052A  = P1^0 ;			/* switch for a*/
sbit SWITCH_4052B  = P1^1 ;			/* switch for b*/
sbit WORK_RIGHT = P1^2;			/*system work right*/
sbit DOG_RIGHT= P1^3;				/*system monitor right*/

sbit SLEC_138 = P3^4 ; 				/* extern Reg select signal */


void	InitSystem(void);
void	Micro_Scan_8870(void);
void EXT_Rec_StateScan(UNCHAR group);
void	EXT_StateScan(UNCHAR group);
void Control_4052(void);
BOOL Exchang_CIDData(UNCHAR EXT_No);
void	SendDataToAlign(UNCHAR EXT_No);
void	SendDataToDisp(void);
void	Deal_UartData(void);
void Deal_CIDEvent(void);
BOOL Deal_TRKNo(void);
BOOL Back_Catch_Front(UNCHAR Back, UNCHAR Front, UNCHAR CatchSize) ;
void	TimerStart(void);

void test(UNCHAR type);

main()
{

	SP = 0x60;
	InitSystem();

	for(;;)
	{
	
		if( Flag_5ms )
		{
			STD8870 |= P1;
		}
		else
		{
			Flag_5ms= 1;
			EXT_Rec_StateScan(0);
			EXT_Rec_StateScan(1);
			Micro_Scan_8870();
		}
		
		if( Flag_10ms )
		{
			Flag_10ms = 0;
			Control_4052();
			STD8870 = 0;
		}

		if( Flag_100ms )
		{
			Flag_100ms = 0;
			EXT_StateScan(0);
			EXT_StateScan(1);
		}

		if( Flag_s )
		{
			Flag_s = 0;
			WORK_RIGHT =~WORK_RIGHT;
			DOG_RIGHT =~DOG_RIGHT;
		}
		
		if( ISP_Mode )
		{			
			ISP_Mode = 0;			
		}
		
		Deal_UartData();
		Deal_CIDEvent();

	}
}
/*******************
test
*********************/
void test(UNCHAR type)
{
UNINT i;
	MICRO_SendToBuf(ALIGNMENT[WP_ALIGN],
		type, WP_ALIGN, TAL_ALIGN, ALIGSIZE);
	for(i=0;i<(TRK_No+1)*6;i++)
	{
		MICRO_SendToBuf(ALIGNMENT[WP_ALIGN],
			TRK_No_List[i], WP_ALIGN, TAL_ALIGN, ALIGSIZE);
		TRK_No_List[i] = 0;
	}
	
	TRK_No = 0;
	MICRO_SendToBuf(ALIGNMENT[WP_ALIGN],
		type, WP_ALIGN, TAL_ALIGN, ALIGSIZE);

}
/***************************************
subroutine name: initsystem
input variable:       /
output variable:    /
description:           initialize the system variable,for interrupt\timer\uart\
***************************************/
void InitSystem(void)
{

UNINT i;

	PSW = 0 ;
	IE = 0;                //屏蔽所有中断
	TMOD = 0x21;  //定时器T1用于串口,定时器T0用于16位定时器。
	PCON = 0x80;  //串行SMOD波特率翻倍
	SCON = 0x50;  //串行方式为1,SM = 0,REN = 1,
	IP = 0x02;       //设置T0为高级中断
	ET0 = 1;           //设置定时器中断
	TCON = 0;        //清楚定时器初始状态
	LOAD_TIMER0(TimerH_2ms, TimerL_2ms);
	LOAD_TIMER1(bps4800, bps4800);
	TI = 0;
	RI = 0;
	
	for(i=0;i<16;i++)
	{
		DTMF_Rec_ST[i] = MT8870_EnRec;
		DTMF_Reg_Rec[i] = NULL;
		CHECK_Reg[i] = NULL;
		COUNTER[i] = NULL;
	}

	for(i=0;i<ALIGSIZE;i++)
	{
		EXT_RecDtmf_List[i] = NULL;
		ALIGNMENT[i] = NULL;
		UART_CIDList[i] = NULL;
		TRK_No_List[i] = NULL;
	}
	
	for(i=0;i<BUFSIZE;i++)
	{
		EXT_EVENT_QUEUE[i] = NULL;
	}

	GROUP_Red_ST[0] = 0;
	GROUP_Red_ST[1] = 0;
	GROUP_RESAVE_ST[0] = 0;
	GROUP_RESAVE_ST[1] = 0;
	SLEC_Point = 0;
	TRK_No = 0;
	
	WP_EVENT = 0;
	RP_EVENT = 0;
	TAL_EVENT = 0;
	
	WP_ALIGN = 0;
	RP_ALIGN = 0;
	TAL_ALIGN = 0;

	WP_UCID = 0;
	RP_UCID = 0;
	TAL_UCID = 0;

	Counter2ms = 0;
	Counter5ms = 1;
	Counter10ms= 0;
	Counter100ms= 0;
	Flag_2ms = 0;
	Flag_5ms = 0;
	Flag_10ms = 0;
	Flag_100ms = 0;
	Flag_s = 0;
	Flag_Scan = 0;
		
	Flag_Head = 0;
	Flag_Second = 0;
	Flag_End = 0;
	
	SLEC_138 = 1;
	STD8870 = 0;

	ISP_Mode = 0;
	
	TR0 = 1;
	TR1 = 1;
	EA = 1;
}

/***************************************
subroutine name: Micro_Scan_8870
input variable:       /
output variable:    /
description:           scan 8870 decoder.tidy the cid dtmf,and write the align for each arry
***************************************/

void Micro_Scan_8870(void)
{
UNCHAR EXT_No,temp,INT_ST;
UNCHAR i,Class;
UNINT Addr;

/****************DECODER ST***************/
	INT_ST = STD8870 & 0xf0;
	INT_ST >>= 4; 
	STD8870 = 0;
/*****************************************/

	for(i=0;i<4;i++)
	{
		EXT_No = i*4+SLEC_Point;
		if(  INT_ST&0x01 )
		{
			if( DTMF_Rec_ST[EXT_No]&0xf0 )
			{
				DTMF_Rec_ST[EXT_No] &= 0xf0;
				DTMF_Rec_ST[EXT_No] |= MT8870_EnOut;//have tone input when decorder finish
				temp = i/2;
				
				Class = EXT_RecDtmf_List[EXT_No*15];
				if( Class >= 0x10 )
				{
					EXT_RecDtmf_List[EXT_No*15] |= 0x30;
					SendDataToAlign(EXT_No);
				}

				if( i%2 )
				{	
					SLEC_138 = 0;
					Addr = ADDR_DTMFDATA + temp *EXT_Group_Offset;
					temp = XBYTE[(Addr)];
					SLEC_138 = 1;
					temp = temp&0xf0;
					temp >>=4;
					DTMF_Reg_Rec[EXT_No] = temp;
					if(temp==0x0f)
						temp = 0;
				}
				else
				{
					SLEC_138 = 0;
					Addr = ADDR_DTMFDATA + temp *EXT_Group_Offset;
					temp = XBYTE[(Addr)];
					SLEC_138 = 1;
					temp = temp&0x0f;
					DTMF_Reg_Rec[EXT_No] = temp;
				}
			}
		}
		else
		{
			if( (DTMF_Rec_ST[EXT_No] & 0x0f) == MT8870_EnOut)
			{
				COUNTER[EXT_No] = 0;
				DTMF_Rec_ST[EXT_No] &= 0xf0;
				DTMF_Rec_ST[EXT_No] |= MT8870_NoOut;//no tone input when decorder finish
				Class = DTMF_Rec_ST[EXT_No] & 0xf0;
				if( Class )
				{
					if( Exchang_CIDData(EXT_No) )
					{
						EXT_RecDtmf_List[EXT_No*15]++;
						temp = EXT_RecDtmf_List[EXT_No*15] & 0x0f;
						Addr = EXT_No*15+temp;
						EXT_RecDtmf_List[Addr] = DTMF_Reg_Rec[EXT_No];	
					}
				}
				else
				{
					EXT_RecDtmf_List[EXT_No*15] = 0;					
				}
			}
			if( COUNTER[EXT_No] == TIME_SPACE )
			{
				COUNTER[EXT_No] = 0;
				DTMF_Rec_ST[EXT_No] &= 0xf0;
				
				temp = EXT_RecDtmf_List[EXT_No*15];
				if( temp & 0x0f )
				{
					MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT],
						EXT_No, WP_EVENT, TAL_EVENT, BUFSIZE);
					temp |= 0x10;
					EXT_RecDtmf_List[EXT_No*15] = temp;
				}
			}
			else
			{
				if(DTMF_Rec_ST[EXT_No] > MT8870_EnRec )
					COUNTER[EXT_No] ++;
				else
					COUNTER[EXT_No] = 0;
			}
		}		
		INT_ST>>=1;
	}
}

/***************************************
subroutine name: EXT_Rec_StateScan(UNCHAR group)
input variable:       ext_group/0 or 1
output variable:    /
description:           scan ext hook off / on,when hook on the decorder shut off,or trun on.
***************************************/
void EXT_Rec_StateScan(UNCHAR group)
{
UNCHAR EXT_No,i;
UNCHAR GROUP_ST_NEW;

	SLEC_138 = 0;
	GROUP_ST_NEW = XBYTE[(ADDR_HOOKDATA+group*EXT_Group_Offset)];
	SLEC_138 = 1;
	for(i=0;i<8;i++)
	{
		EXT_No = group *8+i;
		if((GROUP_ST_NEW>>i)&0x01)
		{
			DTMF_Rec_ST[EXT_No] &= 0x0f;
		}
		else
		{
			DTMF_Rec_ST[EXT_No] |= MT8870_EnRec;
		}
	}
}
/***************************************
subroutine name: EXT_StateScan
input variable:       ext_group/0 or 1
output variable:    /
description:           scan ext hook off / on,when hook on the decorder shut off,or trun on.
***************************************/
void EXT_StateScan(UNCHAR group)
{
UNCHAR ST_TEMP,EXT_No,i;
UNCHAR GROUP_ST_ANAL,GROUP_ST_NEW;

	SLEC_138 = 0;
	GROUP_ST_NEW = XBYTE[(ADDR_HOOKDATA+group*EXT_Group_Offset)];
	SLEC_138 = 1;
	GROUP_ST_ANAL=GROUP_ST_NEW^GROUP_Red_ST[group];
	ST_TEMP = GROUP_ST_NEW;
	
	for(i=0;i<8;i++)
	{
		EXT_No = group * 8+i;
		if( EXT_No > TAL_EXT_PORT )
			break;
		if( GROUP_ST_ANAL & 0x01 )
		{
			CHECK_Reg[EXT_No] = EXT_SCAN_ON;
			if( EXT_SCAN_PRI )
				CHECK_Reg[EXT_No]++;
			else
				goto NO_PRI;
		}
		else
		{
			if( CHECK_Reg[EXT_No] >EXT_SCAN_ON)
			{
				if( CHECK_Reg[EXT_No] >EXT_SCAN_LEN )
				{
NO_PRI:				if( ST_TEMP & 0x01 )
					{
						CHECK_Reg[EXT_No] = EXT_SCAN_OFF;
						
						//DTMF_Rec_ST[EXT_No] = MT8870_NoRec;
						
						if( (EXT_RecDtmf_List[EXT_No*15] & 0x10) ==0 )
						{
							if( EXT_RecDtmf_List[EXT_No*15] & 0x0f )
								COUNTER[EXT_No] = TIME_SPACE;
						}
					}
					else
					{
						if( CHECK_Reg[EXT_No] >(EXT_SCAN_LEN +40))
						{
							CHECK_Reg[EXT_No] = EXT_SCAN_OFF;
							
							//DTMF_Rec_ST[EXT_No] = MT8870_EnRec;
						
							if( EXT_RecDtmf_List[EXT_No*15] & 0x10 )
							{
								COUNTER[EXT_No] = TIME_SPACE;
								EXT_RecDtmf_List[EXT_No*15] |= 0x30;
							}
						}
						else
						{
							CHECK_Reg[EXT_No]++;				
						}
					}			
				}
				else
				{
					CHECK_Reg[EXT_No]++;				
				}
			}
			else
			{
				CHECK_Reg[EXT_No] = EXT_SCAN_OFF;
			}
		}
		
		ST_TEMP >>=  1;
		GROUP_ST_ANAL = GROUP_ST_ANAL >>1;
	}
	GROUP_Red_ST[group] = GROUP_ST_NEW;

⌨️ 快捷键说明

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