📄 main.c
字号:
#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 + -