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

📄 main.c

📁 本程序是一个人机接口程序
💻 C
📖 第 1 页 / 共 4 页
字号:

	}
	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 + -