📄 main.c
字号:
}
if((s[0]&0x20)!=0x20) //远控开闭环控制
{
key_press++;
if(key_press<800) return; //该数值控制远控键的切换速度
BEEP=0;
for(i = 0;i < 200;i++) for(j = 0;j < 200;j++);
if(!sound) BEEP = 1;
if(Loop_state==1) Loop_state=0;
else Loop_state=1;
Output_control();
key_press=0;
}
else key_press=0;
}
//写入初始值
void IAP_Init(void)
{
unsigned char code temp[62]=
{
0x01,0x27,0x10,0x02,0x58,0x00,0x03,0xe8,0x00,0x01,0x2c,0x00,0x00,0x00,0x46,0x47,
0x48,0x00,0x00,0x3c,0x31,0x32,0x33,0x34,0x35,0x36,0x30,0x30,0x30,0x30,0x30,0x30,
0x31,0x33,0x35,0x37,0x39,0x30,0x2A,0xF8,0x01,0x5E,0x01,0x02,0x05,0x35,0x55,0x05,
0x35,0x55,0x05,0x35,0x55,0x06,0x40,0x00,0x00,0x7B,0x4F,0x66,0x4F,0x66,
};
unsigned char i;
if(byte_read(0x8000)==0xff)
{
sector_erase(0x8000);
for(i=0;i<62;i++) byte_program(0x8000+i,temp[i]);
sector_erase(0x8400);
byte_program(0x8400,0);
byte_program(0x8401,0);
}
}
//外接干接点报警输入
void Scan_Alarm_input(void)
{
unsigned char i;
unsigned char s[INPUT_RETRY_TIMES];
P4_1=0; //通过74HC138的3-8译码器选通干接点输入到P0
P4_2=1;
P4_3=0;
for(i=0;i<INPUT_RETRY_TIMES;i++) //间隔时间连读3次,如数据不一致则判断为干扰,丢弃
{
s[i]=P0|0xc0; //读取P0数据
delay(INPUT_RETRY_DELAY); //读取的延时请测试和调整
}
P4_1=1; //隔离掉所有可选的P0输入输出
P4_2=1;
P4_3=1;
if(s[0]!=s[1] || s[0]!=s[2]) return; //3次数据不一致
if(s[0]==0xff)
{
if(Alarm>1 && Alarm<5) //温度恢复正常
{
Alarm=0;
Show_Alarm_prompt();
}
return; //如果无报警输入则返回
}
// if(Alarm==0) return; //一次处理一个故障,
if((s[0]&0x01)!=0x01) //快熔故障
{
Alarm=1;
Show_Alarm_prompt();
return;
}
if((s[0]&0x02)!=0x02) //水温高故障
{
Alarm=2;
Show_Alarm_prompt();
return;
}
if((s[0]&0x04)!=0x04) //母排温度高
{
Alarm=3;
Show_Alarm_prompt();
return;
}
if((s[0]&0x08)!=0x08) //负排温度高
{
Alarm=4;
Show_Alarm_prompt();
return;
}
if((s[0]&0x10)!=0x10) //缺相故障
{
Alarm=9;
Show_Alarm_prompt();
return;
}
if((s[0]&0x20)!=0x20) //冷却水水压低
{
Alarm=10;
Show_Alarm_prompt();
return;
}
}
void Modi_Preset_value_via_Key(unsigned char k)
{
unsigned int xdata value;
unsigned char a;
a=Alarm;
value=k;
key=100;
if(Loop_mode==1) //稳压
{
ShowVoltage(0,value,1);
while(1)
{
feeddog();
if(a!=Alarm) //键盘给定过程中发生故障报警,退出
{
Show_Preset();
key=100;
CH452_Write(CH452_SYSON2W); //配置CH452为两线制方式,SDA用做按键中断输出
return;
}
if(key>16) continue;
CH452_Write(CH452_SYSOFF); //关键盘中断
if(key==16) //esc
{
Show_Preset();
key=100;
CH452_Write(CH452_SYSON2W); //配置CH452为两线制方式,SDA用做按键中断输出
return;
}
if(key==11) //确认
{
Voltage_Set_value=value;
Show_Preset();
Preset(0); //软给定
key=100;
CH452_Write(CH452_SYSON2W); //配置CH452为两线制方式,SDA用做按键中断输出
return;
}
if(key==10 && value>9) // <-
{
value/=10;
ShowVoltage(0,value,1);
}
if(key<10 && value<100)
{
value*=10;
value+=key;
ShowVoltage(0,value,1);
}
key=100;
CH452_Write(CH452_SYSON2W); //配置CH452为两线制方式,SDA用做按键中断输出
}
}
else
{
ShowCurrent(0,value,1);
while(1)
{
feeddog();
if(key>16) continue;
CH452_Write(CH452_SYSOFF); //关键盘中断
if(key==16) //esc
{
Show_Preset();
key=100;
CH452_Write(CH452_SYSON2W); //配置CH452为两线制方式,SDA用做按键中断输出
return;
}
if(key==11) //确认
{
Current_Set_value=value;
//ShowCurrent(0,Current_Set_value,0);
Show_Preset();
Preset(0); //软给定
key=100;
CH452_Write(CH452_SYSON2W); //配置CH452为两线制方式,SDA用做按键中断输出
return;
}
if(key==10 && value>9) // <-
{
value/=10;
ShowCurrent(0,value,1);
}
if(key<10 && value<10000)
{
value*=10;
value+=key;
ShowCurrent(0,value,1);
}
key=100;
CH452_Write(CH452_SYSON2W); //配置CH452为两线制方式,SDA用做按键中断输出
}
}
}
void main(void)
{
unsigned char i,j;
unsigned int p;
unsigned char sec_flag,min_flag,hour_flag;
unsigned int sec_count=0;
unsigned char hour_count=0;
unsigned char day_count=0;
feeddog();
for(i=1;i<17;i++) Set_Relay(i,0); //关闭所有继电器
Set_Relay(2,1); //封脉打开
VCC2=0;
LCM_BL=0; //开背光
BEEP=0; //上电后的蜂鸣
for(i=0;i<200;i++) for(j=0;j<200;j++);
for(i=0;i<200;i++) for(j=0;j<200;j++);
for(i=0;i<200;i++) for(j=0;j<200;j++);
BEEP=1;
IAP_Init(); //单片机初次使用时写入默认值
W1302(0x8e,0x00); //设置充电
W1302(0x90,0xa6);
W1302(0x8e,0x80);
Get1302(); //初次上电后DS1302时间可能是非法值,修正为一个固定值
if(ucCurtime[0]>0x59) //如果读出的时间非法
{
ucCurtime[0]=0x00; //秒
ucCurtime[1]=0x00; //分
ucCurtime[2]=0x00; //时
ucCurtime[3]=0x01; //日
ucCurtime[4]=0x01; //月
ucCurtime[5]=0; //星期
ucCurtime[6]=0x08; //年
Set1302(ucCurtime); //写入以上数据
}
init_2548(); //配置ADC
if(read_2548_cfr()!=0x0c00) {}; //读出ADC配置值,判断ADC工作正常否
ReadAD(0); //预读0通道,这个是必须的
Read_system_set(); //读入系统设置
i=Log_in();
if(i==2) Sys_setup(); //输入超级用户密码进入系统高级设置
key=100; //重置键盘码为无效值
CH452_Write(CH452_SYSON2W); //配置CH452为两线制方式,SDA用做按键中断输出
Show_1_page(); //显示第一页
Set_DAC(1,0);
Set_DAC(2,2036);
Output_control(); //输出控制
Show_Preset(); //显示给定值
// EX0=1;
// IT0=1; //外部触发为下降沿触发
UART_initProg(); //配置串行口
// show_days();
while(1)
{
timeProc();
checkComm0Modbus();
if(Sample_flag && Days_Passed>Sample_Days) //试用到期
{
InitLCD(); //LCD预置
Show_logo(); //显示厂商标识
ShowLine(3,17,"试用到期");
ShowLine(7,2,"湘潭大众整流器制造有限公司");
ReverseShowLine(0,30,7); //反白显示最下一行
Set_DAC(1,0); //0输出
Set_Relay(13,0);
EX0=0;
ES=0;
// show_days();
while(1)
{
feeddog();
}
}
if(key<10 && key>0) //按下1-9键
{
if(system_staus != 0)
{
Modi_Preset_value_via_Key(key);//通过键盘修改给定值
}
}
if(key==12) //按下启动按键
{
system_staus=1;
Set_Relay(13,1); //开继电器
Preset(0); //软给定
ShowLine(0,12,"运行");
key=100;
}
if(key==13) //按下停止按键
{
system_staus=0;
Set_Relay(13,0);
Set_DAC(1,0); //0输出
ShowLine(0,12,"停止");
Current_Set_value=0; //设置值归0
Voltage_Set_value=0;
Show_Preset();
key=100;
}
if(key==18) //设定
{
ES=0; //进入设置界面关串口中断
User_setup();
ES=1; //返回主界面开串口中断
}
if(key==14) //向上键
{
CH452_Write(CH452_SYSOFF); //关键盘中断
if(system_staus != 0)
{
Set_value_Adj(1);
Preset(1);
}
key=100;
CH452_Write(CH452_SYSON2W); //配置CH452为两线制方式,SDA用做按键中断输出
}
if(key==15) //向下键
{
CH452_Write(CH452_SYSOFF); //关键盘中断
if(system_staus != 0)
{
Set_value_Adj(-1);
Preset(1);
}
key=100;
CH452_Write(CH452_SYSON2W); //配置CH452为两线制方式,SDA用做按键中断输出
}
if(key==19) //报警复位键
{
CH452_Write(CH452_SYSOFF); //关键盘中断
for(i=3;i<12;i++) Set_Relay(i,0); //报警继电器全部释放
Set_Relay(2,0); //封脉继电器释放
Set_Relay(12,0); //跳闸继电器释放
Alarm=0;
Show_Alarm_prompt();
BEEP=1; //关闭报警声音
sound=0;
key=100;
CH452_Write(CH452_SYSON2W); //配置CH452为两线制方式,SDA用做按键中断输出
}
if(p%10==0) //每10次
{
feeddog();
Get1302(); //读DS1302时间
if(ucCurtime[0]!=sec_flag) //每秒触发一次刷新显示
{
sec_flag=ucCurtime[0];
sec_count++; //秒计数器
if(!show_time_limit) Show_Realtime(); //刷新当前时间显示
Show_Current_ADC(); //刷新ADC数值
Show_Temperatuer(); //刷新温度数据
if(temperatuer_val[0]>Temperatuer_Water_Upper_Bound) //水温超上限
{
Alarm=5;
Show_Alarm_prompt();
}
else if(Alarm==5 && temperatuer_val[0]<Temperatuer_Water_Upper_Bound )
{
Alarm=0;
Show_Alarm_prompt();
}
if(temperatuer_val[1]>Temperatuer_Panel_Upper_Bound) //母排温超上限
{
Alarm=6;
Show_Alarm_prompt();
}
else if(Alarm==6 && temperatuer_val[1]<Temperatuer_Panel_Upper_Bound) //超温后恢复正常
{
Alarm=0;
Show_Alarm_prompt();
}
if(temperatuer_val[2]>Temperatuer_Panel_Upper_Bound) //副排温超上限
{
Alarm=7;
Show_Alarm_prompt();
}
else if(Alarm==7 && temperatuer_val[2]<Temperatuer_Panel_Upper_Bound)
{
Alarm=0;
Show_Alarm_prompt();
}
if(temperatuer_val[3]>Temperatuer_Transformator_Upper_Bound) //变压器温超上限
{
Alarm=8;
Show_Alarm_prompt();
}
else if(Alarm==8 && temperatuer_val[3]<Temperatuer_Transformator_Upper_Bound)
{
Alarm=0;
Show_Alarm_prompt();
}
}
if(ucCurtime[1]!=min_flag) //每分触发一次
{
min_flag=ucCurtime[1];
if(Alarm>1 && Alarm<9 && High_temperatuer_Off_Delay)
{
High_temperatuer_Off_Delay--;
ShowChar(6,21,High_temperatuer_Off_Delay+0x30);
}
if(Alarm>1 && Alarm<9 && High_temperatuer_Off_Delay==0)
{
if(Alarm<5) Alarm=Alarm+13;
else Alarm=Alarm+10;
Show_Alarm_prompt();
}
}
if(ucCurtime[2]!=hour_flag) //小时
{
hour_flag=ucCurtime[2];
hour_count++; //小时计数器
if(hour_count==24) //连续工作一天
{
day_count++;
hour_count=0;
Days_Passed++;
sector_erase(0x8400);
byte_program(0x8400,Days_Passed/256);
byte_program(0x8401,Days_Passed%256);
if(Days_Passed+7>Sample_Days) //试用提示
{
ShowChar(7,0,Sample_Days-Days_Passed+0x30);
ShowLine(7,1,"天后系统将锁定停机,请联系厂家");
show_time_limit=1;
ReverseShowLine(0,30,7); //反白显示最下一行
}
}
}
}
p++;
if(p>60000) p=0;
Scan_Remoto_key(); //检查是否有远控输入
Scan_Alarm_input(); //检查报警干接点输入状态
// show_days();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -