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

📄 main.c

📁 本程序是一个人机接口程序
💻 C
📖 第 1 页 / 共 4 页
字号:
#include "T6963_Driver.c"
#include "logo.h"
#include "tlv5618.c"
#include "common.h"
#include "ds1302.c"
#include "tlv2544.c"
#include "ch452w2.c"
#include "18b20.c"
#include "iap.c"
#include "fault.c"
#include "modbus.c"

/*
void show_days(void)
{
	ShowChar(7,10,Days_Passed/10000+0x30);
	ShowChar(7,11,Days_Passed%10000/1000+0x30);
	ShowChar(7,12,Days_Passed%1000/100+0x30);
	ShowChar(7,13,Days_Passed%100/10+0x30);
	ShowChar(7,14,Days_Passed%10+0x30);
}
*/

void delay(unsigned int i)
{
	while(i--);
}

//键值转换函数
//根据键盘按键排列不同在此修改case后的键值
unsigned char Key_value_conver(unsigned char key1)
{
//	ShowChar(0,0,key1/100+0x30);
//	ShowChar(0,1,key1%100/10+0x30);
//	ShowChar(0,2,key1%10+0x30);

	switch(key1)
	{
	 	case 0x75: return 1;
		case 0x7D: return 2;
		case 0x6D: return 3;
		case 0x65: return 4;
		case 0x5D: return 5;
		case 0x55: return 6;
		case 0x4D: return 7;
		case 0x45: return 8;
		case 0x6E: return 9;
		case 0x66: return 0;
		case 0x46: return 10; //向左键
		case 0x67: return 11; //确认键
		case 0x57: return 12; //启动
		case 0x4F: return 13; //停止
		case 0x56: return 14; //上
		case 0x4E: return 15; //下
		case 0x5E: return 16; //ESC
		case 0x6F: return 17; //向右键
		case 0x5F: return 18; //设置
		case 0x47: return 19; //S15
		default: return 100;
	}							  
}

//按键中断
//产生按键声音和读取按键码
void Key_interrupt(void) interrupt 0
{		   
	unsigned char i,j;	
	
//	EX0 = 0;
	BEEP = 0;
	for(i = 0;i < 200;i++) for(j = 0;j < 200;j++);
	if(!sound) BEEP = 1;
	key = CH452_Read();
//	send_char(key);
	key = Key_value_conver(key);
//	CH452_Write(CH452_RESET);
//	EX0 = 1;
}

//设置继电器状态
//id:1-16对应K1-K16
//staus:状态,1:吸合,2:释放
void Set_Relay(unsigned char id,unsigned char staus) 
{
	switch(id)
	{
	 	case 1:  if(staus) Relay_1|=0x01; else Relay_1&=0xfe; break; //稳流/稳压继电器
	 	case 2:  if(staus) Relay_1|=0x02; else Relay_1&=0xfd; break; //封脉继电器			
	 	case 3:  if(staus) Relay_1|=0x04; else Relay_1&=0xfb; break; //快熔故障报警继电器
	 	case 4:  if(staus) Relay_1|=0x08; else Relay_1&=0xf7; break; //水温高报警继电器
	 	case 5:  if(staus) Relay_1|=0x10; else Relay_1&=0xef; break; //母排温度高报警继电器
	 	case 6:  if(staus) Relay_1|=0x20; else Relay_1&=0xdf; break; //过流故障报警继电器
		case 7:  if(staus) Relay_1|=0x40; else Relay_1&=0xbf; break; //过压故障报警继电器
	 	case 8:  if(staus) Relay_1|=0x80; else Relay_1&=0x7f; break; //冷却水水压低报警继电器
	 	case 9:  if(staus) Relay_2|=0x01; else Relay_2&=0xfe; break; //网电电压低报警继电器
	 	case 10: if(staus) Relay_2|=0x02; else Relay_2&=0xfd; break; //网电电压高报警继电器
	 	case 11: if(staus) Relay_2|=0x04; else Relay_2&=0xfb; break; //总报警继电器
	 	case 12: if(staus) Relay_2|=0x08; else Relay_2&=0xf7; break; //跳闸继电器
	 	case 13: if(staus) Relay_2|=0x10; else Relay_2&=0xef; break; //启动/停止继电器
	 	case 14: if(staus) Relay_2|=0x20; else Relay_2&=0xdf; break; //稳流状态指示继电器
	 	case 15: if(staus) Relay_2|=0x40; else Relay_2&=0xbf; break; //稳压状态指示继电器
	 	case 16: if(staus) Relay_2|=0x80; else Relay_2&=0x7f; break; //闭环继电器
		default: break;
	}
	P4_1 = 0;         //选通HC138(3/8译码器),将数据输入到指定的锁存器
	P4_2 = 0;
	P4_3 = 0;
    P0 = Relay_1;
	P4_1 = 1;
	P4_2 = 0;
	P4_3 = 0;	
	P0 = Relay_2;
	P4_1 = 1;	        
	P4_2 = 1;
	P4_3 = 1;
}

//显示时间
void Show_Realtime()
{
	ShowChar(7,2,ucCurtime[6]/16+0x30);     //年
	ShowChar(7,3,ucCurtime[6]%16+0x30);
	ShowChar(7,6,ucCurtime[4]/16+0x30);	    //月
	ShowChar(7,7,ucCurtime[4]%16+0x30);
	ShowChar(7,10,ucCurtime[3]/16+0x30);    //日
	ShowChar(7,11,ucCurtime[3]%16+0x30);
	ShowChar(7,16,ucCurtime[2]/16+0x30);	//时
	ShowChar(7,17,ucCurtime[2]%16+0x30);
	ShowChar(7,19,ucCurtime[1]/16+0x30);	//分
	ShowChar(7,20,ucCurtime[1]%16+0x30);
	ShowChar(7,22,ucCurtime[0]/16+0x30);	//秒
	ShowChar(7,23,ucCurtime[0]%16+0x30);
}

void Show_Alarm_prompt(void)
{
	unsigned char i;
	unsigned char code Alarm_message[19][21]={
		{"正常                "}, //0
		{"快熔报警,封脉       "}, //1
		{"水温高报警, 分后封脉"}, //2
		{"正排温度高, 分后封脉"}, //3
		{"负排温度高, 分后封脉"}, //4
		{"水温高报警, 分后封脉"}, //5
		{"正排温度高, 分后封脉"}, //6
		{"负排温度高, 分后封脉"}, //7
		{"变压器温高, 分后封脉"}, //8
		{"缺相故障,封脉       "}, //9
		{"水压低报警,封脉     "}, //10
		{"过流报警,封脉       "}, //11
		{"过压报警,封脉       "}, //12
		{"网电压高报警,封脉   "}, //13
		{"网电压低报警,封脉   "}, //14
		{"水温高报警,封脉     "}, //15
		{"正排温度高,封脉     "}, //16
		{"负排温度高,封脉     "}, //17
		{"变压器温高,封脉     "}, //18		
	};

	if(Alarm==Alarm_old) return;   //防止反复刷新显示
	if(Alarm_old < 19 && Alarm_old > 14 && Alarm < 9 && Alarm > 1) return; //高温封脉后不再对高温进行处理
	if(Alarm_old!=0xff)  Add_Fault_List();
	Alarm_old = Alarm;

	if(Alarm==0) High_temperatuer_Off_Delay = High_temperatuer_Off_Delay_Set;
	
	for(i = 10;i < 30;i++) ShowChar(6,i,' ');
	ShowLine(6,10,Alarm_message[Alarm]);      
	if(Alarm > 1 && Alarm < 9) ShowChar(6,21,High_temperatuer_Off_Delay+0x30);		
	if(Alarm) 
	{
		Set_Relay(11,1); 	 //所有报警均启动总报警继电器
		BEEP = 0;   //蜂鸣器
		sound=1;
	}
	if(Alarm==1	|| Alarm>8) 
	{
	 	Set_Relay(2,1); //封脉继电器动作
	 	Set_Relay(13,0); //启动停止继电器释放
		system_staus=0;
		ShowLine(0,12,"停止");
		Set_DAC(1,0); //0输出
		Set_Relay(12,1); //跳闸继电器动作
	}
	switch(Alarm)
	{
		case 1:  Set_Relay(3,1);  break;	 //快熔报警
		case 2:  Set_Relay(4,1);  break;	 //水温高
		case 5:  Set_Relay(4,1);  break;	 //水温高
		case 3:  Set_Relay(5,1);  break;	 //排温高
		case 4:  Set_Relay(5,1);  break;	 //排温高
		case 6:  Set_Relay(5,1);  break;	 //排温高		
		case 7:  Set_Relay(5,1);  break;	 //排温高
		case 10: Set_Relay(8,1);  break;	 //水压低
		case 11: Set_Relay(6,1);  break;	 //过流
		case 12: Set_Relay(7,1);  break;	 //过压
		case 13: Set_Relay(10,1); break;	 //网电压高
		case 14: Set_Relay(9,1);  break;	 //网电压低
	}
}

//显示ADC数值
void Show_Current_ADC(void)
{
	unsigned long d;
	unsigned char i;
	
	ReadAD(0);//读0通道

	ADC[0] = ReadAD(2);
	ADC[1] = ReadAD(4);
	ADC[2] = ReadAD(6);
	ADC[3] = ReadAD(0);

	d = ADC[0];					  //显示当前电流值
	d*=Current_Measuring_Range;
	d*=100;
	d = d/ADC0_coefficients;
	if(d > Current_Upper_Bound)    //过流报警
	{
		Alarm = 11;
		Show_Alarm_prompt();      //显示报警内容
	}
	Current_Current=(unsigned int)d;
	ShowCurrent(1,(unsigned int)d,0);  

	d = ADC[1];					  //显示即时电压
	d*=Voltage_Measuring_Range;
	d*=100;
	d = d/ADC1_coefficients;
	if(d > Voltage_Upper_Bound)    //过压报警
	{
		Alarm = 12;
		Show_Alarm_prompt();      //显示报警内容
	}
	Current_Voltage = (unsigned int)d;
	ShowVoltage(1,(unsigned int)d,0);
 
	d = ADC[2]; //网电电压
	d*=Supply_Voltage_Measuring_Range;

	if(Supply_Voltage_Measuring_Range > 10000) 
	{
		d*=10;
		d = d/(ADC2_coefficients/10);
	}
	else 
	{
		d*=100;
		d = d / ADC2_coefficients;
	}
	if(d > Supply_Voltage_Upper_Bound)  //网电电压高报警
	{
		Alarm = 13;
		Show_Alarm_prompt();      //显示报警内容
	}
	if(d < Supply_Voltage_Lower_Bound)  //网电电压低报警
	{
		Alarm = 14;
		Show_Alarm_prompt();      //显示报警内容
 	}
	if(d > 99999) d = 99999;
	Current_Support_Voltage = d;
	for(i = 9;i < 13;i++) ShowChar(4,i,' ');
	if(d/10000) ShowChar(4,9,d/10000+0x30);
	if(d/1000) ShowChar(4,10,d%10000/1000+0x30);
	if(d/100) ShowChar(4,11,d%1000/100+0x30);
	if(d/10) ShowChar(4,12,d%100/10+0x30);
	ShowChar(4,13,d%10+0x30);

    if(ADC[3] > ADC3_start_coefficients) d = ADC[3]-ADC3_start_coefficients;
	else d = 0;
	d*=20520;
	d/=ADC3_coefficients;
	if(d > 180) d = 180;
	dtj = d;
	for(i = 25;i < 27;i++) ShowChar(0,i,' ');
	if(d/100) ShowChar(0,25,d/100+0x30);
	if(d/10) ShowChar(0,26,d%100/10+0x30);
	ShowChar(0,27,d%10+0x30);
}

//给定显示
void Show_Preset(void)	 
{
	if(Voltage_Set_value>Voltage_Measuring_Range) Voltage_Set_value=Voltage_Measuring_Range; 
	if(Current_Set_value>Current_Measuring_Range) Current_Set_value=Current_Measuring_Range; 
	if(Loop_state==0)    //开环
	{
		ShowCurrent(0,65535,0); 
		ShowVoltage(0,65535,0);
	} 
	else if(Loop_mode==1) 
	{
		ShowCurrent(0,65535,0); 
		ShowVoltage(0,Voltage_Set_value,0);
	}
	else 
	{
		ShowCurrent(0,Current_Set_value,0); 
		ShowVoltage(0,65535,0);
	}
}

//给定
//s=1,直接给定
//s=0,软给定
void Preset(unsigned char s)
{
	unsigned int i;
	unsigned long temp;

	feeddog();
	if(system_staus == 0)    //停止状态
	{
		Set_DAC(1,0);      //0给定
		return;
	}
	if(Loop_mode == 1) //稳压
	{
		if(s == 0)
		{
			for(i = 0;i < Voltage_Set_value;i+=10) 	//电压软设置,步进10V
			{
				temp=i;
				temp*=Voltage_Preset_coefficients; //20326
				temp/=10;
				temp/=Voltage_Measuring_Range;
				Set_DAC(1,(unsigned int)temp);
				delay(300);
			}
		}
		temp=Voltage_Set_value; 
		temp*=Voltage_Preset_coefficients;
		temp/=10;
		temp/=Voltage_Measuring_Range;
		Set_DAC(1,(unsigned int)temp);  
		
	}
	else 	  //稳流
	{
		if(s==0)
		{
			for(i=0;i<Current_Set_value;i+=100) //电流软设置,步进100A
			{
				temp=i;
				temp*=Current_Preset_coefficients;  //20326
				temp/=10;
				temp/=Current_Measuring_Range;
				Set_DAC(1,(unsigned int)temp);
				delay(300);
			}
		 
		}
		temp=Current_Set_value;
		temp*=Current_Preset_coefficients;
		temp/=10;
		temp/=Current_Measuring_Range;
		Set_DAC(1,(unsigned int)temp); 
	}
}
 
//显示状态页
void Show_1_page(void)
{
	ClearScreen();
	ShowLine(0,0,"状态:             导通角:  0°");
	ShowLine(4,0,"网电压:       V 变压器:   ℃");
	ShowLine(5,0,"排  温:   ℃    水  温:   ℃");
	ShowLine(6,0,"系统状态: ");
	ShowLine(7,0,"20  年  月  日    :  :  ");

	Show_Alarm_prompt();

	ShowHZ24(0,16,0);   //电
	ShowHZ24(24,16,2);	//流
	ShowHZ24(144,16,0);	//电
	ShowHZ24(168,16,1);	//压
 	ShowHZ24(0,40,3);	//给
	ShowHZ24(24,40,4);	//定
	ShowHZ24(144,40,3);	//给
	ShowHZ24(168,40,4);	//定

	if(system_staus==1) ShowLine(0,12,"运行");
	else ShowLine(0,12,"停止");
}

//显示生成商标识
//80*80点阵图形
void Show_logo(void)
{
	unsigned char i,j;
	unsigned int StartAddr;
	
	StartAddr = 482;

	LCM_CE = 0;
	for(i = 0;i < 80;i++)
	{
		OutPortCom3((unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24);
		for(j = 0;j < 10;j++)
		{
 			OutPortCom2(pic[i][j], 0xc0);
		}
		StartAddr = StartAddr + ColumnChar;
	}
	LCM_CE = 1;
}

void Output_control(void)
{
	if(Loop_state==0)                      //开环
	{
		Set_Relay(16,0);
		Set_Relay(15,0);
		Set_Relay(14,0);
		Set_Relay(1,0);
		ShowLine(0,6,"开环");
	} 
	else if(Loop_mode==1) 	               //闭环稳压
	{
		Set_Relay(16,1);
		Set_Relay(15,1);
		Set_Relay(14,0);
		Set_Relay(1,0);
		ShowLine(0,6,"稳压");
	}
	else                                   //闭环稳流
	{
		Set_Relay(16,1);
		Set_Relay(15,0);
		Set_Relay(14,1);
		Set_Relay(1,1);
		ShowLine(0,6,"稳流");
	}
	Show_Preset();	                       //显示给定值
	Preset(0);							   //给定
}

//读取系统设置
void Read_system_set(void)
{
	unsigned char i;

	Loop_mode=byte_read(0x8000);                                                                      //系统模式,1稳压,0稳流
	Current_Measuring_Range=byte_read(0x8001)*256+byte_read(0x8002);                                  //输出电流量程
	Voltage_Measuring_Range=byte_read(0x8003)*256+byte_read(0x8004);                                  //输出电压量程
	Supply_Voltage_Measuring_Range=byte_read(0x8005)*65536+byte_read(0x8006)*256+byte_read(0x8007);   //网电压量程
	Supply_Voltage_Upper_Bound=byte_read(0x8008)*65536+byte_read(0x8009)*256+byte_read(0x800A);       //网电电压上限       
	Supply_Voltage_Lower_Bound=byte_read(0x800B)*65536+byte_read(0x800C)*256+byte_read(0x800D);       //网电电压下限
	Temperatuer_Transformator_Upper_Bound=byte_read(0x800e);                                          //变压器温度上限
	Temperatuer_Water_Upper_Bound=byte_read(0x800f);	                                              //水温上限
	Temperatuer_Panel_Upper_Bound=byte_read(0x8010);                                                  //排温上限
	Sample_flag=byte_read(0x8011);                                                                    //试用标志
	Sample_Days=byte_read(0x8012)*256+byte_read(0x8013);                                              //试用时间(天)
	for(i=0;i<6;i++) Sample_Password[i]=byte_read(0x8014+i);                                          //试用密码
	for(i=0;i<6;i++) password_user[i]=byte_read(0x801a+i);                                            //用户密码
	for(i=0;i<6;i++) password_admin[i]=byte_read(0x8020+i);                                           //超级用户密码
	Current_Upper_Bound=byte_read(0x8026)*256+byte_read(0x8027);                                      //过流值
    Voltage_Upper_Bound=byte_read(0x8028)*256+byte_read(0x8029);                                      //过压值

⌨️ 快捷键说明

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