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

📄 c_main.c

📁 这是电信语音聊天设备的源码
💻 C
字号:
/************系统主程序********/

#pragma CODE DEBUG SYMBOLS OBJECTEXTEND
#include <reg51.h>
#include <absacc.h>
#include "Const.h"
#include "chat.h"

extern mfc_read();//MFC读
extern mfc_test100();//100毫秒MFC测试
extern i_mfc();//MFC初始化
extern mfc_init();//MFC变量初始化

extern dtmf_test100();//100毫秒DTMF测试
extern dtmf_init();//DTMF变量初始化

extern audio_scan_50ms();//定时检测放音是否结束
extern audio_manage_100ms();//定时检测是否应该放音

extern trk_out_ctrl();//数字中继线路信令处理
extern trk_in_ctrl();//数字中继用户呼入处理程序

extern user_e1_init();//数字中继用户初始化
extern chat_common_init();//公共聊天室初始化
extern chat_private_init();//私聊初始化

extern clear_DS21554();//DS21554寄存器清零
extern init_DS21554();//初始化DS21554

extern i_net();//初始化为无音
extern connect(unsigned char in_slot,unsigned char o_slot);//用于连接两个时隙
extern no_sound(unsigned char o_slot);//无音处理

extern command(unsigned char x,unsigned char y,unsigned char z,unsigned char i,unsigned char j,unsigned char k,unsigned char l,unsigned char m,
			   unsigned char n,unsigned char o,unsigned char p,unsigned char q,unsigned char r,unsigned char s,unsigned char t,unsigned char u);

extern void init_back();
extern void yukong_init();

extern decode_hdlc_frame();//解祯子程序

void interface_init()//专线成员接口初始化
{
	unsigned char xdata buf;
	unsigned char xdata i,j;
	audio_dtmf_count = 0;
	yukong_count = 0;
	for(i = 0;i < 12;i++)
	{
		buf = XBYTE[0xd000 + (i << 8) + BOARD_INFO] & 0x0f;
		if(buf == 8)//语控板
		{
			command(3,BOARD_YUKONG,i,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE);
			for(j = 0;j < 8;j++)
			{
				yukong_count++;
				yukong_resource[i * 8 + j].addr =  0xd001 + (i << 8);//语控单元地址
				yukong_resource[i * 8 + j].flag = LEISURE;
				if(i < 8)
				{
					yukong_resource[i * 8 + j].slot = (0x80 + i * 8 + j) & 0xbf;//提示音单元时隙(Hw4、Hw5)				
				}
				else if(i < 12)
				{
					yukong_resource[i * 8 + j].slot = (0x60 + ((i - 8) & 3) * 8 + j) & 0x7f;//提示音单元时隙(Hw3)
				}	
			}
			command(8,2,yukong_count,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE);
		}
		else if(buf == 7)//语音和收号器板
		{
			command(3,BOARD_AUDIO,i,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE);
			for(j = 0;j < 8;j++)
			{
				audio_dtmf_count++;
				audio_dtmf_resource[i * 8 + j].addr = 0xd000 + (i << 8);//提示音单元地址
				audio_dtmf_resource[i * 8 + j].flag = LEISURE;
				if(i < 8)
				{
					audio_dtmf_resource[i * 8 + j].slot = (0x80 + i * 8 + j) & 0xbf;//提示音单元时隙(Hw4、Hw5)				
				}
				else if(i < 12)
				{
					audio_dtmf_resource[i * 8 + j].slot = (0x60 + ((i - 8) & 3) * 8 + j) & 0x7f;//提示音单元时隙(Hw3)
				}
			}
			command(8,1,audio_dtmf_count,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE);
		}
		else//没有接任何板子
		{
			command(3,BOARD_NONE,i,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE);
		}
	}
	command(8,0,mfc_count,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE);
}

void i_comm()//通信初始化
{
	for(sdbt = 0;sdbt < BUF_LEN;sdbt++)
	{
		sdbuf[sdbt] = IDLE;//发送缓冲区
		rvbuf[sdbt] = IDLE;//接收缓冲区
	}
	sdbh = 0;//发送头指针
	sdbt = 0;//发送尾指针
	rvbt = 0;//接收头指针
	rvbh = 0;//接收尾指针
}

void hdlc_init()//HDLC初始化
{
	unsigned char xdata i;
	for(i = 0;i < 150;i++)//发送缓冲区
	{
		send_frame[i] = IDLE;
	}
	nr = 0;
	ns = 0;
	vs = 0;
	vr = 0;
	send_data_start = 0;
	send_data_length = 0;
	send_inf_flag = 0;
	send_ctrl_byte = 0;
	send_77_count = 0;
	rv_start = 0;
	rv_end = 0;
	rv_ctrl_byte = 0;
	rv_state = 0;
	rv_err = 0;
	decode_flag = 0;
}

void sig_req(unsigned char sig_type,unsigned char d_port)//插入信令处理
{
	if((d_port & 0x0f) == 0)
	{
		return;
	}
	if(d_port < 64)
	{
		if(d_port < 32)
		{
			if(d_port < 16)
			{
				d_port &= 0x0f;
				user_e1[d_port].forward_signal = (sig_type << 4) | (user_e1[d_port].forward_signal & 0x0f);
				XBYTE[DS21554_ADDR[0] + TS1 + d_port] = user_e1[d_port].forward_signal;
			}
			else
			{
				d_port &= 0x0f;
				user_e1[d_port + 16].forward_signal = (sig_type & 0x0f) | (user_e1[d_port + 16].forward_signal & 0xf0);
				XBYTE[DS21554_ADDR[0] + TS1 + d_port] = user_e1[d_port + 16].forward_signal;
			}
		}
		else
		{
			if((d_port & 0x1f) < 16)
			{
				d_port &= 0x0f;
				user_e1[d_port + 32].forward_signal = (sig_type << 4) | (user_e1[d_port + 32].forward_signal & 0x0f);
				XBYTE[DS21554_ADDR[1] + TS1 + d_port] = user_e1[d_port + 32].forward_signal;
			}
			else
			{
				d_port &= 0x0f;
				user_e1[d_port + 48].forward_signal = (sig_type & 0x0f) | (user_e1[d_port + 48].forward_signal & 0xf0);
				XBYTE[DS21554_ADDR[1] + TS1 + d_port] = user_e1[d_port + 48].forward_signal;
			}
		}
	}
	else
	{
		if(d_port < 96)
		{
			if((d_port & 0x1f) < 16)
			{
				d_port &= 0x0f;
				user_e1[d_port + 64].forward_signal = (sig_type << 4) | (user_e1[d_port + 64].forward_signal & 0x0f);
				XBYTE[DS21554_ADDR[2] + TS1 + d_port] = user_e1[d_port + 64].forward_signal;
			}
			else
			{
				d_port &= 0x0f;
				user_e1[d_port + 80].forward_signal = (sig_type & 0x0f) | (user_e1[d_port + 80].forward_signal & 0xf0);
				XBYTE[DS21554_ADDR[2] + TS1 + d_port] = user_e1[d_port + 80].forward_signal;
			}
		}
		else
		{
			if((d_port & 0x1f) < 16)
			{
				d_port &= 0x0f;
				user_e1[d_port + 96].forward_signal = (sig_type << 4) | (user_e1[d_port + 96].forward_signal & 0x0f);
				XBYTE[DS21554_ADDR[3] + TS1 + d_port] = user_e1[d_port + 96].forward_signal;
			}
			else
			{
				d_port &= 0x0f;
				user_e1[d_port + 112].forward_signal = (sig_type & 0x0f) | (user_e1[d_port + 112].forward_signal & 0xf0);
				XBYTE[DS21554_ADDR[3] + TS1 + d_port] = user_e1[d_port + 112].forward_signal;
			}
		}
	}
}

void read_signalling()//读取线路信令
{
	unsigned char xdata l,buf;
	for(l = 1;l < 16;l++)
	{
		buf = XBYTE[DS21554_ADDR[0] + RS1 + l];
		//第一片DS21554的线路信号
		user_e1[l + 16].backward_signal = buf & 0x0f;
		//对应TS17,18,。。。。
		user_e1[l].backward_signal = buf >> 4;
		//对应TS1,2,。。。。
		buf = XBYTE[DS21554_ADDR[1] + RS1 + l];
		//第二片DS21554的线路信号
		user_e1[l + 48].backward_signal = buf & 0x0f;
		//对应TS17,18,。。。。
		user_e1[l + 32].backward_signal = buf >> 4;
		//对应TS1,2,。。。。
		buf = XBYTE[DS21554_ADDR[2] + RS1 + l];
		//第三片DS21554的线路信号
		user_e1[l + 80].backward_signal = buf & 0x0f;
		//对应TS17,18,。。。。
		user_e1[l + 64].backward_signal = buf >> 4;
		//对应TS1,2,。。。。
		buf = XBYTE[DS21554_ADDR[3] + RS1 + l];
		//第四片DS21554的线路信号
		user_e1[l + 112].backward_signal = buf & 0x0f;
		//对应TS17,18,。。。。
		user_e1[l + 96].backward_signal = buf >> 4;
		//对应TS1,2,。。。。
	}
}

void read_warn()//读取告警信息 
{
	unsigned char xdata buf,i;
	for(i = 0;i < 4;i++)
	{
		buf = XBYTE[DS21554_ADDR[i] + SSR];
		if((buf & 0x04) == 0x04)//帧失步
		{
			command(2,0,2,i,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE);
			trk_e1_led = trk_e1_led | (1 << (4 + i));
			if((time_route == i) && time_flag)
			{
				MS_MT9041 = 1;
				REF_LED = 1;
			}
		}
		else if((buf & 0x02) == 0x02)		//复帧失步
		{
			command(2,0,3,i,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE);
			trk_e1_led = trk_e1_led | (1 << (4 + i));
			if((time_route == i) && time_flag)
			{
				MS_MT9041 = 1;
				REF_LED = 1;
			}
		}
		else
		{
			command(2,0,0,i,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE);
			trk_e1_led = trk_e1_led & (~(1 << (4 + i)));
			if((time_route == i) && time_flag)
			{
				MS_MT9041 = 0;
				REF_LED = 0;
			}
		}
	}
	XBYTE[LED_E1_ADDR] = trk_e1_led;
}

void read_warn_1s()//读取告警信息
{
	unsigned char xdata buf,i;
	for(i = 0;i < 4;i++)
	{
		buf = XBYTE[DS21554_ADDR[i] + SSR];
		if((buf & 0x04) == 0x04)		//帧失步
		{
			trk_e1_led = trk_e1_led | (1 << (4 + i));
			if((time_route == i) && time_flag)
			{
				MS_MT9041 = 1;
				REF_LED = 1;
			}
		}
		else if((buf & 0x02) == 0x02)	//复帧失步
		{
			trk_e1_led = trk_e1_led | (1 << (4 + i));
			if((time_route == i) && time_flag)
			{
				MS_MT9041 = 1;
				REF_LED = 1;
			}
		}
		else
		{
			trk_e1_led = trk_e1_led & (~(1 << (4 + i)));
			if((time_route == i) && time_flag)
			{
				MS_MT9041 = 0;
				REF_LED = 0;
			}
		}
	}
	XBYTE[LED_E1_ADDR] = trk_e1_led;
}

void noise_ctrl()//MT8924时隙音处理
{
	unsigned char xdata i;
	for (i = 0; i < 32; i++)
	{
		XBYTE[M_NET1] = i;
		XBYTE[M_NET2] = 0x83;
	}
}

void delay_time(unsigned int subtime)
{
	unsigned int i;
	while(subtime)
	{
		subtime--;
		i = (subtime * 2) / 2;
	}
}
void val_init()
{
	unsigned char xdata temp;
	XBYTE[M_NET2] = 0x15;
	no_sound(0xcb);
	MS_MT9041 = 1;
	rv0_flag = 0;
	trk_e1_led = 0xf3;
	trk = 0;
	tone_set = 0x97;
	send_count = 0;
	time_route = 0;
	time_flag = 1;
	time_counter = 0;
	second = 0;
	t50_flag = 0;
	t100_flag = 0;
	voltage_low_flag = 0;
	ID_num_length = 0;
	for(temp = 0;temp < 16;temp++)
	{
		p_data[temp] = IDLE;
		id_call[temp] = IDLE;
	}
	iii = 0;
	for(temp = 0;temp < TRK_MAX;temp++)
	{
		sys_temp[temp] = IDLE;
	}
}
watchdag() interrupt 0 using 0
{
	//	goto LOOP;
}

time_0() interrupt 1 using 1
{
	TH0 = -(50000 / 256);
	TL0 = -(50000 % 256);
	t50_flag = 1;
}
voltage_low() interrupt 2 using 2
{
	voltage_low_flag = 1;
}
serial() interrupt 4 using 3//串口接收和发送
{
	unsigned char idata temp;
	EA = 0;
	if(TI)
	{
		TI = 0;
		if(send_data_start < send_data_length)
		{
			SBUF = send_frame[send_data_start];
			send_data_start++;
		}
		else
		{
			send_count = 1;
		}
	}
	if(RI)
	{
		rvbuf[rvbh] = temp = SBUF;
		RI = 0;
		switch(rv_state)
		{
			case 0:
			{
				if(temp == 0x7e)
				{
					rv_state = 1;
				}
			}
			break;
			case 1:
			{
				if(temp = 0x7e)
				{
					rv_state = 2;
				}
				else
				{
					rv_state = 0;
				}
			}
			break;
			case 2:
			{
				rv_ctrl_byte = temp;
				if((rv_ctrl_byte & 1) == 0)
				{
					rv_start = rvbh;
					rv_state = 3;
				}
				else
				{
					rv_state = 5;
				}
			}
			break;
			case 3:
			{
				if(temp == 0x77)
				{
					rv_state = 4;
				}
				else
				{
					rv0_flag = 0;
				}
			}
			break;
			case 4:
			{
				if(temp == 0x77)
				{
					decode_flag = 1;
					if(rv0_flag)
					{
						rv_end = (rvbh - 3) & 0x7ff;
					}
					else
					{
						rv_end = (rvbh - 2) & 0x7ff;
					}
					rv_state = 0;
				}
				else if(temp == 0)
				{
					rv0_flag = 1;
					rv_state = 3;
				}
				else
				{
					rv_err = 1;
					rv_state = 3;
				}
			}
			break;
			case 5:
			{
				if(temp != rv_ctrl_byte)
				{
					rv_err = 1;
				}
				rv_state = 6;
			}
			break;
			case 6:
			{
				if(temp == 0x77)
				{
					rv_state = 7;
				}
			}
			break;
			case 7:
			{
				if(temp == 0x77)
				{
					decode_flag = 1;
					rv_state = 0;
				}
				else
				{
					rv_state = 6;
				}
			}
			break;
			default:
			{
				rv_state = 0;
			}
			break;
		}
		rvbh = (rvbh + 1) & 0x7ff;
	}
	EA = 1;
}

main()
{
	unsigned char xdata temp;
	LED = 1;
	EA = 0;
	IP = 0x10;
	SCON = 0x50;
	PCON = PCON | 0x80;
	TMOD = 0x21;
	TH0 = -(50000 / 256);
	TL0 = -(50000 % 256);

#ifdef ICD51_MODE
	PCON = PCON & 0x7f;
	TH1 = 0xfa;
	TL1 = 0xfa;		
#else
	PCON = PCON | 0x80;
	TH1 = 0xf3;
	TL1 = 0xf3;
#endif
	TCON = 0x50;
	IE = 0x12;
	LED = 0;
	val_init();
	init_back();
	i_comm();     //通信初始化
	i_net();      //初始化为无音
	hdlc_init();  //HDLC初始化
	user_e1_init();//数字中继用户初始化
	noise_ctrl();
	chat_common_init();
	chat_private_init();
	dtmf_init();
	yukong_init();
	interface_init();//系统自检
	clear_DS21554(); 
	i_mfc();
	mfc_init();
	EA = 1;
	init_DS21554();
	delay_time(200);
	WDI = !WDI;
	IE = 0x97;
	while(1)
	{
		if(voltage_low_flag)//电压过低检测
		{
			voltage_low_flag = 0;
			command(2,1,1,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE);
		}
		if(time_counter >= 20)//1秒时间检测
		{
			second++;
			time_counter = time_counter - 20;
			read_warn_1s();
			if(second >= 60)
			{
				read_warn();
				second = 0;
			}
		}
		EA = 0;
		if(t50_flag)
		{
			EA = 1;
			time_counter++;
			t50_flag = 0;
			LED = !LED;
			read_signalling();
			mfc_read();
			trk_out_ctrl();
			trk_in_ctrl();
			audio_scan_50ms();
			if(t100_flag)
			{
				t100_flag = 0;
				WDI = !WDI;
				mfc_test100();
				dtmf_test100();
				audio_manage_100ms();
			}
			else
			{
				t100_flag = 1;
				if(decode_flag)
				{
					decode_flag = 0;
					decode_hdlc_frame();
					send_count = 0;
					SBUF = send_frame[send_data_start];
					send_data_start++;
				}
			}
		}
		EA = 1;
	}
}

⌨️ 快捷键说明

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