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

📄 main.c

📁 使用51单片机开发的一个集团电话系统
💻 C
📖 第 1 页 / 共 2 页
字号:
/***********************************************************
pjname:Group phone system
author:rpj
version: V0.1
description:v0.1 only for switch system

*************************************************************/
#include "reg52.h"
#include "absacc.h"
#include "clock.h"
#include "define.h"

#include "extsystem.h"
#include "uartmodule.h"
#include "drive.h"
#include "command.h"

#include "variable.h"

main()
{
unchar data i;

programstart:
	SP = 0X60;
	Init_System();

	Delay_ms(200);
	
	while(systemreload==0)
	{

		if( Flagscan )
		{
			Flagscan = 0;
			Micro_Scan_8870();
		}
		
		if( Flag30MS )
		{
			Flag30MS = 0;
			Ext_Timer_Judge();
			for(i=0;i<TAL_EXTGroup;i++)
			{
				Read_8870ST();
				EXT_StateScan(i);
			}
		}
		
		if( Flag90MS )
		{
			Flag90MS = 0;
			WorkRight =~WorkRight;		
		}
		
		if( Flag1S )
		{
			Flag1S = 0;
			if(SetParamCounter)
			{
				SetParamCounter++;
				if(SetParamCounter>250)
				{
					SetParamCounter = 0;
					Save_System(0);
				}
			}
			if((FlagHeartSkip==1)||(FlagHeartSkip==3)||(FlagHeartSkip==9))
			{
				UartData_List[0] = 0;
				BaseDataComm(RepWorking,0);
			}
		}
		//系统收号标志检查
		Read_8870ST();
		
		if( CounterMS < 4 )
		{
			Ext_Event_Analyse();
		}
		

	}
	systemreload= 0;
	goto programstart;
}
/***************************************
flash数据存放说明,flash以256BYTE为扇区保留读取数据
所有数据为了扩展兼容,都以最大256BYTE为单元存储

用户普通零散数据存放				0x00000~0x000FF
用户会议组数据存放					0X00100~0X001FF
用户中继组数据存放					0X00200~0X002FF
用户参数组数据存放Num_H_Logic		0X01000~0X010FF
用户参数组数据存放Num_L_Logic		0X01100~0X011FF
用户参数组数据存放Num_Hot_Call		0X01200~0X012FF
用户参数组数据存放Num_Trans_Call		0X01300~0X013FF
用户参数组数据存放Num_Busy_Recall	0X01400~0X014FF
用户参数组数据存放Num_Group_Call		0X01500~0X015FF
用户参数组数据存放Trk_Group_Right	0X01600~0X016FF
用户参数组数据存放Trk_Group_Num		0X01700~0X017FF
用户参数组数据存放Trk_Group_Param	0X01800~0X018FF
用户参数组数据存放Bit_Param			0X01900~0X019FF
用户参数组数据存放Num_Troop_Call		0X01a00~0X01aFF
用户逻辑号码数据存放1000个号码	0X02000~0X220FF

用户普通零散数据存放说明
0X00000~0X00002	
数据首次读取判断说明,如果都为FF,表示
为首次启动,并进入默认设置模式,同时修改
数据为(电源启动计数)(系统保存分机字头)(系统分机长度)
0X00003~0X00005
数据为(会议组数)(中继组数)(用户数)

存储说明∶由于该系统使用的FLASH RAM相对小,只使用前32B
所以	SelecEN_A15 = 0;	SelecEN_A16 = 0;不用考虑大于32KB的空间

***************************************/
void Init_System(void)
{
unint data i,j;

	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_1ms, TimerL_1ms);
	LOAD_TIMER1(bps4800);
	TI = 0;
	RI = 0;
	TR1 = 1;
	EA = 1;
	Control_4052A = 1;
	Control_4052B = 1;
	SLEC_Point = 3;


	Init_RC_Port();
	Init_8816();

/************************
检查RAM 的数据情况
************************/
	do
	{
		j = 0;
		for(i=0;i<0x7f00;i++)
		{
			XBYTE[(i)] = 0x55;
			if(XBYTE[(i)]!=0x55)
				j++;
		}
	}while(j>0);
/******************************************/
//防止启动出现振铃,先对用户状态复位	

/************************
Init_EXT_Parma();
************************/
	for(i=0;i<255;i++)
	{
		FlashRamTemp[i] = 0xff;
	}
	Write_FlashPage();
	Read_FlashSecter(0x0000);

	
/*****check the flash,if 0000~0006 addr has write data ,then load flash data or system set****/
	if( (FlashRamTemp[0]!=0x55)||(FlashRamTemp[20]==0xaa))
	{
		Write_FlashProvide(Erase_Flash);
		Delay_ms(20);
		Def_EXT_Parma();
	}
	else
	{
		Copy_EXT_Parma();
	}


	Init_RC_Port();

/************************
Init_EXT_variable();
************************/
	for(i=0;i<TAL_EXT_PORT;i++)
	{
		Ext_Param[i].Num_Call_Other = 0xff;		//默认被叫号码是无效0xff
		Ext_Param[i].Num_Call_Me = 0xff;		//默认主叫号码是无效0xff
		Ext_Param[i].Num_Switch_Cable = 0xff;	//默认绳路号码是无效0xff
		Ext_Param[i].Num_MeetGroup = 0xff;		//默认会议组号码是无效0xff
		Ext_Param[i].Temp_Troop_Call= 0;		//默认临时群呼组号码是无效0
		Ext_Param[i].RecDTMF_Data = 0xff;		//默认8870接收号码是无效0xff
		Ext_Param[i].RecDTMF_En = MT8870_NoRec;//默认收号是有效0x10
		Ext_Param[i].Ext_EVENT = 0xff;			//默认用户事件是无效0xff
		Ext_Param[i].Ext_State = 0;				//默认用户状态是空闲0
		Ext_Param[i].Flag_Signal = 0;			//默认用户信号音是空闲0
		Ext_Timer[i].Counter_HK = 0;			//默认计数器是空闲0
		Ext_Timer[i].Counter_Signal = 0;			//默认计数器是空闲0
		Ext_Timer[i].Counter_Pause = 0;			//默认计数器是空闲0
		Ext_Timer[i].Counter_Rec_DTMF = 0;		//默认计数器是空闲0
		for(j=0;j<12;j++)
		{
			Ext_Param[i].Ext_RecDtmf_List[j] = 0;//默认收号BUF是空闲0
		}
	}

/************************
Init_HostEXT_variable();
************************/
	for(i=0;i<MAX_Ext;i++)
	{
		HostExt_Calling_List[i] = 0;
		HostExt_Called_List[i] = 0;
	}
/**********************
init system timer variable
*********************/

	FlagMS = 0;
	Flag5MS = 0;
	Flag15MS = 0;
	Flag30MS = 0;
	Flag90MS = 0;
	Flag1S = 0;
	Flagscan = 0;
	CounterMS = 0;
	Counter5MS = 0;
	Counter15MS = 0;
	Counter30MS = 0;
	Counter90MS = 0;
	Counter_Uart = 0;
	SLEC_Point = 0;
	SetParamCounter = 0;
	systemreload = 0;
	System_Modify = 0xff;
/**********************
init router variable
*********************/

	for(i=0;i<TAL_CABLE;i++)
	{
		CABLE_USE_LIST[i] = 0;
	}
	CABLE_USE = 0;
	CABLE_USE_NOW = 0;
	
/**********************
init event variable
*********************/

	for(i=0;i<BufSize;i++)
	{
		EXT_EVENT_QUEUE[i] = 0;
	}
	WP_EVENT = 0;
	RP_EVENT = 0;
	TAL_EVENT = 0;

/**********************
init uart variable
*********************/
	for(i=0;i<AlignSize;i++)
	{
		UartSend_List[i] = 0;
		UartRec_List[i] = 0;
		UartData_List[i] = 0;
	}
	WP_UartRec = 0;
	WP_UartSend = 0;
	RP_UartRec = 0;
	RP_UartSend = 0;
	TAL_UartRec = 0;
	TAL_UartSend = 0;
	WP_UartData = 0;
	TAL_UartData = 0;
	DataHeadRec = 0;
	DataType = 0;
	
/**********************
init temp meet group variable
*********************/
	for(i=0;i<TAL_CABLE;i++)
	{
		Temp_MeetGroup[i].MeetGroup = 0xff;
		Temp_MeetGroup[i].Manager_Ext = 0xff;
		Temp_MeetGroup[i].Num_Member = 0;
		Temp_MeetGroup[i].Meetstate = 0;
		for(j=0;j<TAL_EXT_PORT;j++)
		{
			Temp_MeetGroup[i].Meet_Member[j] = 0xff;
		}
	}

	FlagHeartSkip = 2;

	TR0 = 1;				//初始化开关状态

}

/*****************************
name:Copy_EXT_Parma(void)
input:/
output:/
description:
将在FLASH中的所有系统数据全部
复制到现在的RAM中
*****************************/
void	Copy_EXT_Parma(void)
{
unchar	data i,m;
unint	xdata j;


	Write_FlashPage();
	Read_FlashSecter(0x0000);

	EXT_Head = FlashRamTemp[1];
	EXT_Len = 3;//FlashRamTemp[2];//直接定义死长度是3
	Host_Head = FlashRamTemp[3];
	TAL_EXT_PORT = FlashRamTemp[4];
	TAL_MeetGroup = FlashRamTemp[5];
	TAL_TrkGroup = FlashRamTemp[6];
	TAL_TroopGroup = FlashRamTemp[7];
	Hot_Len = FlashRamTemp[8];
	Host_Ext = FlashRamTemp[9];
	First_Meet_Head = FlashRamTemp[10];
	First_Troop_Head = FlashRamTemp[11];
	FlagSystemType = FlashRamTemp[12];
	
	FlagHeartSkip = FlashRamTemp[21];
	NoFreeFlag = FlashRamTemp[22];
	NoFreeCounter = FlashRamTemp[23];
	FlashRamTemp[23]++;
	Password1 = FlashRamTemp[24];
	if(Password1>9)
		Password1 = Fun_Head;
	Password2 = FlashRamTemp[25];
	if(Password2>9)
		Password2 = Fun_End;
	Password3 = FlashRamTemp[26];
	if(Password3>9)
		Password3 = Fun_Head;

	
	TAL_EXTGroup = TAL_EXT_PORT/8;
	if( TAL_EXT_PORT % 8 )
	{
		TAL_EXTGroup++;
	}
	Write_FlashPage();
	Write_FlashSecter(0x0000);
	
/**********************************************************/
/*系统组参数表拷贝,地址从0100h开始*/
/**********************************************************/
	
	Write_FlashPage();
	Read_FlashSecter(0x0100);
	for(i=0;i<7;i++)//会议组最大7组
	{
		j = i*36; 
		Meet_Group[i].MeetLen = FlashRamTemp[j++];
		Meet_Group[i].MeetHead = FlashRamTemp[j++];
		Meet_Group[i].Meetstate = FlashRamTemp[j++];
		Meet_Group[i].Num_Member = FlashRamTemp[j++];
		for(m=0;m<MAX_Ext;m++)
		{
			Meet_Group[i].Meet_Member[m] = FlashRamTemp[j++];
		}
	}
/*
	Write_FlashPage();
	Read_FlashSecter(0x0200);
	for(i=0;i<7;i++)//中继组最大7组
	{
		j = i*36; 
		Trk_Group[i].TrkLen = FlashRamTemp[j++];
		Trk_Group[i].TrkHead = FlashRamTemp[j++];
		Trk_Group[i].Num_Member = FlashRamTemp[j++];
		Trk_Group[i].Num_Use = FlashRamTemp[j++];
		for(m=0;m<MAX_Ext;m++)
		{
			Trk_Group[i].Trk_Member[m] = FlashRamTemp[j++];
		}
	}
*/	
	Write_FlashPage();
	Read_FlashSecter(0x0300);
	for(i=0;i<7;i++)//群呼组最大7组
	{
		j = i*37; 
		Troop_Param[i].TroopLen= FlashRamTemp[j++];
		Troop_Param[i].TroopHead= FlashRamTemp[j++];
		Troop_Param[i].Num_Member = FlashRamTemp[j++];
		Troop_Param[i].TroopType= FlashRamTemp[j++];
		Troop_Param[i].Troopstate= FlashRamTemp[j++];
		for(m=0;m<MAX_Ext;m++)
		{
			Troop_Param[i].Troop_Member[m] = FlashRamTemp[j++];
		}
	}
	
/**********************************************************/
/*用户的物理参数表拷贝,地址从1000h开始*/
/**********************************************************/

	Write_FlashPage();
	Read_FlashSecter(0x1000);
	for(i=0;i<TAL_EXT_PORT;i++)
	{
		Ext_Param[i].Num_H_Logic = FlashRamTemp[i];
	}

	Write_FlashPage();
	Read_FlashSecter(0x1100);
	for(i=0;i<TAL_EXT_PORT;i++)
	{
		Ext_Param[i].Num_L_Logic = FlashRamTemp[i];
	}
	
	Write_FlashPage();
	Read_FlashSecter(0x1200);
	for(i=0;i<TAL_EXT_PORT;i++)
	{
		Ext_Param[i].Num_Hot_Call = FlashRamTemp[i];
	}

	Write_FlashPage();
	Read_FlashSecter(0x1300);
	for(i=0;i<TAL_EXT_PORT;i++)
	{
		Ext_Param[i].Num_Trans_Call = FlashRamTemp[i];
	}

	Write_FlashPage();
	Read_FlashSecter(0x1400);
	for(i=0;i<TAL_EXT_PORT;i++)
	{
		Ext_Param[i].Num_Busy_Recall = FlashRamTemp[i];
	}

	Write_FlashPage();
	Read_FlashSecter(0x1500);
	for(i=0;i<TAL_EXT_PORT;i++)
	{
		Ext_Param[i].Num_Group_Call = FlashRamTemp[i];
	}

	Write_FlashPage();
	Read_FlashSecter(0x1600);
	for(i=0;i<TAL_EXT_PORT;i++)
	{
		Ext_Param[i].Trk_Group_Right = FlashRamTemp[i];
	}

	Write_FlashPage();
	Read_FlashSecter(0x1700);
	for(i=0;i<TAL_EXT_PORT;i++)
	{
		Ext_Param[i].Trk_Group_Num = FlashRamTemp[i];
	}

	Write_FlashPage();
	Read_FlashSecter(0x1800);
	for(i=0;i<TAL_EXT_PORT;i++)
	{
		Ext_Param[i].Trk_Group_Param = FlashRamTemp[i];
	}

	Write_FlashPage();
	Read_FlashSecter(0x1900);
	for(i=0;i<TAL_EXT_PORT;i++)
	{
		Ext_Param[i].Bit_Param = FlashRamTemp[i];
	}

	Write_FlashPage();
	Read_FlashSecter(0x1a00);
	for(i=0;i<TAL_EXT_PORT;i++)
	{
		Ext_Param[i].Num_Troop_Call= FlashRamTemp[i];
	}
	
/**********************************************************/
/*1000个用户的逻辑号码表拷贝,地址从2000h开始*/
/**********************************************************/
	Write_FlashPage();
	Read_FlashSecter(0x2000);
	j = 0;
	for(i=0;i<255;i++)
	{
		EXT_Number_List[j++] = FlashRamTemp[i];
	}
		EXT_Number_List[j++] = FlashRamTemp[i];
		
	Write_FlashPage();
	Read_FlashSecter(0x2100);
	for(i=0;i<255;i++)
	{
		EXT_Number_List[j++] = FlashRamTemp[i];
	}
		EXT_Number_List[j++] = FlashRamTemp[i];
		
	Write_FlashPage();
	Read_FlashSecter(0x2200);
	for(i=0;i<255;i++)
	{
		EXT_Number_List[j++] = FlashRamTemp[i];
	}
		EXT_Number_List[j++] = FlashRamTemp[i];
		
	Write_FlashPage();
	Read_FlashSecter(0x2300);

⌨️ 快捷键说明

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