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

📄 taskmain.c

📁 STC12C5410AD模拟串口再现多串口通讯
💻 C
字号:
#define DATA
#include"include.h"

/*********************************************************************************************************
** 函数名称: uint8 ReadKey(void)
** 功能描述: 读取本机地址
** 输   入: 无
** 输   出: 无
** 全局变量: 
** 调用模块: 
**
** 作   者: 李伟
** 日   期: 2008年12月09日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日   期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 ReadKey(void)
{
	uint8 KEY;
	KEY = 0;
    if(KEY0 == 1)KEY = KEY + 1;
	if(KEY1 == 1)KEY = KEY + 2;
	if(KEY2 == 1)KEY = KEY + 4;
	if(KEY3 == 1)KEY = KEY + 8;
	return KEY;
}
/*********************************************************************************************************
** 函数名称: void Voltage_Collect(void)
** 功能描述: 各模拟量采集
** 输   入: 无
** 输   出: 无
** 全局变量: 
** 调用模块: 
**
** 作   者: 李伟
** 日   期: 2008年12月09日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日   期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void Voltage_Collect(void)
{
	uint8 channel;
	uint16 adcT;
	ChargeCurrent    = Adc_Collect(NEG_CURRENT);  //充电电流为负
	DisChargeCurrent = Adc_Collect(ACT_CURRENT);  //放电电流为正
	for(channel = 0;channel < 15;channel++)
	{
		A11 = 1;
	    A12 = 1;
		delaynms(20);
		SetChannel(channel);
		if(channel == 0)delaynms(100);
		else delaynms(50);
		CellVoltage[channel] = Adc_Collect(CELL_VOLTAGE);
		if(channel <= 7)
		{
		    adcT = 	Adc_Collect(CELL_TEMPERATURE);
			if(channel == 2)Temperature[0] = TemperatureLine(adcT);
			if(channel == 1)Temperature[1] = TemperatureLine(adcT);
			if(channel == 0)Temperature[2] = TemperatureLine(adcT);
			if(channel == 3)Temperature[3] = TemperatureLine(adcT);
			if(channel == 4)Temperature[4] = TemperatureLine(adcT);
			if(channel == 6)Temperature[5] = TemperatureLine(adcT);
			if(channel == 7)Temperature[6] = TemperatureLine(adcT);
			if(channel == 5)Temperature[7] = TemperatureLine(adcT);
		}
		else if(channel == 8)
		     {
			 	adcT = 	Adc_Collect(OUTS_TEMPERATURE);
			 	Temperature[channel] = TemperatureLine(adcT);
			 }
	}
	//RunLed = ~RunLed;
}
/**
********************************************************************************************************
** 名  称: void SystermInitiate(void)
** 功  能:
** 作 者: 李  伟 
** 日 期: 2008年12月09日
**------------------------------------------------------------------------------------------------------
** 修改人: 	
** 日 期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************
**/
void SystermInitiate(void)
{
	uint8 i;
	uint16 address;
    if(EepReadByte(0x2E00) != 119)//第四扇区
	{
		EepSectotErase(0x2E00);	  //擦除第四扇区
		EepWriteByte(119,0x2E00); //写入119定值
		CUK   = 10000;	 //单体电池电压采集系数
		CTK   = 10000;	 //单体电池温度采集系数
		OTK   = 10000;	 //环境温度系数
		P1M0 &= 0xFD; 	 //将RS485通讯使能端设为推挽模式
		P1M1 |= 0x02;
	
		ModeSysConfig[0] = 2600;	   //CellVlow    单体电压下限2600mV
		ModeSysConfig[1] = 4200;       //CellVhigh   单体电压上限4200mV
		ModeSysConfig[2] = 56000;      //PackOV      电池组充电过压限值56.0V
		ModeSysConfig[3] = 40500;	   //PackUV      电池组放电欠压限值40.5V
		ModeSysConfig[4] = 2000;	   //ChargeOC    充电电流限值 2A
		ModeSysConfig[5] = 10000;	   //DisChargeOC 放电电流限值10A
		ModeSysConfig[6] = 3000;	   //ReCellVlow  单体电池电压恢复下限 3000mV
		ModeSysConfig[7] = 4000;	   //ReCellVhigh 单体电池电压恢复上限 4000mV 
		ModeSysConfig[8] = ReadKey();  //BoardAddress读取本机地址
	
		ModeTempCofing[0] =   5;       //ChargeTlow     充电温度下限  5 摄氏度
		ModeTempCofing[1] =  45;	   //ChargeThigh    充电温度上限 45 摄氏度
		ModeTempCofing[2] = -10;	   //DisChargeTlow  放电温度下限-10 摄氏度(光宇标准)
		ModeTempCofing[3] =  55;	   //DisChargeThigh 放电温度上限 55 摄氏度(光宇标准)
		ModeTempCofing[4] =  55;	   //EnvironmentOT  环境温度告警值与放电温度告警值相同
		ModeTempCofing[5] = -10;       //EnvironmentUT
		ModeTempCofing[6] =	 53;	   //ReEnvironmentOT环境温度告警恢复限值与放电温度告警恢复限值相同
		ModeTempCofing[7] = -8;        //ReEnvironmentUT
		ModeTempCofing[8] =  7;        //ReChargeTlow    充电低温恢复限值  7 摄氏度
		ModeTempCofing[9] =  43;	   //ReChargeThigh   充电高温恢复限值 43 摄氏度
		ModeTempCofing[10] = -8;       //ReDisChargeTlow 放电低温恢复限值 -8 摄氏度
		ModeTempCofing[11] = 53;       //ReDisChargeThigh放电高温恢复限值 53 摄氏度
		address =  0x2800;
		EepSectotErase(address);	   //擦除第一扇区写入默认值
	    for(i = 0;i < 9;i++)
		{
			EepWriteWord(ModeSysConfig[i],address);
			address++;
			address++;
		}
		address = 0x2A00;
		EepSectotErase(address);	   //擦除第二扇区写入默认值
		for(i = 0;i < 12;i++)
		{
			EepWriteByte(ModeTempCofing[i],address);
			address++;
		}
		EepSectotErase(0x2C00);		   //擦除第三扇区写入默认值
		EepWriteWord(CUK,0x2C00);	   //单体电池电压采集系数
		EepWriteWord(CTK,0x2C02);	   //单体电池温度采集系数
		EepWriteWord(OTK,0x2C04);	   //环境温度系数

		AlarmInitiate ();              //初始化告警
		Initiate_RS485();			   //初始化485
		Initiate_RS232();			   //初始化232
		soft_receive_enable();		   // 模拟串口允许接收
		COMEN       = CommRxden;	   //RS485通讯允许接收
		ChargeEn    = ChargeEnable;    //使能充电
		DisChargeEn = DisChargeEnable; //使能放电	
	}
	else if(EepReadByte(0x2E00) == 119)
		 {
		 	 P1M0 &= 0xFD; 	 //将RS485通讯使能端设为推挽模式
			 P1M1 |= 0x02;
		 	 CUK = EepReadWord(0x2C00);   //单体电池电压采集系数
			 CTK = EepReadWord(0x2C02);   //单体电池温度采集系数
			 OTK = EepReadWord(0x2C04);   //环境温度系数
			 address =  0x2800;	 
			 for(i = 0;i < 8;i++)
			 {
			 	ModeSysConfig[i] = EepReadWord(address);
				address++;
				address++;
			 }
			 ModeSysConfig[8] = ReadKey();  //BoardAddress读取本机地址
			 address = 0x2A00;
			 for(i = 0;i < 12;i++)
			 {
			 	ModeTempCofing[i] = EepReadByte(address);
				address++;
			 }	
			 AlarmInitiate ();              //初始化告警
			 Initiate_RS485();			    //初始化485
			 Initiate_RS232();			    //初始化232
			 soft_receive_enable();			// 模拟串口允许接收
			 COMEN       = CommRxden;	    //RS485通讯允许接收
			 ChargeEn    = ChargeEnable;    //使能充电
			 DisChargeEn = DisChargeEnable; //使能放电		 }
}
/**
********************************************************************************************************
** 名  称: void Main (void)
** 功  能:
** 作 者: 李  伟 
** 日 期: 2008年12月09日
**------------------------------------------------------------------------------------------------------
** 修改人: 	
** 日 期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************
**/
void main(void)
{	  
	SystermInitiate();
	while(1)
	{	    						   
		Voltage_Collect();			   //采信各模拟量
		//WorkMode = WorkModeJudge();	   //判断工作模式
	    ModeSysConfig[8] = ReadKey();  //BoardAddress
		WorkMode = DisChargeStep;
		if(WorkMode == ChargeStep)	   //充电管理
		{
			RunLed = 0;                //充电时指示灯一直亮起,
			SignalCellT(Temperature, 9,ChargeStep);	   //单只电池温度告警查询
			SignalCellV(CellVoltage,15,ChargeStep);	   //单只电池温度告警查询
			ChargeAndDisChargeEnable  (ChargeStep);    //放电使能查询			
		}
		if(WorkMode == DisChargeStep)  //放电管理
		{
			RunLed = ~RunLed;		   //放电时指示灯闪烁/秒
			SignalCellT(Temperature, 9,DisChargeStep); //单只电池温度告警查询
			SignalCellV(CellVoltage,15,DisChargeStep); //单只电池电压告警查询
			ChargeAndDisChargeEnable  (DisChargeStep); //放电使能查询		
		}
		if(Rs232Massageflag == 1)      //模拟串口通讯标志
		{
			Rs232Massageflag = 0;
			soft_send_enable();
			Rs232CommManage ();
			soft_receive_enable();
		}
		if(Massageflag == 1)		   //RS485通讯标志
		{	
			Massageflag = 0;
			COMEN = CommTxden;
			CommRs485Manage();
			COMEN = CommRxden;
		}
	}
}
/********************************************************************************************************
                                               End of file
********************************************************************************************************/

⌨️ 快捷键说明

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