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

📄 test.c

📁 单片机程序代码,经过很详细的测试.呵呵,硬件相关.
💻 C
📖 第 1 页 / 共 5 页
字号:
/*------------------------------------------------------------------------------
TEST.C:  ISD51 Demo for classic 8051 devices like Philips 89C51RD2/89C66x

Copyright 2002 Keil Software, Inc.
------------------------------------------------------------------------------*/

//#include <REG51F.H>
#include <REG54.H>
#include <intrins.h>
#include <absacc.h>
#include <stdio.h>
#include "ISD51.h"

#include "ep1k50.h"
#include "rc7820.h"
#include "rc7860.h"
#include "f2rc7820.h"
#include "f2rc7860.h"
#include "cmd_para_save.h"
#define Uchar	unsigned char

extern void init_7820(void);
extern void init_7860(void);
extern void se0111_reg_wr(unsigned char Haddr,unsigned char Laddr,unsigned char value,unsigned char slot);
extern unsigned char se0111_reg_rd(unsigned char Haddr,unsigned char Laddr,unsigned char slot);
extern void init_se0111(unsigned char slot);
extern void init_1k50(void);
extern void f2_rc7820(void);
extern unsigned char f2rc7820_rd(unsigned char f2addr) large reentrant;
extern void f2rc7820_wr(unsigned char f2addr,unsigned char value) large reentrant;
extern void f2_rc7860(void);
extern unsigned char f2rc7860_rd(unsigned int f2addr) large reentrant;
extern void f2rc7860_wr(unsigned int f2addr,unsigned char value) large reentrant;
extern void reset_f2rc7860(void);

extern Uchar ScanResRdyTbl();
extern void SetResRdyTbl(Uchar prio) large reentrant;
extern void ClearResRdyTbl(Uchar prio);
extern Uchar GetResRdyTbl(Uchar prio) large reentrant;

extern Uchar ScanMcpRdyTbl();
extern void SetMcpRdyTbl(Uchar prio);
extern void ClearMcpRdyTbl(Uchar prio);
extern Uchar GetMcpRdyTbl(Uchar prio);

extern Uchar ScanExtRdyTbl();
extern void SetExtRdyTbl(Uchar prio) large reentrant;
extern void ClearExtRdyTbl(Uchar prio);
extern Uchar GetExtRdyTbl(Uchar prio);

struct cmd_para_save xdata cmd_para_save;
Uchar xdata clock_prior_table[8];					//'c12'配置时钟优先级


extern unsigned char timeslot_setup(struct cmd_para_save *timeslot_set);
extern unsigned char timeslot_del(struct cmd_para_save *timeslot_del);
extern unsigned char get_port_lpstat(struct cmd_para_save *get_portloop);
extern unsigned char set_port_loopback(struct cmd_para_save *set_portloop);
extern unsigned char set_clock_source(struct cmd_para_save *set_clock);
extern unsigned char set_clock_mode(struct cmd_para_save *set_clock);
extern unsigned char set_clock_prio(struct cmd_para_save *set_clock);
extern unsigned char get_clock_working(void);
extern unsigned char get_clock_stat(struct cmd_para_save *get_clock);
extern void get_clk_prio(unsigned char clksource);
extern void clk_switch(void);
extern void check_switch_clk(void);
extern void clk_check_frequence(void);
extern unsigned char get_board_type(struct cmd_para_save *get_board);
extern unsigned char get_board_state(struct cmd_para_save *get_board);
extern unsigned char set_overhead_value(struct cmd_para_save *set_overhead);
extern unsigned char get_overhead_value(struct cmd_para_save *get_overhead);
extern unsigned char get_overheadj_value(struct cmd_para_save *get_overheadj);
extern unsigned char set_overheadj_value(struct cmd_para_save *set_overheadj);
extern unsigned char get_path_switch(struct cmd_para_save *path_switch);
extern unsigned char set_path_switch(struct cmd_para_save *path_switch);
extern unsigned char run_path_switch(struct cmd_para_save *path_switch);
extern unsigned char get_path_state(struct cmd_para_save *path_switch);
extern void path_switch_recover(void);
extern unsigned char check_initializers(void);
extern unsigned char down_file_over(void);
extern unsigned char close_int0(void);
extern void get_performance(void);
extern unsigned char clear_all_performance(void);
extern unsigned char clear_one_perf_15min(struct cmd_para_save *set_performance);
extern unsigned char clear_one_performance(struct cmd_para_save *set_performance);
extern void get_15min_performance(void);
extern unsigned char get_work_performance(struct cmd_para_save *set_performance);
extern unsigned char set_max_performance(struct cmd_para_save *set_performance);
extern void get_alarm_value(void);
extern unsigned char alarm_led(struct cmd_para_save *set_alarm_led);
extern void initializers_board(void);
extern unsigned char initializers_one_board(struct cmd_para_save *init_one_board);
extern void reply_mcp_command(unsigned long codeid,unsigned char returnvalue);
extern void report_port_lpstat(unsigned char lp_state);
extern void report_clock_working(unsigned char clksource);
extern void report_clock_stat(unsigned char clk_state);
extern void report_board_type(unsigned char value);
extern void report_board_state(unsigned char value);
extern void report_overhead_value(unsigned char value,unsigned char overhead_value);
extern void report_overheadj_value(unsigned char value);
extern void report_path_switch_table(unsigned char value,unsigned char bboard,unsigned char bport,unsigned char btime);
extern void report_path_stat(unsigned char value,unsigned char board,unsigned port);
extern void report_15min_performance(void);
extern void report_1sec_performance(void);
extern void report_alarm(void);
extern void report_initializers_2M1(void);
extern void report_initializers_2M2(void);
extern void report_initializers_2M3(void);
extern void report_initializers_OTB(void);
extern void report_loss_2M1(void);
extern void report_loss_2M2(void);
extern void report_loss_2M3(void);
extern void report_loss_OTB(void);
extern void report_auto_path_switch(unsigned char path_port);
extern report_work_performance(unsigned char value);
//extern void write_ais_rate(void);
extern unsigned char set_timeslot_num(struct cmd_para_save *timeslot_num);
extern unsigned char get_timeslot_num(struct cmd_para_save *timeslot_num);
extern void report_EOS_num(unsigned char time_num);
extern unsigned char reset_EOS(struct cmd_para_save *reset_EOS);
extern unsigned char set_EOS_address(struct cmd_para_save *set_EOS_address);
extern unsigned char get_EOS_address(struct cmd_para_save *get_EOS_address);
extern void report_EOS_address(unsigned char value);
extern unsigned char set_search_location(struct cmd_para_save *set_EOS_search);
extern unsigned char get_search_location(struct cmd_para_save *get_EOS_search);
extern void report_search_location(unsigned char value);
extern unsigned char set_EOS_work_state(struct cmd_para_save *set_EOS_work);
extern unsigned char get_EOS_work_state(struct cmd_para_save *get_EOS_work);
extern void report_EOS_work_state(unsigned char value);

extern void read_soft_version(void);
extern void report_soft_version(void);
extern void read_hard_version(void);
extern void report_hard_version(void);

extern unsigned char se0121_reg_rd(unsigned char Laddr,unsigned char slot);
extern void se0121_reg_wr(unsigned char Laddr,unsigned char value,unsigned char slot);
extern void init_se0121(unsigned char slot);

unsigned long int xdata commandid = 0;                              //表示命令代码的变量
unsigned char xdata result;
extern unsigned char xdata overhead_value;
extern unsigned char xdata marray[189];
extern unsigned char xdata barray[189];
extern unsigned char xdata warray[63];
extern unsigned char xdata bboardid;
extern unsigned char xdata bportid;
extern unsigned char xdata btimeid;
extern unsigned char xdata mboardid;
extern unsigned char xdata mportid;

extern unsigned char xdata clksource_reg;
extern unsigned char xdata clkarray_flg;
extern unsigned char xdata clk_source;
extern unsigned char xdata clk_prio;
extern unsigned char xdata clkmode_reg;
extern unsigned char xdata check_alarm_mcb[5];
extern void path_switch_mcba(void) large reentrant ;
extern void path_switch_mcbb(void) large reentrant ;
extern void path_switch_otba(void) large reentrant ;
extern void path_switch_otbb(void) large reentrant ;
extern void path_switch_mcba_tu(void) large reentrant ;
extern void path_switch_mcbb_tu(void) large reentrant ;
extern void path_switch_otba_tu(void) large reentrant ;
extern void path_switch_otbb_tu(void) large reentrant ;

unsigned char xdata intflg_MCBA = 0;							//为性能值而设的MCB的A口中断标志位
unsigned char xdata intflg_MCBB = 0;							//为性能值而设的MCB的B口中断标志位
unsigned char xdata intflg_OTBA = 0;							//为性能值而设的OTB的A口中断标志位
unsigned char xdata intflg_OTBB = 0;							//为性能值而设的OTB的B口中断标志位
extern unsigned char xdata min15_flg;							//每秒定时标志位
extern unsigned char xdata start_flg[4];
extern unsigned char xdata start_flg_EOS[4];
extern unsigned char xdata init_recover[4];
extern unsigned char xdata auto_path_port;
extern unsigned char xdata j_tx[15];
extern unsigned char xdata clk_check_flg[2];

extern unsigned char read_register(struct cmd_para_save *read_reg);
extern void report_regiester_value(unsigned char value);
extern unsigned char write_register(struct cmd_para_save *write_reg);
extern void report_variable_value(void);
extern void read_port_reg(unsigned char read_port);
extern void report_read_port(void);
extern void read_ais_reg(void);
extern void report_ais_reg(unsigned char read_port);
unsigned char xdata read_port;
extern unsigned char xdata board_type[4][2];	//定义插盘类型数组,第一位表示槽号,第二位表示盘号

unsigned char int_sum[8] = {0,0,0,0,0,0,0,0};

unsigned char ais_reg[4][8];
unsigned char inter_reg[4][4];
unsigned char los_reg[4] = {0,0,0,0};
unsigned char xdata test_reg[24] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
unsigned char xdata init_temp = 0;		//初始化完成标志位(即C82命令完成)

#define RX_BUF_SIZE		50
#define RX_BUF_NUM		2
#define TX_BUF_SIZE		140
Uchar xdata rx_buf[RX_BUF_NUM][RX_BUF_SIZE],tx_buf[TX_BUF_SIZE];
Uchar xdata rx_buf_pointer[RX_BUF_NUM]={0,0},tx_buf_pointer=0,rx_buf_num=0;
Uchar xdata save_cmd_enable[RX_BUF_NUM]={0,0},rx_buf_overflow[RX_BUF_NUM]={0,0};
Uchar xdata cmd_head[RX_BUF_NUM]={0,0},cmd_length[RX_BUF_NUM]={0,0};
bit tx_done=0;


void delay(void){
long xdata i;
	for(i=0;i<8000;i++);
}

sbit P3_4 = P3^4;
sbit P1_0 = P1^0;
sbit P1_7 = P1^7; 

unsigned char xdata time;
unsigned char xdata time1;
unsigned char xdata time2;
unsigned char xdata time3;

/****************************************************************************************/
void service_int0(void) interrupt 0 using 1{
volatile unsigned char int_reg;
volatile unsigned char f2int_reg;
unsigned char i;
volatile unsigned char temp,temp1,temp2;
	
	int_reg = Int_vec;						//取出中断矢量寄存器的值
	f2int_reg = f2rc7860_rd(F2Int_vec);
	Int_mask = 0x80;						//设置屏蔽
	for (i = 0; i <= 3; i++){				//取出4个光口的中断寄存器值
		inter_reg[0][i] = XBYTE[i + 0x88B5];
		inter_reg[1][i] = XBYTE[i + 0x8AB5];
		if (start_flg[0] == 0){
			inter_reg[2][i] = f2rc7860_rd(i + 0x00B5);
			inter_reg[3][i] = f2rc7860_rd(i + 0x02B5);
		}
	}
	for (i = 0; i <= 7; i++){				//取出63个时隙的AIS寄存器值
		ais_reg[0][i] = XBYTE[i + 0x88A6];
		ais_reg[1][i] = XBYTE[i + 0x8AA6];
		if (start_flg[0] == 0){
			ais_reg[2][i] = f2rc7860_rd(i + 0x00A6);
			ais_reg[3][i] = f2rc7860_rd(i + 0x02A6);
		}
	}

//	test_reg[0] += 1;						//中断响应次数计数
//	temp1 = int_reg & 0x10;					//取出A光口中AIS的中断值
//	if (int_reg){
//		test_reg[1] += 1;					//中断向量不为零的计数
//	}
//	if (temp1){ 
//		test_reg[2] += 1;					//中断向量中A光口出现AIS的中断计数
//	}

	temp = int_reg & 0xF0;					//取出A光口中断值
	if (temp){								//判断A光口有中断信号
		for (i = 0; i <= 7; i++){			//取出63个时隙的AIS寄存器值
			ais_reg[0][i] |= XBYTE[i + 0x88A6];
		}
		temp = inter_reg[0][0] & 0xDA;		//得到满足误码秒的条件
		temp1 = inter_reg[0][2] & 0xE0;
		temp2 = inter_reg[0][3] & 0x80;
		if (temp | temp1 | temp2){
			intflg_MCBA = 1;				//计算误码秒的标志位
		}
		if (inter_reg[0][0] != 0){
			Intmask0_a = inter_reg[0][0];
			inter_reg[0][0] &= 0xD0;		//取出可发生自动倒换的bit位
			if (inter_reg[0][0] != 0){
				init_recover[0] = 1;
				path_switch_mcba();
//				SetExtRdyTbl(1);
			}
		}
		if (inter_reg[0][1] != 0){
			Intmask1_a = inter_reg[0][1];
		}
		if (inter_reg[0][2] != 0){
			Intmask2_a = inter_reg[0][2];
			inter_reg[0][2] &= 0xE0;
			if (inter_reg[0][2] != 0){
				init_recover[0] = 1;
				path_switch_mcba();
//				SetExtRdyTbl(1);
			}
		}
		if (inter_reg[0][3] != 0){
//			Intmask3_a = judge3;
			inter_reg[0][3] &= 0x80;
			if (inter_reg[0][3] != 0){
//				test_reg[3] += 1;
				init_recover[0] = 1;
				path_switch_mcba_tu();
				SetExtRdyTbl(2);
			}
		}
		clk_check_flg[0] = 1;				//置位时钟频偏标志位
	}

//	temp1 = int_reg & 0x01;
//	if (temp1){
//		test_reg[5] += 1;
//	}		
	temp = int_reg & 0x0F;
	if (temp){
		for (i = 0; i <= 7; i++){			//取出B光口63个时隙的AIS寄存器值
			ais_reg[1][i] |= XBYTE[i + 0x8AA6];
		}
		temp = inter_reg[1][0] & 0xDA;
		temp1 = inter_reg[1][2] & 0xE0;
		temp2 = inter_reg[1][3] & 0x80;
		if (temp | temp1 | temp2){
			intflg_MCBB = 1;
			clk_check_flg[0] = 1;
		}
		if (inter_reg[1][0] != 0){
			Intmask0_b = inter_reg[1][0];
			inter_reg[1][0] &= 0xD0;		//取出可发生自动倒换的bit位
			if (inter_reg[1][0] != 0){
				init_recover[1] = 1;
				path_switch_mcbb();
//				SetExtRdyTbl(3);
			}
		}
		if (inter_reg[1][1] != 0){
			Intmask1_b = inter_reg[1][1];
		}
		if (inter_reg[1][2] != 0){
			Intmask2_b = inter_reg[1][2];
			inter_reg[1][2] &= 0xE0;
			if (inter_reg[1][2] != 0){
				init_recover[1] = 1;
				path_switch_mcbb();
//				SetExtRdyTbl(3);
			}
		}
		if (inter_reg[1][3] != 0){
//			Intmask3_b = judge3;
			inter_reg[1][3] &= 0x80;
			if (inter_reg[1][3] != 0){
				init_recover[1] = 1;
				path_switch_mcbb_tu();
				SetExtRdyTbl(4);
//				test_reg[6] += 1;
			}
		}
		clk_check_flg[0] = 1;				//置位时钟频偏标志位
	}

//	Rdint_clr = 0x40;						//清除MCB盘的Ia3_a与Ia3_b中断位

	if (f2rc7820_rd(F2Int_reg)){
		f2rc7820_wr(F2Encrypt_reg,0xAA);		//open 7820 write reg
		f2rc7820_wr(F2Intmask_reg,0xFF);
	}

	if (f2int_reg){
		if (start_flg[0] == 1){
			f2rc7860_wr(F2Reg_protect,0xAA);	//open 7860 write reg protect
		}
		else{
			f2rc7860_wr(F2Int_mask,0x80);
			if (f2int_reg & 0xF0){				//光分支盘A口中断处理
				for (i = 0; i <= 7; i++){		//取出光分支A口63个时隙的AIS寄存器值
					ais_reg[2][i] |= f2rc7860_rd(i + 0x00A6);
				}
				if ((inter_reg[2][0] & 0xDA) | (inter_reg[2][2] & 0xE0) | (inter_reg[2][3] & 0x80)){
					intflg_OTBA = 1;
				}
				if (inter_reg[2][0] != 0){
					f2rc7860_wr(F2Intmask0_a,inter_reg[2][0]);
					inter_reg[2][0] &= 0xD0;	//取出可发生自动倒换的bit位
					if (inter_reg[2][0] != 0){
						init_recover[2] = 1;
						path_switch_otba();
	//					SetExtRdyTbl(5);
					}
				}
				if (inter_reg[2][1] != 0){
					f2rc7860_wr(F2Intmask1_a,inter_reg[2][1]);
	//				judge1 &= 0xF0;
	//				if (judge1 != 0){
	//					SetExtRdyTbl(5);
	//					path_switch_otba();
	//				}
				}
				if (inter_reg[2][2] != 0){
					f2rc7860_wr(F2Intmask2_a,inter_reg[2][2]);
					inter_reg[2][2] &= 0xE0;
					if (inter_reg[2][2] != 0){
						init_recover[2] = 1;
						path_switch_otba();
	//					SetExtRdyTbl(5);
					}
				}
				if (inter_reg[2][3] != 0){
	//				f2rc7860_wr(F2Intmask3_a,inter_reg[2][3]);
					inter_reg[2][3] &= 0x80;
					if (inter_reg[2][3] != 0){
						init_recover[2] = 1;
						path_switch_otba_tu();
						SetExtRdyTbl(6);
					}
				}
			}
	
			if (f2int_reg & 0x0F){				//光分支盘B口中断处理
				for (i = 0; i <= 7; i++){		//取出63个时隙的AIS寄存器值
					ais_reg[3][i] |= f2rc7860_rd(i + 0x02A6);
				}
				if ((inter_reg[3][0] & 0xDA) | (inter_reg[3][2] & 0xE0) | (inter_reg[3][3] & 0x80)){
					intflg_OTBB = 1;
				}
				if (inter_reg[3][0] != 0){

⌨️ 快捷键说明

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