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

📄 main.c

📁 使用51单片机开发的一个集团电话系统
💻 C
📖 第 1 页 / 共 2 页
字号:
	for(i=0;i<255;i++)
	{
		EXT_Number_List[j++] = FlashRamTemp[i];
		if( j>=1000 )
			break;
	}
}
/*****************************
name:Def_EXT_Parma(void)
input:/
output:/
description:
将在FLASH中的前3个字节读出后判断
,如果前端数据是正确的,就恢复FLASH
数据,如果不是合法就要求系统数据全部
重新设置到RAM中,同时写入FLASH
*****************************/

void	Def_EXT_Parma(void)
{
unchar data i,m;
unint xdata j;

	EXT_Head = 6;							//默认字头为6
	EXT_Len = 3;							//默认长度为4
	Host_Head = 8;						//默认总机为8缩号
	Host_Ext = MAX_Ext;							//默认总机用户为0号
	TAL_EXT_PORT = MAX_Ext;					//默认用户端口6个
	TAL_MeetGroup= 7;					//默认会议组为1
	TAL_TrkGroup = 0;						//默认中继组为1
	TAL_TroopGroup = 7;					//默认群呼组为1
	Hot_Len = 3;							//默认热线等待长度为4秒

	FlagHeartSkip = 0;					//是否发送PC机的心跳数据
	
	First_Meet_Head = 0x90;
	First_Troop_Head = 0x20;
	FlagSystemType = 1;					//=1表示是指令,=0表示普通话机
	
	FlashRamTemp[0] = 0x55;					//首次启动计数为0开始
	FlashRamTemp[1] = EXT_Head;			//修改变量
	FlashRamTemp[2] = EXT_Len;			//修改变量
	FlashRamTemp[3] = Host_Head;			//修改变量
	FlashRamTemp[4] = TAL_EXT_PORT;		//修改变量
	FlashRamTemp[5] = TAL_MeetGroup;		//修改变量
	FlashRamTemp[6] = TAL_TrkGroup;		//修改变量
	FlashRamTemp[7] = TAL_TroopGroup;		//修改变量
	FlashRamTemp[8] = Hot_Len;			//修改变量
	FlashRamTemp[9] = Host_Ext;			//修改变量
	FlashRamTemp[10] = First_Meet_Head;			//修改变量
	FlashRamTemp[11] = First_Troop_Head;			//修改变量
	FlashRamTemp[12] = FlagSystemType;
	
	FlashRamTemp[20] = 0;			//修改复位重起变量
	FlashRamTemp[21] = FlagHeartSkip;
	NoFreeFlag = FlashRamTemp[22];
	NoFreeCounter = FlashRamTemp[23];
	Password1 = Fun_Head,FlashRamTemp[24]=Password1;
	Password2 = Fun_End,FlashRamTemp[25]=Password2;
	Password3 = Fun_Head,FlashRamTemp[26]=Password3;

	if(NoFreeFlag==0xff)
	{
		NoFreeFlag = 15;
		FlashRamTemp[22] = 15;
	}
	if(NoFreeCounter==0xff)
	{
		NoFreeCounter = 0;
		FlashRamTemp[23] = 0;
	}
	FlashRamTemp[23]++;
	

	TAL_EXTGroup = TAL_EXT_PORT/8;		//默认系统分配用户组由用户口定
	if( TAL_EXT_PORT % 8 )
	{
		TAL_EXTGroup++;
	}
	Write_FlashPage();
	Write_FlashSecter(0x0000);				//向Flash写变量
	
/**********************************************************/
/*系统组参数表,地址从0100h开始*/
/**********************************************************/

	for(i=0;i<7;i++)//7组会议组
	{
		j = i*36; 
		Meet_Group[i].MeetLen= 2;	//默认会议头长度
		FlashRamTemp[j++] = Meet_Group[i].MeetLen;		
		Meet_Group[i].MeetHead = First_Meet_Head+i;	//默认会议头为有序
		FlashRamTemp[j++] = Meet_Group[i].MeetHead;
		Meet_Group[i].Meetstate = 0xff;	//默认会议状态为空
		FlashRamTemp[j++] = Meet_Group[i].Meetstate;
		Meet_Group[i].Num_Member = 0;	//默认会议成员为空
		FlashRamTemp[j++] = Meet_Group[i].Num_Member;
		for(m=0;m<MAX_Ext;m++)
		{
			Meet_Group[i].Meet_Member[m] = 0xff;//默认会议成员为空
			FlashRamTemp[j++] = Meet_Group[i].Meet_Member[m];	
		}
	}
	Write_FlashPage();
	Write_FlashSecter(0x0100);
/*
	for(i=0;i<7;i++)//7组中继组
	{
		j = i*36; 
		Trk_Group[i].TrkLen= 2;		//默认中继头长度为空
		FlashRamTemp[j++]= Trk_Group[i].TrkLen;		
		Trk_Group[i].TrkHead = 0x01+i;		//默认中继头为空
		FlashRamTemp[j++]= Trk_Group[i].TrkHead;
		Trk_Group[i].Num_Member = TAL_EXT_PORT;	//默认中继成员为空
		FlashRamTemp[j++] = Trk_Group[i].Num_Member;
		Trk_Group[i].Num_Use = NULL;		//默认中继成员为空
		FlashRamTemp[j++] = Trk_Group[i].Num_Use;
		for(m=0;m<TAL_EXT_PORT;m++)
		{
			Trk_Group[i].Trk_Member[m] = m;//默认会议成员为空
			FlashRamTemp[j++] = Trk_Group[i].Trk_Member[m];	
		}
		for(m=TAL_EXT_PORT;m<MAX_Ext;m++)
		{
			Trk_Group[i].Trk_Member[m] = 0xff;//默认会议成员为空
			FlashRamTemp[j++] = Trk_Group[i].Trk_Member[m];	
		}
	}
	Write_FlashPage();
	Write_FlashSecter(0x0200);
*/
	for(i=0;i<7;i++)//群呼组最大7组
	{
		j = i*37; 
		Troop_Param[i].TroopLen= 2;		//默认长度为空0
		FlashRamTemp[j++] = Troop_Param[i].TroopLen;
		Troop_Param[i].TroopHead = First_Troop_Head+i;	//默认头为空有序
		FlashRamTemp[j++] = Troop_Param[i].TroopHead;
		Troop_Param[i].Num_Member = 0;	//默认成员数为空0
		FlashRamTemp[j++] = Troop_Param[i].Num_Member;
		Troop_Param[i].TroopType = 0;		//默认在群呼状态0
		FlashRamTemp[j++] = Troop_Param[i].TroopType;
		Troop_Param[i].Troopstate = 0;		//默认无人启用群呼态0
		FlashRamTemp[j++] = Troop_Param[i].Troopstate;
		for(m=0;m<MAX_Ext;m++)
		{
			Troop_Param[i].Troop_Member[m] = 0xff;	//默认成员状态为空0xff
			FlashRamTemp[j++]= Troop_Param[i].Troop_Member[m];
		}
	}
	Write_FlashPage();
	Write_FlashSecter(0x0300);
	
/**********************************************************/
/*用户的物理参数表,地址从1000h开始*/
/**********************************************************/

	for(i=0;i<TAL_EXT_PORT;i++)
	{
		FlashRamTemp[i] = 0;			//默认高位是0
		Ext_Param[i].Num_H_Logic = FlashRamTemp[i];
	}
	Write_FlashPage();
	Write_FlashSecter(0x1000);

	for(i=0;i<TAL_EXT_PORT;i++)
	{
		FlashRamTemp[i] = i;			//默认低位是标准有序
		Ext_Param[i].Num_L_Logic = FlashRamTemp[i];
	}
	Write_FlashPage();
	Write_FlashSecter(0x1100);
	
	for(i=0;i<TAL_EXT_PORT;i++)
	{
		FlashRamTemp[i] = 0xff;		//默认热线号码是无效0xff
		Ext_Param[i].Num_Hot_Call = FlashRamTemp[i];
	}
	Write_FlashPage();
	Write_FlashSecter(0x1200);

	for(i=0;i<TAL_EXT_PORT;i++)
	{
		FlashRamTemp[i] = 0xff;		//默认转移号码是无效0xff
		Ext_Param[i].Num_Trans_Call = FlashRamTemp[i];
	}
	Write_FlashPage();
	Write_FlashSecter(0x1300);

	for(i=0;i<TAL_EXT_PORT;i++)
	{
		FlashRamTemp[i] = 0xff;		//默认回叫号码是无效0xff
		Ext_Param[i].Num_Busy_Recall = FlashRamTemp[i];
	}
	Write_FlashPage();
	Write_FlashSecter(0x1400);

	for(i=0;i<TAL_EXT_PORT;i++)
	{
		FlashRamTemp[i] = 0;		//默认组呼号码是有效0
		Ext_Param[i].Num_Group_Call = FlashRamTemp[i];
	}
	Write_FlashPage();
	Write_FlashSecter(0x1500);

	for(i=0;i<TAL_EXT_PORT;i++)
	{
		FlashRamTemp[i] = 0;			//默认中继组号码是无效0
		Ext_Param[i].Trk_Group_Right = FlashRamTemp[i];
	}
	Write_FlashPage();
	Write_FlashSecter(0x1600);

	for(i=0;i<TAL_EXT_PORT;i++)
	{
		FlashRamTemp[i] = 0xff;		//默认中继组归属是无效0xff
		Ext_Param[i].Trk_Group_Num = FlashRamTemp[i];
	}
	Write_FlashPage();
	Write_FlashSecter(0x1700);

	for(i=0;i<TAL_EXT_PORT;i++)
	{
		FlashRamTemp[i] = 0xff;		//默认中继组归属是默认0xff
		Ext_Param[i].Trk_Group_Param = FlashRamTemp[i];
	}
	Write_FlashPage();
	Write_FlashSecter(0x1800);

	for(i=0;i<TAL_EXT_PORT;i++)
	{
		FlashRamTemp[i] = 0;			//默认用户功能参数是默认0
		Ext_Param[i].Bit_Param = FlashRamTemp[i];
	}
	Write_FlashPage();
	Write_FlashSecter(0x1900);
	
	for(i=0;i<TAL_EXT_PORT;i++)
	{
		FlashRamTemp[i] = 0xff;		//默认用户功能参数是默认0
		Ext_Param[i].Num_Troop_Call= FlashRamTemp[i];
	}
	Write_FlashPage();
	Write_FlashSecter(0x1a00);
	
/*****************************************/
/*1000个用户的逻辑号码表初始化*/
/*****************************************/
	j = 0;
	for(i=0;i<255;i++)
	{
		FlashRamTemp[i] = j;			//默认用户逻辑号码参数有序
		EXT_Number_List[j++] = FlashRamTemp[i];
	}
	FlashRamTemp[i] = j;
	EXT_Number_List[j++] = FlashRamTemp[i];
	Write_FlashPage();
	Write_FlashSecter(0x2000);
	
	for(i=0;i<255;i++)
	{
		FlashRamTemp[i] = j;
		EXT_Number_List[j++] = FlashRamTemp[i];
	}
	FlashRamTemp[i] = j;
	EXT_Number_List[j++] = FlashRamTemp[i];
	Write_FlashPage();
	Write_FlashSecter(0x2100);
		
	for(i=0;i<255;i++)
	{
		FlashRamTemp[i] = j;
		EXT_Number_List[j++] = FlashRamTemp[i];
	}
	FlashRamTemp[i] = j;
	EXT_Number_List[j++] = FlashRamTemp[i];
	Write_FlashPage();
	Write_FlashSecter(0x2200);
	
	for(i=0;i<255;i++)
	{
		FlashRamTemp[i] = j;
		EXT_Number_List[j++] = FlashRamTemp[i];
		if( j>=1000 )
			break;
	}
	Write_FlashPage();
	Write_FlashSecter(0x2300);
}

/************************************
name:ISR_TIMER0 INTERRUPT
中断为1ms
1ms->5ms
5ms->15ms
15ms->30ms
30ms->90ms
90ms->990ms


把中断改为1.14毫秒,全部都改过了。
************************************/
void ISR_TIMER0()  interrupt 1
{
	TF0 = 0;
	LOAD_TIMER0(TimerH_1_14ms, TimerL_1_14ms);
	CounterMS++;
	Counter_Uart++;
	if( Counter_Uart >=3 )
	{
		Counter_Uart = 0;
		if( RI )
		{
			RI = 0;
			MICRO_SendToBuf(UartRec_List[WP_UartRec], SBUF, 
				WP_UartRec, TAL_UartRec, AlignSize);
		}
		if( TAL_UartSend )
		{
			if( TI )
				TI = 0;
			MICRO_GetFromBuf(UartSend_List[RP_UartSend], SBUF, 
				RP_UartSend, TAL_UartSend, AlignSize);
		}
	}
	
	if( CounterMS >= 5 )
	{
		CounterMS = 0;
		Counter5MS++;
		Flag5MS = 1;
		if(Counter5MS==1)
		{
			Flagscan = 1;
		}
	}

	Read_8870ST();

	if( Counter5MS >= 3 )
	{
		Counter5MS = 0;
		Counter15MS++;
		Flag15MS = 1;
		Control_4052();
	}
	
	if( Counter15MS >= 2 )
	{
		Counter15MS = 0;
		Counter30MS++;
		Flag30MS = 1;
	}
	
	if( Counter30MS >= 3 )
	{
		Counter30MS = 0;
		Counter90MS++;
		Flag90MS = 1;
	}
	
	if( Counter90MS >= 10 )
	{
		Counter90MS = 0;
		Flag1S = 1;
		WorkRight =~WorkRight;		
	}
}


/************************************
Name:Write_FlashProvide
Input:none
Output:none
description:provide write the flash ram
************************************/

void Write_FlashProvide(unchar operation_type)
{
	SelecEN_A15 = 0;
	SelecEN_A16 = 0;
	SelecEN_Port = 0;
/*********************************
0	Eanble_protect
1	Disanble_protec
2	Erase_flash
3	Load_flashID
4	Boot_first16K
5	Boot_last16K
#define	W29c040p1		0x5555		//写040操作1地址
#define	W29c040p2		0x2aaa		//写040操作2地址
*********************************/
	switch(operation_type)
	{
		case 0:
			XBYTE[(W29c040p1 + 0x8000)] =0xaa;
			XBYTE[(W29c040p2 + 0x8000)] =0x55;
			XBYTE[(W29c040p1 + 0x8000)] =0xa0;
			break;
		case 1:
			XBYTE[(W29c040p1 + 0x8000)] =0xaa;
			XBYTE[(W29c040p2 + 0x8000)] =0x55;
			XBYTE[(W29c040p1 + 0x8000)] =0x80;
			XBYTE[(W29c040p1 + 0x8000)] =0xaa;
			XBYTE[(W29c040p2 + 0x8000)] =0x55;
			XBYTE[(W29c040p1 + 0x8000)] =0x20;
			break;
		case 2:
			XBYTE[(W29c040p1 + 0x8000)] =0xaa;
			XBYTE[(W29c040p2 + 0x8000)] =0x55;
			XBYTE[(W29c040p1 + 0x8000)] =0x80;
			XBYTE[(W29c040p1 + 0x8000)] =0xaa;
			XBYTE[(W29c040p2 + 0x8000)] =0x55;
			XBYTE[(W29c040p1 + 0x8000)] =0x10;
			break;
		case 3:
			break;
		case 4:
			break;
		case 5:
			break;
		default:
			break;
	}
	SelecEN_Port = 1;
}

/************************************
Name:Write_FlashSecter(unint strataddr)
Input:none
Output:none
description:get the cycle time from data_len_h(secter len)
		read out the data from flash ram
		overwrite the data from new
		rewrite the data to flash ram
************************************/
void Write_FlashSecter(unint startaddr)
{	
	TR0 = 0;
	Write_FlashProvide(Disable_Protect);
	Delay_ms(20);
	Write_FlashPage();
	Write_FlashRam(startaddr);
	Delay_ms(20);
	Write_FlashProvide(Enable_Protect);
	Delay_ms(20);
	TR0 = 1;	
}
/************************************
Name:Read_FlashSecter(unint strataddr)
Input:startaddr
Output:none
description:get the cycle time from data_len_h(secter len)
		read out the data from flash ram
		send the flash ram data to flash buf
************************************/
void Read_FlashSecter(unint startaddr)
{
unchar data i;

	SelecEN_Port = 0;
	for(i=0;i<255;i++)
	{
		FlashRamTemp[i] = XBYTE[(startaddr+i+0x8000)];
	}
	FlashRamTemp[i] = XBYTE[(startaddr+i+0x8000)];
	SelecEN_Port = 1;
}
/************************************
Name:Write_FlashRam(unint strataddr)
Input:startaddr
Output:none
description:rewrite the flash buf data to flash ram
************************************/
void Write_FlashRam(unint startaddr)
{
unchar i;

	SelecEN_Port = 0;
	for(i = 0;i<255;i++)
	{
		XBYTE[(startaddr + i+0x8000)] = FlashRamTemp[i];
	}
	XBYTE[(startaddr + i+0x8000)] = FlashRamTemp[i];
	SelecEN_Port = 1;
}

/****************************************
Name:Write_FlashPage
Input: none
output:none
description:select the flash ram page addr line(a15,a16,a17,a18)
****************************************/
void Write_FlashPage(void)
{
	SelecEN_A15 = 0;
	SelecEN_A16 = 0;
}

/************************************
Name:Delay_5ms
Input:none
Output:none
description:timer delay for time on ms
************************************/
void Delay_ms(unchar counter)
{
unchar i;
unint j;
	for(i=0;i<=counter;i++)
	{
		for(j=0;j<delayms;j++)
		{}
	}
}

⌨️ 快捷键说明

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