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

📄 clk_deal.c

📁 单片机程序代码,经过很详细的测试.呵呵,硬件相关.
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <REG54.H>
#include "rc7820.h"
#include "rc7860.h"
#include "f2rc7820.h"
#include "cmd_para_save.h"

extern unsigned char f2rc7820_rd(unsigned char f2addr) large reentrant;
extern void SetResRdyTbl(unsigned char prio) large reentrant;
extern unsigned char GetResRdyTbl(unsigned char prio) large reentrant;
extern unsigned long int xdata commandid;                              //表示命令代码的变量
extern unsigned char xdata tx_buf[];
extern unsigned char xdata tx_buf_pointer;
extern bit tx_done;

unsigned char xdata clksource_reg = 0;            	//保存强制转换的时钟源
unsigned char xdata clk_force = 0xFF;				//强制转换的时钟源代号
unsigned char xdata clk_source = 8;					//主用时钟源代号寄存器,缺省自由振荡
unsigned char xdata clkmode_reg = 0;              	//保存是强制模式还是自动运行
unsigned char xdata clkarray_flg = 0;				//是否填写优先级表标志位
unsigned char xdata clk_prio = 8;					//时钟优先级标志
unsigned int xdata clkprio_array[7] = {0,0,0,0,0,0,0};							//时钟优先级恢复计数
unsigned char xdata clkarray[8] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};	//时钟优先级存储数组
unsigned char xdata clk_check_flg[2] = {0,0};
//时钟频偏检测标志数组,第一位表示光口号,第二位表示计数值
unsigned char xdata clk_frequence_stat;
extern unsigned char xdata start_flg[4];

unsigned char set_clock_source(struct cmd_para_save *set_clock){
//C10强制配置时钟源函数
unsigned char xdata clksource;
unsigned char xdata return_value;
unsigned char xdata flg;

	commandid = 0x00433130;
	clksource = set_clock -> force_clock_source;

	switch (clksource){
		case 0: flg = Reflos_reg1 & 0x80;          //查看7820中T11即光口0线路时钟
				if (flg == 0){
					//S_reg = 0x81;                  //配置时钟源为光口0线路时钟
					clksource_reg = 0x81;
					clk_force = 0;
					return_value = 0;
				}
				else {
					clksource_reg = 0;
					clk_force = 0xFF;
					return_value = 2;
				}
				break;
		case 1: flg = Reflos_reg1 & 0x40;          //查看T12即光口1线路时钟
				if (flg == 0){
					//S_reg = 0x82;                  //配置时钟源为光口1线路时钟
					clksource_reg = 0x82;
					clk_force = 1;
					return_value = 0;
				}
				else {
					clksource_reg = 0;
					clk_force = 0xFF;
					return_value = 2;
				}
				break;
		case 2: flg = (f2rc7820_rd(F2Reflos_reg1)) & 0x80;	//查看T16即光口2线路时钟
				if (flg == 0 & start_flg[0] == 0){
					//S_reg = 0x86;                  //配置时钟源为光口2线路时钟
					clksource_reg = 0x86;
					clk_force = 2;
					return_value = 0;
				}
				else {
					clksource_reg = 0;
					clk_force = 0xFF;
					return_value = 2;
				}
				break;
		case 3: flg = (f2rc7820_rd(F2Reflos_reg1)) & 0x40;	//查看T17即光口3线路时钟
				if (flg == 0 & start_flg[0] == 0){
					//S_reg = 0x87;                  //配置时钟源为光口3线路时钟
					clksource_reg = 0x87;
					clk_force = 3;
					return_value = 0;
				}
				else {
					clksource_reg = 0;
					clk_force = 0xFF;
					return_value = 2;
				}
				break;
		case 7: flg = Reflos_reg2 & 0x08;          //查看7820中T21即第二外时钟源
				if (flg == 0){					   
					//S_reg = 0x89;                //配置时钟源为第二外时钟
					clksource_reg = 0x89;
					clk_force = 7;
					return_value = 0;
				}
				else {								//时钟源丢失
					clksource_reg = 0;
					clk_force = 0xFF;
					return_value = 2;	            //返回值2执行失败
				}
				break;
		case 6: flg = Reflos_reg2 & 0x02;           //查看7820中T31即第一外时钟源
				if (flg == 0){
					//S_reg = 0x8B;                 //配置时钟源为第一外时钟源
					clksource_reg = 0x8B;
					clk_force = 6;
					return_value = 0;
				}
				else {
					clksource_reg = 0;
					clk_force = 0xFF;
					return_value = 2;
				}
				break;
		case 8: //S_reg = 0xC0;                      //配置时钟源自由振荡模式
				clksource_reg = 0xC0;
				clk_force = 8;
				return_value = 0;                  //返回值0执行成功
				break;
		case 9: //S_reg = 0xE0;                      //配置时钟源为保持模式
				clksource_reg = 0xE0;
				clk_force = 9;
				return_value = 0;                 //返回值0执行成功
				break;
		default:clksource_reg = 0;
				clk_force = 0xFF;
				return_value = 2;                 //非法配置返回值2不成功
		        break;
	}
	if (!GetResRdyTbl(1))
		SetResRdyTbl(1); 
	return (return_value);
}


unsigned char set_clock_mode(struct cmd_para_save *set_clock){
//C11设置时钟源运行模式
unsigned char xdata clk_mode;
unsigned char xdata return_value;

	clk_mode = set_clock -> clock_source_mode;
	commandid = 0x00433131;
	clkmode_reg = clk_mode;                        //save clk mode

	if (clkmode_reg){                              //if clk run force mode
		if (clksource_reg != 0){                   //if clk mode no error
			S_reg = clksource_reg;                 //run clk mode
			clk_source = clk_force;
			return_value = 0;                      
			}
		else return_value = 2;
	}
	else return_value = 0;                         //clk run auto mode
	 if (!GetResRdyTbl(1))
		SetResRdyTbl(1); 
	 return (return_value);
}

unsigned char set_clock_prio(struct cmd_para_save *set_clock){
//C12配置时钟源优先级表
unsigned char xdata clksource;
unsigned char xdata clkprio;

	commandid = 0x00433132;
	clksource = set_clock -> clock_source;
	clkprio = set_clock -> clock_prio;

	if (clkprio >=0 & clkprio <= 7){
		clkarray[clkprio] = clksource;
		clkarray_flg = 1;
		if (!GetResRdyTbl(1))
			SetResRdyTbl(1);
		return(0);
	}
	else {
	if (!GetResRdyTbl(1))
		SetResRdyTbl(1);
		return(2);
	}
}



unsigned char get_clock_working(void){
//C13取得当前输入时钟源状态
unsigned char xdata return_value;
unsigned char xdata clkport;

//	clkport = S_reg & 0x60;
	if (Mode_reg == 0x02){
		return_value = 9;
	}
	else if(Mode_reg == 0x03){
		return_value = 8;
	}
	else {
		clkport = S_reg & 0x0F;
		switch (clkport){
		case 1: return_value = 0;
				break;
		case 2: return_value = 1;
				break;
		case 6: return_value = 2;
				break;
		case 7: return_value = 3;
				break;
		case 9: return_value = 7;
				break;
		case 11: return_value = 6;
				 break;
		default: return_value = 10;
		         break;
		}
	}
	if (!GetResRdyTbl(11))
		SetResRdyTbl(11); 
	return (return_value);
}


void report_clock_working(unsigned char clksource){
//C13回应函数
    tx_buf[0] = '$';
	tx_buf[1] = '2';
	tx_buf[2] = '1';
	tx_buf[3] = 0x43;
	tx_buf[4] = 0x31;
	tx_buf[5] = 0x33;
	tx_buf[6] = '0';
	tx_buf[7] = '0';
	tx_buf[8] = '0';
	tx_buf[9] = '3';
	if (clksource == 10){
		tx_buf[10] = '2';
	}
	else tx_buf[10] = '0';
	tx_buf[11] = clksource + 0x30;
	tx_buf[12] = clkmode_reg + 0x30;
	tx_buf[13] = '*';
	tx_buf_pointer = 0;	
	while(tx_buf[tx_buf_pointer] != '*'){
		SBUF = tx_buf[tx_buf_pointer];
		while(tx_done == 0);
		tx_done = 0;
		tx_buf_pointer++;
	}
	SBUF = tx_buf[tx_buf_pointer];          //发送最后一个字符'*'
	while(tx_done == 0);
	tx_done = 0;
}

unsigned char get_clock_state(unsigned char clksource){
//取得时钟源状态函数
unsigned char xdata flg;
unsigned char xdata return_value;

	switch (clksource) {
	case 0: flg = Reflos_reg1 & 0x80;			//查看7820中T11即光口0线路时钟
			if (flg == 0x80){					//时钟源丢失
				return_value = 0x00;			//高8位表示该时钟源状态,低8位表示时钟源编号
			}
			else return_value = 0x10;
			break;
	case 1: flg = Reflos_reg1 & 0x40;          //查看T12即光口1线路时钟
			if (flg == 0x40){
				return_value = 0x01;
			}
			else return_value = 0x11;
			break;
	case 2: flg = (f2rc7820_rd(F2Reflos_reg1)) & 0x80;
			//flg = Reflos_reg1&0x04;            //查看T16即光口2线路时钟
			if (flg == 0x80){
				return_value = 0x02;
			}
			else return_value = 0x12;
			break;
	case 3: flg = (f2rc7820_rd(F2Reflos_reg1)) & 0x40;
			//flg = Reflos_reg1&0x02;            //查看T17即光口3线路时钟
			if (flg == 0x40){
				return_value = 0x03;
			}
			else return_value = 0x13;
			break;
	case 7:	flg = Reflos_reg2 & 0x08;			//查看7820中T21即第二外时钟源
			if (flg == 0x08){					//时钟源丢失
				return_value = 0x07;            //高8位表示该时钟源状态,低8位表示时钟源编号
			}
			else return_value = 0x17;
			break;
	case 6: flg = Reflos_reg2 & 0x02;          //查看7820中T31即第一外时钟源
			if (flg == 0x02){
				return_value = 0x06;
			}
			else return_value = 0x16;
			break;
	case 8: return_value = 0x18;
			break;
	case 9: return_value = 0x19;
			break;
	default: return_value = 0x0A;
			 break;
	}
	return (return_value);
}

⌨️ 快捷键说明

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