#include "STC8.H" #include /*************** 宏定义 **************/ #define FOSC 11059200UL //MCU工作频率为11.0592MHz #define BRT (65536 - FOSC / 115200 / 4) //串口通信波特率为115200 #define IAP_ADDRESS 0x0000 #define LED_ON P00 = 0 #define LED_OFF P00 = 1 #define WT_30M 0x80 #define WT_24M 0x81 #define WT_20M 0x82 #define WT_12M 0x83 #define WT_6M 0x84 #define WT_3M 0x85 #define WT_2M 0x86 #define WT_1M 0x87 #define ISP_STANDBY() ISP_CMD = 0 /* ISP空闲命令(禁止)*/ #define ISP_READ() ISP_CMD = 1 /* ISP读出命令 */ #define ISP_WRITE() ISP_CMD = 2 /* ISP写入命令 */ #define ISP_ERASE() ISP_CMD = 3 /* ISP擦除命令 */ //sfr ISP_TRIG = 0xC6; #define ISP_TRIG() ISP_TRIG = 0x5A, ISP_TRIG = 0xA5 /* ISP触发命令 */ // 7 6 5 4 3 2 1 0 Reset Value //sfr ISP_CONTR = 0xC7; ISPEN SWBS SWRST CFAIL - WT2 WT1 WT0 0000,x000 //ISP Control Register #define ISP_EN (1<<7) #define ISP_SWBS (1<<6) #define ISP_SWRST (1<<5) #define ISP_CMD_FAIL (1<<4) #define ISP_WAIT_1MHZ 7 #define ISP_WAIT_2MHZ 6 #define ISP_WAIT_3MHZ 5 #define ISP_WAIT_6MHZ 4 #define ISP_WAIT_12MHZ 3 #define ISP_WAIT_20MHZ 2 #define ISP_WAIT_24MHZ 1 #define ISP_WAIT_30MHZ 0 #if (FOSC >= 24000000L) #define ISP_WAIT_FREQUENCY ISP_WAIT_30MHZ #elif (FOSC >= 20000000L) #define ISP_WAIT_FREQUENCY ISP_WAIT_24MHZ #elif (FOSC >= 12000000L) #define ISP_WAIT_FREQUENCY ISP_WAIT_20MHZ #elif (FOSC >= 6000000L) #define ISP_WAIT_FREQUENCY ISP_WAIT_12MHZ #elif (FOSC >= 3000000L) #define ISP_WAIT_FREQUENCY ISP_WAIT_6MHZ #elif (FOSC >= 2000000L) #define ISP_WAIT_FREQUENCY ISP_WAIT_3MHZ #elif (FOSC >= 1000000L) #define ISP_WAIT_FREQUENCY ISP_WAIT_2MHZ #else #define ISP_WAIT_FREQUENCY ISP_WAIT_1MHZ #endif /***************函数声明**************/ void PWM_Init(); void PWM_TO_DAC(unsigned int PowerVol,unsigned int OutVol); void Timer0_Init(); void UART1_Init(); void ADC_Init(); void UartSendData(void); void DataParsing(void); void AutoAction(void); void Read_ADC(); void Delay10ms(); void DisableEEPROM(void); void EEPROM_read_n(unsigned int EE_address,unsigned char *DataAddress,unsigned int number); void EEPROM_SectorErase(unsigned int EE_address); void EEPROM_write_n(unsigned int EE_address,unsigned char *DataAddress,unsigned int number); void Parameter_Save(void); unsigned int Get_ADC12bitResult(unsigned char channel); //channel = 0~14 unsigned int ADC_Average(unsigned int *buff,unsigned int num,unsigned int threshold); /***************变量定义**************/ bit busy = 0; bit SendEN = 0; bit SendInit = 0; bit Rx_Busy = 0; bit PWM_ON = 0; bit Uart1Ready_R = 0; bit AcqInitFlag = 0; bit AD_Refresh = 0; bit Save_Flag = 0; bit PWM_ON_EN = 0; unsigned char xdata Rxbuff[20]; unsigned char xdata aRxBufferTemp = 0; unsigned char xdata RX_5A_OK=0,RX_A5_OK=0; unsigned char xdata Rx_count_UART1= 0; //UART1接收计数器 unsigned char xdata Rx_Cnt = 0; unsigned char xdata SendBuffer[50]; unsigned char xdata TableRead[50]; unsigned char xdata TableWrite[50]; unsigned int xdata ADC_EXT_Value = 0; unsigned int xdata ADC0_Value = 0; unsigned int xdata ADC1_Value = 0; unsigned int xdata ADC2_Value = 0; unsigned int xdata TwinkleCnt = 0; unsigned int xdata Cnt = 0,Times = 0,AcqInitCnt = 0; unsigned int xdata UartCnt = 0; unsigned int xdata SentCnt = 0; unsigned int xdata ADC_Cnt = 0; unsigned int xdata Time_Cnt = 0,Time_Sec = 0,Time_Min = 0,Save_Cnt = 0; unsigned int xdata ADC_EXT_Temp[120]; unsigned int xdata ADC0_Temp[120]; unsigned int xdata ADC1_Temp[120]; unsigned int xdata ADC2_Temp[120]; unsigned int xdata RunTime = 0; //运行时间 unsigned int xdata InVoltage = 12000; //输入电压 unsigned int xdata OutVoltage = 0; //输出电压 unsigned int xdata EXT_Value = 0; //外部电压 unsigned int xdata SetVoltage = 0; //设置电压 unsigned int xdata SetCorroV = 0; //腐蚀电压 unsigned int xdata AcqVolatage= 0; //采集电压 unsigned int xdata OutCurrent = 0; //输出电流(放大10倍后屏显示的电流) unsigned int xdata OutSet = 0; //输出设置 unsigned int xdata DisSet = 0; //显示设置 unsigned int xdata OutTemp; unsigned int xdata CalibrationVoltage = 0; //设定的输出电压 unsigned int xdata InitAcqVolatage = 0; //初始采集电压 unsigned int xdata InitAcqCurrent = 0; //初始采集电流 unsigned int xdata AcqVolatage1 = 0; //采集电压1 unsigned int xdata Limitvoltage = 0; //极限电压 unsigned int xdata Temp01 = 0; //辅助运算 unsigned int xdata Temp02 = 0; unsigned int xdata AcqError = 0; //实时采集误差 unsigned int xdata InitError = 0; //初始误差 unsigned char xdata Shut_Hour = 0; unsigned char xdata Shut_Min = 0; unsigned char xdata Shut_Sec = 0; unsigned int xdata Shut_MS = 0; int OffsetVoltage = 0; //补偿电压 float xdata IA; //实际输出电流 float xdata CurrentError = 0; float xdata AdjVoltage = 0; //调节电压 float xdata CompensationValue = 0; //补偿系数 float xdata OutGain = 0; //输出增益调节 /*************** 主函数 **************/ void main() { Timer0_Init(); PWM_Init(); UART1_Init(); ADC_Init(); ES = 1; EA = 1; UartCnt = 0; SendEN = 0; ADC_Cnt = 0; Times = 0; Delay10ms(); Delay10ms(); Delay10ms(); Delay10ms(); EEPROM_read_n(IAP_ADDRESS,TableRead,18); //从EEPROM读取数据 RunTime = TableRead[0] *256UL + TableRead[1] ; //读EEPROM数据--运行时间 SetVoltage = TableRead[2] *256UL + TableRead[3] ; //读EEPROM数据--设置电压 SetCorroV = TableRead[4] *256UL + TableRead[5] ; //读EEPROM数据--腐蚀电压 OutSet = TableRead[6] *256UL + TableRead[7] ; //读EEPROM数据--输出设置 DisSet = TableRead[8] *256UL + TableRead[9]; //读EEPROM数据--显示设置 CurrentError = (float)(TableRead[10] *256UL + TableRead[11])/100 ; //读EEPROM数据--电流误差 AdjVoltage = (float)(TableRead[12] *256UL + TableRead[13]) ; // 读EEPROM数据--调节电压 AcqError = (float)(TableRead[14] *256UL + TableRead[15])/10 ; // 读EEPROM数据--采集误差 Limitvoltage = TableRead[16]*256UL + TableRead[17]; //读EEPROM数据--极限电压(新增) //第一次运行程序,EEPROM数据全是FFFF,进行参数初始化处理 if(RunTime==0xFFFF) { RunTime = 0; } if(SetVoltage==0xFFFF) { SetVoltage = 2000; } if(SetCorroV==0xFFFF) { SetCorroV = 920; } if(Limitvoltage==0xFFFF) { Limitvoltage = 1600; } if(AdjVoltage==0xFFFF) { AdjVoltage = 3; } if(CurrentError==(0xFFFF)/100.0) { CurrentError = 1000; } if(AcqError==(0xFFFF)/10.0) { AcqError = 100; } if(OutSet==0xFFFF) { OutSet = 10000; } if(DisSet==0xFFFF) { DisSet = 16146; } OutGain = (float)OutSet/10000; CalibrationVoltage = SetVoltage; PWM_TO_DAC(5000,(unsigned int)(CalibrationVoltage *OutGain)+(unsigned int)IA);//供电电压为:5000MV,负载端输出电压为:CalibrationVoltage,单片机口输出电压为:SetOutVoltage/3 AcqInitCnt = 0; while (1) { DataParsing(); //串口数据解析 UartSendData(); //串口定时发送数据 Read_ADC(); //AD采集数据处理 Parameter_Save(); if(AcqInitFlag==0) //上电采集初始电压 { if(AcqInitCnt>1000) //上电3秒内采集初始电压,时间可修改 { InitAcqVolatage = AcqVolatage; //获取初始电压 InitAcqCurrent = (unsigned int)IA; //获取初始电流 AcqInitFlag = 1; AcqInitCnt = 0; } } if(EXT_Value<1000) //外部电压小于1000mV { // LED_OFF; LED_ON; // 万博专用 if(AD_Refresh) { PWM_TO_DAC(5000,0);//PWM输出0V(可能存在死区,适当修改输出值尽可能让输出接近0V) AD_Refresh = 0; } } if(EXT_Value>1800)//外部电压大于2000mV { AutoAction(); //运行自动程序 } } } void AutoAction(void) { if(!PWM_ON_EN)//PWM输出使能 if(AcqVolatage>=Limitvoltage)//采集电压大于1500mV,或电流小于0.5mA,关闭输出 { if(AD_Refresh) LED_ON; // LED_OFF; { PWM_ON_EN = 1; Shut_Hour = 0; Shut_Min = 0; Shut_Sec = 0; Shut_MS = 0; // PWM_ON = 1; PWM_TO_DAC(5000,0); AD_Refresh = 0; } } else { { //主逻辑 // if((AcqVolatage<500)||(AcqVolatage>SetCorroV+IA*100)) //采集电压小于100MV,输出电压等于设置电压 if(AcqVolatage<400) { //输出电压 PWM_TO_DAC(5000,(unsigned int)(SetVoltage*OutGain+(unsigned int)IA)); AD_Refresh = 0; } else { if(AD_Refresh) { if(AcqVolatage<400) { AcqVolatage1 = 400; } else if((AcqVolatage>=400)&&(AcqVolatage<=2000)) { AcqVolatage1 = AcqVolatage; } else { AcqVolatage1 =2000; } //根据腐蚀电压补偿 if(AcqVolatage1>SetCorroV) //采集电压大于设定的腐蚀电压,负补偿 { Temp01 = AcqVolatage1-SetCorroV; if((Temp01>=0)&&(Temp01<10)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/5); } else if((Temp01>=10)&&(Temp01<30)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/10); } else if((Temp01>=30)&&(Temp01<50)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/15); } else if((Temp01>=50)&&(Temp01<70)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/20); } else if((Temp01>=70)&&(Temp01<90)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/25); } else if((Temp01>=90)&&(Temp01<110)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/30); } else if((Temp01>=110)&&(Temp01<130)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/35); } else if((Temp01>=130)&&(Temp01<150)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/40); } else if((Temp01>=150)&&(Temp01<170)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/45); } else if((Temp01>=170)&&(Temp01<190)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/50); } else if((Temp01>=190)&&(Temp01<210)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/55); } else if((Temp01>=210)&&(Temp01<230)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/60); } else if((Temp01>=230)&&(Temp01<250)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/65); } else if((Temp01>=250)&&(Temp01<270)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/70); } else if((Temp01>=270)&&(Temp01<290)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/75); } else if((Temp01>=290)&&(Temp01<310)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/80); } else if((Temp01>=310)&&(Temp01<330)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/85); } else if((Temp01>=330)&&(Temp01<350)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/90); } else if((Temp01>=350)&&(Temp01<370)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/95); } else if((Temp01>=370)&&(Temp01<390)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/100); } else if((Temp01>=390)&&(Temp01<410)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/105); } else if((Temp01>=410)&&(Temp01<430)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/110); } else if((Temp01>=430)&&(Temp01<450)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/115); } else if((Temp01>=450)&&(Temp01<470)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/120); } else if((Temp01>=470)&&(Temp01<490)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/125); } else if((Temp01>=490)&&(Temp01<510)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/130); } else if((Temp01>=510)&&(Temp01<530)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/135); } else if((Temp01>=530)&&(Temp01<550)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/140); } else if((Temp01>=550)&&(Temp01<570)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/145); } else if((Temp01>=570)&&(Temp01<590)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/150); } else if((Temp01>=590)&&(Temp01<610)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/155); } else if((Temp01>=610)&&(Temp01<630)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/160); } else if((Temp01>=630)&&(Temp01<650)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/165); } else if((Temp01>=650)&&(Temp01<670)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/170); } else if((Temp01>=670)&&(Temp01<690)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/175); } else if((Temp01>=690)&&(Temp01<710)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/180); } else if((Temp01>=710)&&(Temp01<730)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/185); } else if((Temp01>=730)&&(Temp01<750)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/190); } else if((Temp01>=750)&&(Temp01<770)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/195); } else if((Temp01>=770)&&(Temp01<790)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/200); } else if((Temp01>=790)&&(Temp01<810)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/205); } else if((Temp01>=810)&&(Temp01<830)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/210); } else if((Temp01>=830)&&(Temp01<850)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/215); } else if((Temp01>=850)&&(Temp01<870)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/220); } else if((Temp01>=870)&&(Temp01<890)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/225); } else if((Temp01>=890)&&(Temp01<910)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/230); } else if((Temp01>=910)&&(Temp01<930)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/235); } else if((Temp01>=930)&&(Temp01<950)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/240); } else if((Temp01>=950)&&(Temp01<970)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/245); } else if((Temp01>=970)&&(Temp01<990)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/250); } else if((Temp01>=990)&&(Temp01<1010)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/255); } else if((Temp01>=1010)&&(Temp01<1030)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/260); } else if((Temp01>=1030)&&(Temp01<1050)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/265); } else if((Temp01>=1050)&&(Temp01<1070)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/270); } else if((Temp01>=1070)&&(Temp01<1090)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/275); } else if((Temp01>=1090)&&(Temp01<1110)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/280); } else if((Temp01>=1110)&&(Temp01<1130)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/285); } else if((Temp01>=1130)&&(Temp01<1150)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/290); } else if((Temp01>=1150)&&(Temp01<1170)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/295); } else if((Temp01>=1170)&&(Temp01<1190)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/300); } else if((Temp01>=1190)&&(Temp01<1210)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/305); } else if((Temp01>=1210)&&(Temp01<1230)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/310); } else if((Temp01>=1230)&&(Temp01<1250)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/315); } else if((Temp01>=1250)&&(Temp01<1270)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/320); } else if((Temp01>=1270)&&(Temp01<1290)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/325); } else if((Temp01>=1290)&&(Temp01<1310)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/330); } else if((Temp01>=1310)&&(Temp01<1330)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/335); } else if((Temp01>=1330)&&(Temp01<1350)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/340); } else if((Temp01>=1350)&&(Temp01<1370)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/345); } else if((Temp01>=1370)&&(Temp01<1390)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/350); } else if((Temp01>=1390)&&(Temp01<1410)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/355); } else if((Temp01>=1410)&&(Temp01<1430)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/360); } else if((Temp01>=1430)&&(Temp01<1450)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/365); } else if((Temp01>=1450)&&(Temp01<1470)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/370); } else if((Temp01>=1470)&&(Temp01<1490)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/375); } else if((Temp01>=1490)&&(Temp01<1510)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/380); } else if((Temp01>=1510)&&(Temp01<1530)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/385); } else if((Temp01>=1530)&&(Temp01<1550)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/390); } else if((Temp01>=1550)&&(Temp01<1570)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/395); } else if((Temp01>=1570)&&(Temp01<1590)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/400); } else if((Temp01>=1590)&&(Temp01<1610)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/405); } else if((Temp01>=1610)&&(Temp01<1630)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/410); } else if((Temp01>=1630)&&(Temp01<1650)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/415); } else if((Temp01>=1650)&&(Temp01<1670)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/420); } else if((Temp01>=1670)&&(Temp01<1690)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/425); } else if((Temp01>=1690)&&(Temp01<1710)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/430); } else if((Temp01>=1710)&&(Temp01<1730)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/435); } else if((Temp01>=1730)&&(Temp01<1750)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/440); } else if((Temp01>=1750)&&(Temp01<1770)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/445); } else if((Temp01>=1770)&&(Temp01<1790)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/450); } else if((Temp01>=1790)&&(Temp01<1810)) { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/455); } else { CalibrationVoltage = CalibrationVoltage - (unsigned int)(Temp01*AdjVoltage/460); } } if(AcqVolatage1=0)&&(Temp02<10)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/5); } else if((Temp02>=10)&&(Temp02<30)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/10); } else if((Temp02>=30)&&(Temp02<50)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/15); } else if((Temp02>=50)&&(Temp02<70)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/20); } else if((Temp02>=70)&&(Temp02<90)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/25); } else if((Temp02>=90)&&(Temp02<110)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/30); } else if((Temp02>=110)&&(Temp02<130)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/35); } else if((Temp02>=130)&&(Temp02<150)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/40); } else if((Temp02>=150)&&(Temp02<170)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/45); } else if((Temp02>=170)&&(Temp02<190)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/50); } else if((Temp02>=190)&&(Temp02<210)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/55); } else if((Temp02>=210)&&(Temp02<230)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/60); } else if((Temp02>=230)&&(Temp02<250)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/65); } else if((Temp02>=250)&&(Temp02<270)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/70); } else if((Temp02>=270)&&(Temp02<290)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/75); } else if((Temp02>=290)&&(Temp02<310)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/80); } else if((Temp02>=310)&&(Temp02<330)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/85); } else if((Temp02>=330)&&(Temp02<350)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/90); } else if((Temp02>=350)&&(Temp02<370)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/95); } else if((Temp02>=370)&&(Temp02<390)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/100); } else if((Temp02>=390)&&(Temp02<410)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/105); } else if((Temp02>=410)&&(Temp02<430)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/110); } else if((Temp02>=430)&&(Temp02<450)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/115); } else if((Temp02>=450)&&(Temp02<470)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/120); } else if((Temp02>=470)&&(Temp02<490)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/125); } else if((Temp02>=490)&&(Temp02<510)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/130); } else if((Temp02>=510)&&(Temp02<530)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/135); } else if((Temp02>=530)&&(Temp02<550)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/140); } else if((Temp02>=550)&&(Temp02<570)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/145); } else if((Temp02>=570)&&(Temp02<590)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/150); } else if((Temp02>=590)&&(Temp02<610)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/155); } else if((Temp02>=610)&&(Temp02<630)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/160); } else if((Temp02>=630)&&(Temp02<650)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/165); } else if((Temp02>=650)&&(Temp02<670)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/170); } else if((Temp02>=670)&&(Temp02<690)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/175); } else if((Temp02>=690)&&(Temp02<710)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/180); } else if((Temp02>=710)&&(Temp02<730)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/185); } else if((Temp02>=730)&&(Temp02<750)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/190); } else if((Temp02>=750)&&(Temp02<770)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/195); } else if((Temp02>=770)&&(Temp02<790)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/200); } else if((Temp02>=790)&&(Temp02<810)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/205); } else if((Temp02>=810)&&(Temp02<830)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/210); } else if((Temp02>=830)&&(Temp02<850)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/215); } else if((Temp02>=850)&&(Temp02<870)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/220); } else if((Temp02>=870)&&(Temp02<890)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/225); } else if((Temp02>=890)&&(Temp02<910)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/230); } else if((Temp02>=910)&&(Temp02<930)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/235); } else if((Temp02>=930)&&(Temp02<950)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/240); } else if((Temp02>=950)&&(Temp02<970)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/245); } else if((Temp02>=970)&&(Temp02<990)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/250); } else if((Temp02>=990)&&(Temp02<1010)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/255); } else if((Temp02>=1010)&&(Temp02<1030)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/260); } else if((Temp02>=1030)&&(Temp02<1050)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/265); } else if((Temp02>=1050)&&(Temp02<1070)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/270); } else if((Temp02>=1070)&&(Temp02<1090)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/275); } else if((Temp02>=1090)&&(Temp02<1110)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/280); } else if((Temp02>=1110)&&(Temp02<1130)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/285); } else if((Temp02>=1130)&&(Temp02<1150)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/290); } else if((Temp02>=1150)&&(Temp02<1170)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/295); } else if((Temp02>=1170)&&(Temp02<1190)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/300); } else if((Temp02>=1190)&&(Temp02<1210)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/305); } else if((Temp02>=1210)&&(Temp02<1230)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/310); } else if((Temp02>=1230)&&(Temp02<1250)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/315); } else if((Temp02>=1250)&&(Temp02<1270)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/320); } else if((Temp02>=1270)&&(Temp02<1290)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/325); } else if((Temp02>=1290)&&(Temp02<1310)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/330); } else if((Temp02>=1310)&&(Temp02<1330)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/335); } else if((Temp02>=1330)&&(Temp02<1350)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/340); } else if((Temp02>=1350)&&(Temp02<1370)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/345); } else if((Temp02>=1370)&&(Temp02<1390)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/350); } else if((Temp02>=1390)&&(Temp02<1410)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/355); } else if((Temp02>=1410)&&(Temp02<1430)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/360); } else if((Temp02>=1430)&&(Temp02<1450)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/365); } else if((Temp02>=1450)&&(Temp02<1470)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/370); } else if((Temp02>=1470)&&(Temp02<1490)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/375); } else if((Temp02>=1490)&&(Temp02<1510)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/380); } else if((Temp02>=1510)&&(Temp02<1530)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/385); } else if((Temp02>=1530)&&(Temp02<1550)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/390); } else if((Temp02>=1550)&&(Temp02<1570)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/395); } else if((Temp02>=1570)&&(Temp02<1590)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/400); } else if((Temp02>=1590)&&(Temp02<1610)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/405); } else if((Temp02>=1610)&&(Temp02<1630)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/410); } else if((Temp02>=1630)&&(Temp02<1650)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/415); } else if((Temp02>=1650)&&(Temp02<1670)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/420); } else if((Temp02>=1670)&&(Temp02<1690)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/425); } else if((Temp02>=1690)&&(Temp02<1710)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/430); } else if((Temp02>=1710)&&(Temp02<1730)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/435); } else if((Temp02>=1730)&&(Temp02<1750)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/440); } else if((Temp02>=1750)&&(Temp02<1770)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/445); } else if((Temp02>=1770)&&(Temp02<1790)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/450); } else if((Temp02>=1790)&&(Temp02<1810)) { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/455); } else { CalibrationVoltage = CalibrationVoltage + (unsigned int)(Temp02*AdjVoltage/460); } } OffsetVoltage = SetVoltage - CalibrationVoltage;//计算补偿电压值(带符号) PWM_TO_DAC(5000,(unsigned int)(CalibrationVoltage *OutGain+(unsigned int)IA)); } AD_Refresh = 0; } } //指示灯 // if((AcqVolatage>500)&&(IA>0.05))//采集电压大于100MV // { // LED_OFF; // } // else // { // LED_ON; // } if(AcqVolatage>500) // 万博专用 { LED_ON; } else { LED_OFF; } } OutCurrent = (unsigned int)(IA*100); //放大10倍后的电流(触摸屏显示用) } void Delay10ms() //@11.0592MHz { unsigned char i, j; _nop_(); _nop_(); i = 144; j = 157; do { while (--j); } while (--i); } /*======================================================================== // 函数: DisableEEPROM(void) // 描述: 禁止访问ISP/IAP. // 参数: non. // 返回: non. // 版本: V1.0 //======================================================================== */ void DisableEEPROM(void) { ISP_CONTR = 0; //关闭ISP功能 ISP_CMD = 0; //清除命令寄存器 ISP_TRIG = 0; //清除触发寄存器 ISP_ADDRH = 0x80; //将地址设置到非ISP区域 ISP_ADDRL = 0x00; } /*======================================================================== // 函数: void EEPROM_read_n(unsigned int EE_address,unsigned char *DataAddress,unsigned int number) // 描述: 从指定EEPROM首地址读出n个字节放指定的缓冲. // 参数: EE_address: 读出EEPROM的首地址. // DataAddress: 读出数据放缓冲的首地址. // number: 读出的字节长度. // 返回: non. // 版本: V1.0 //======================================================================== */ void EEPROM_read_n(unsigned int EE_address,unsigned char *DataAddress,unsigned int number) { // EA = 0; //禁止中断 ISP_CONTR = (ISP_EN + ISP_WAIT_FREQUENCY); //设置等待时间,允许ISP/ISP操作,送一次就够 ISP_READ(); //送字节读命令,命令不需改变时,不需重新送命令 do { ISP_ADDRH = EE_address / 256; //送地址高字节(地址需要改变时才需重新送地址) ISP_ADDRL = EE_address % 256; //送地址低字节 ISP_TRIG(); //先送5AH,再送A5H到ISP/ISP触发寄存器,每次都需要如此 //送完A5H后,ISP/ISP命令立即被触发启动 //CPU等待ISP完成后,才会继续执行程序。 _nop_(); *DataAddress = ISP_DATA; //读出的数据送往 EE_address++; DataAddress++; }while(--number); DisableEEPROM(); // EA = 1; //重新允许中断 } /******************** 扇区擦除函数 *****************/ /*======================================================================== // 函数: void EEPROM_SectorErase(unsigned int EE_address) // 描述: 把指定地址的EEPROM扇区擦除. // 参数: EE_address: 要擦除的扇区EEPROM的地址. // 返回: non. // 版本: V1.0 //======================================================================== */ void EEPROM_SectorErase(unsigned int EE_address) { // EA = 0; //禁止中断 //只有扇区擦除,没有字节擦除,512字节/扇区。 //扇区中任意一个字节地址都是扇区地址。 ISP_ADDRH = EE_address / 256; //送扇区地址高字节(地址需要改变时才需重新送地址) ISP_ADDRL = EE_address % 256; //送扇区地址低字节 ISP_CONTR = (ISP_EN + ISP_WAIT_FREQUENCY); //设置等待时间,允许ISP/ISP操作,送一次就够 ISP_ERASE(); //送扇区擦除命令,命令不需改变时,不需重新送命令 ISP_TRIG(); _nop_(); DisableEEPROM(); // EA = 1; //重新允许中断 } /*======================================================================== // 函数: void EEPROM_write_n(unsigned int EE_address,unsigned char *DataAddress,unsigned int number) // 描述: 把缓冲的n个字节写入指定首地址的EEPROM. // 参数: EE_address: 写入EEPROM的首地址. // DataAddress: 写入源数据的缓冲的首地址. // number: 写入的字节长度. // 返回: non. // 版本: V1.0 //======================================================================== */ void EEPROM_write_n(unsigned int EE_address,unsigned char *DataAddress,unsigned int number) { // EA = 0; //禁止中断 ISP_CONTR = (ISP_EN + ISP_WAIT_FREQUENCY); //设置等待时间,允许ISP/ISP操作,送一次就够 ISP_WRITE(); //送字节写命令,命令不需改变时,不需重新送命令 do { ISP_ADDRH = EE_address / 256; //送地址高字节(地址需要改变时才需重新送地址) ISP_ADDRL = EE_address % 256; //送地址低字节 ISP_DATA = *DataAddress; //送数据到ISP_DATA,只有数据改变时才需重新送 ISP_TRIG(); _nop_(); EE_address++; DataAddress++; }while(--number); DisableEEPROM(); // EA = 1; //重新允许中断 } /*======================================================================== // 函数: ADC_Init() // 描述: ADC_Init初始化 // 参数: 无 // 返回: 无 // 版本: VER1.0 // 日期: 2017-12-9 // 备注: //======================================================================== */ void ADC_Init() { P1M0 = 0x00; //设置P1.4、P1.5、P1.6、P1.7为ADC口 P1M1 = 0xF0; ADCCFG |= 0x2F; //设置ADC时钟为系统时钟/2/16/Speed,设置结果右对齐 ADC_CONTR = 0x80; //使能ADC模块 ADC_CONTR |= 0x40; //启动AD转换 } /*======================================================================== // 函数: unsigned int Get_ADC12bitResult(unsigned char channel) // 描述: 查询法读一次ADC结果. // 参数: channel: 选择要转换的ADC. // 返回: 12位ADC结果. // 版本: VER1.0 // 日期: 2017-12-9 // 备注: //======================================================================== */ unsigned int Get_ADC12bitResult(unsigned char channel) //channel = 0~14 { ADC_RES = 0; ADC_RESL = 0; ADC_CONTR = (ADC_CONTR & 0xe0) | 0x40 | channel; //start the ADC _nop_(); _nop_(); while((ADC_CONTR & 0x20) == 0); //wait for ADC finish ADC_CONTR &= ~0x20; //清除ADC结束标志 return (((unsigned int)ADC_RES << 8) | ADC_RESL); } /*======================================================================== // 函数: unsigned int ADC_Average(__IO unsigned int *buff,unsigned int num,unsigned int threshold) // 描述: 通过冒泡排序算法,去掉几个最大值和几个最小值,求剩下中间数的平均值. // 参数: *buff:带处理的数组,num:数组长度,threshold:舍弃最大值、最小值个数 // 返回: 12位ADC结果. // 版本: VER1.0 // 日期: 2017-12-9 // 备注: //======================================================================== */ unsigned int ADC_Average(unsigned int *buff,unsigned int num,unsigned int threshold) { //采集120个数据,然后进行2位过采样 unsigned long sigma = 0; unsigned int i = 0,j = 0; unsigned int temp = 0; unsigned long ADR[15]; for(j=0;j=2)//2ms采集一次AD { ADC_Cnt = 0; ADC_EXT_Temp[Times] = Get_ADC12bitResult(4);//P1.4 ADC0_Temp[Times] = Get_ADC12bitResult(5);//P1.5 ADC1_Temp[Times] = Get_ADC12bitResult(6);//P1.6 ADC2_Temp[Times] = Get_ADC12bitResult(7);//P1.7 Times ++; if(Times>=120) { Times = 0; //获取每个通道的AD值 ADC_EXT_Value = ADC_Average(ADC_EXT_Temp,120,5); ADC0_Value = ADC_Average(ADC0_Temp,120,5); ADC1_Value = ADC_Average(ADC1_Temp,120,5); ADC2_Value = ADC_Average(ADC2_Temp,120,5); //计算每个通道的实际电压 EXT_Value = ADC_EXT_Value*2498UL/16384; //计算外部电压 OutVoltage = ADC0_Value*4.03*2498UL/DisSet; //输出电压(负载两端电压),根据实际情况修改 AcqVolatage = ADC1_Value*2498UL/DisSet*1.0-AcqError; //采集电压 IA = ((float)ADC2_Value*2498UL/DisSet/10.08)/2.0-CurrentError; //实际输出电流,根据实际情况修改 AD_Refresh = 1; } } } /*======================================================================== // 函数: UART1_Init() // 描述: UART1_Init初始化 // 参数: 无 // 返回: 无 // 版本: VER1.0 // 日期: 2017-12-9 // 备注: //======================================================================== */ void UART1_Init() { SCON|= 0x50; T2L = BRT; T2H = BRT >> 8; AUXR|= 0x15; busy = 0; //串口切换 P_SW1 = 0x00; //RXD/P3.0, TXD/P3.1 // P_SW1 = 0x40; //RXD_2/P3.6, TXD_2/P3.7 // P_SW1 = 0x80; //RXD_3/P1.6, TXD_3/P1.7 // P_SW1 = 0xc0; //RXD_4/P4.3, TXD_4/P4.4 } /*======================================================================== // 函数: void UartIsr() interrupt 4 using 1 // 描述: UART1中断函数 // 参数: 无 // 返回: 无 // 版本: VER1.0 // 日期: 2017-12-9 // 备注: //======================================================================== */ void UartIsr() interrupt 4 using 1 { if (TI) { TI = 0; busy = 0; } if (RI) { RI = 0; // Rx_Busy = 1; aRxBufferTemp = SBUF; // //上位机有数据发送,停止轮发 // SendEN = 0; // UartCnt= 0; if(RX_5A_OK) { if(RX_A5_OK) { Rxbuff[Rx_count_UART1] = aRxBufferTemp; Rx_count_UART1 ++; if(Rx_count_UART1 == Rxbuff[0] + 1) //接收完成 { RX_5A_OK = 0; RX_A5_OK = 0; Rx_count_UART1 = 0; Uart1Ready_R = 1; // Rx_Busy = 0; } } else { if(aRxBufferTemp == 0xA5) { RX_A5_OK = 1; Rx_count_UART1 = 0; } else { Rx_Busy = 0; } } } else { if(aRxBufferTemp == 0x5A) { RX_5A_OK = 1; } else { Rx_Busy = 0; } } } } /*======================================================================== // 函数: void DataParsing() // 描述: UART1串口数据解析 // 参数: 无 // 返回: 无 // 版本: VER1.0 // 日期: 2017-12-9 // 备注: //======================================================================== */ void DataParsing(void) { if(Uart1Ready_R==1) //数据接收完成,处理接收到的数据 { //按键返回 if((Rxbuff[0]==0x06)&&(Rxbuff[1]==0x83)&&(Rxbuff[2]==0x00)&&(Rxbuff[3]==0x20) &&(Rxbuff[4]==0x01)&&(Rxbuff[5]==0x00)&&(Rxbuff[6]==0x00)) { //参数复位 RunTime = 0; //运行时间 Save_Cnt = 0; SetVoltage = 2000; //设置电压 SetCorroV = 650; //腐蚀电压 // SetCorroV = 920; //腐蚀电压 //万博 AdjVoltage = 3.0; //调节电压 CurrentError = 0; //电流误差 AcqError = 0; //采集误差 OutSet = 10000; DisSet = 16146; //显示设置 OutGain = 1.0000; //输出设置 Limitvoltage = 1600; //极限电压 //参数掉电保存(直接调用函数) Save_Flag = 1; Parameter_Save(); } //参数返回 if((Rxbuff[0]==0x06)&&(Rxbuff[1]==0x83)&&(Rxbuff[2]==0x00)) { if((Rxbuff[3]==0x04)&&(Rxbuff[4]==0x01)) { SetVoltage = Rxbuff[5]*256 + Rxbuff[6]; //设置电压 CalibrationVoltage = SetVoltage; //参数掉电保存(直接调用函数) Save_Flag = 1; Parameter_Save(); } if((Rxbuff[3]==0x05)&&(Rxbuff[4]==0x01)) { SetCorroV = Rxbuff[5]*256 + Rxbuff[6]; //腐蚀电压 //参数掉电保存(直接调用函数) Save_Flag = 1; Parameter_Save(); } if((Rxbuff[3]==0x0E)&&(Rxbuff[4]==0x01)) { OutSet = Rxbuff[5]*256 + Rxbuff[6]; //输出设置 OutGain = (float)OutSet/10000; //参数掉电保存(直接调用函数) Save_Flag = 1; Parameter_Save(); } if((Rxbuff[3]==0x0F)&&(Rxbuff[4]==0x01)) { DisSet = Rxbuff[5]*256 + Rxbuff[6]; //显示设置 //参数掉电保存(直接调用函数) Save_Flag = 1; Parameter_Save(); } if((Rxbuff[3]==0x10)&&(Rxbuff[4]==0x01)) { CurrentError = (float)(Rxbuff[5]*256 + Rxbuff[6])/100; //电流误差 //参数掉电保存(直接调用函数) Save_Flag = 1; Parameter_Save(); } if((Rxbuff[3]==0x11)&&(Rxbuff[4]==0x01)) { AdjVoltage = (float)(Rxbuff[5]*256 + Rxbuff[6]); //调节电压 //参数掉电保存(直接调用函数) Save_Flag = 1; Parameter_Save(); } if((Rxbuff[3]==0x0D)&&(Rxbuff[4]==0x01)) { AcqError = (float)(Rxbuff[5]*256 + Rxbuff[6])/10; //采集误差 //参数掉电保存(直接调用函数) Save_Flag = 1; Parameter_Save(); } if((Rxbuff[3]==0x12)&&(Rxbuff[4]==0x01)) { Limitvoltage= Rxbuff[5]*256 + Rxbuff[6]; //新增--极限电压 //参数掉电保存(直接调用函数) Save_Flag = 1; Parameter_Save(); } } } Uart1Ready_R = 0; } /*======================================================================== // 函数: void UartSendData() // 描述: UART1定时发送数据 // 参数: 无 // 返回: 无 // 版本: VER1.0 // 日期: 2017-12-9 // 备注: //======================================================================== */ void UartSendData(void) { //定时发送数据 if(SendEN) { if(!busy) { busy = 1; if(!SendInit) { SendBuffer[0] = 0x5A; SendBuffer[1] = 0xA5; SendBuffer[2] = 0X2F; //长度 SendBuffer[3] = 0X82; //命令 SendBuffer[4] = 0X00; //首地址H SendBuffer[5] = 0X00; //首地址L //第一页参数显示 SendBuffer[6] = RunTime>>8; //运行时间H SendBuffer[7] = RunTime; //运行时间L SendBuffer[8] = InVoltage>>8; //输入电压H SendBuffer[9] = InVoltage; //输入电压L SendBuffer[10] = OutVoltage>>8; //输出电压H SendBuffer[11] = OutVoltage; //输出电压L SendBuffer[12] = OffsetVoltage>>8; //补偿电压H SendBuffer[13] = OffsetVoltage; //补偿电压L SendBuffer[14] = SetVoltage>>8; //设置电压H SendBuffer[15] = SetVoltage; //设置电压L SendBuffer[16] = SetCorroV>>8; //腐蚀电压H SendBuffer[17] = SetCorroV; //腐蚀电压L SendBuffer[18] = AcqVolatage>>8; //采集电压H SendBuffer[19] = AcqVolatage; //采集电压L SendBuffer[20] = EXT_Value>>8; //COM电压H SendBuffer[21] = EXT_Value; //COM电压L //第二页参数显示 SendBuffer[22] = ADC0_Value>>8; //ADC0电压H SendBuffer[23] = ADC0_Value; //ADC0电压L SendBuffer[24] = ADC1_Value>>8; //ADC1电压H SendBuffer[25] = ADC1_Value; //ADC1电压L SendBuffer[26] = ADC2_Value>>8; //ADC2电压H SendBuffer[27] = ADC2_Value; //ADC2电压L SendBuffer[28] = AcqVolatage1>>8; //实时采集误差H SendBuffer[29] = AcqVolatage1; //实时采集误差L SendBuffer[30] = SetCorroV >>8; //初始误差H SendBuffer[31] = SetCorroV; //初始误差L SendBuffer[32] = AcqError>>8; //采集误差H(放大10倍显示) SendBuffer[33] = AcqError; //采集误差L(放大10倍显示) SendBuffer[34] = OutSet>>8; //输出设置H SendBuffer[35] = OutSet; //输出设置L SendBuffer[36] = DisSet>>8; //显示设置H SendBuffer[37] = DisSet; //显示设置L SendBuffer[38] = (unsigned int)(CurrentError*100)>>8; //电流误差H SendBuffer[39] = (unsigned int)(CurrentError*100); //电流误差L SendBuffer[40] = (unsigned int)AdjVoltage>>8; //调节电压H SendBuffer[41] = (unsigned int)AdjVoltage; //调节电压L SendBuffer[42] = Limitvoltage>>8; //新增-极限电压 SendBuffer[43] = Limitvoltage; //新增-极限电压 SendBuffer[44] = Shut_Min >>8; //新增-重启时间 SendBuffer[45] = Shut_Min ; //新增-重启时间 SendBuffer[46] = OutCurrent>>8; //输出电流H SendBuffer[47] = OutCurrent; //输出电流L SendInit = 1; SentCnt = 0; } SBUF = SendBuffer[SentCnt++]; if(SentCnt>47) { SendEN = 0; } } } } /*======================================================================== // 函数: Timer0_Init() // 描述: Timer0初始化 // 参数: 无 // 返回: 无 // 版本: VER1.0 // 日期: 2017-12-9 // 备注: //======================================================================== */ void Timer0_Init() { TMOD|= 0x00; //模式0 TL0 = 65536-FOSC/12/1000; TH0 = (65536-FOSC/12/1000)>>8; TR0 = 1; //启动定时器 ET0 = 1; //使能定时器中断 } /*======================================================================== // 函数: void TM0_Isr() interrupt 1 using 1 // 描述: Timer0中断函数 // 参数: 无 // 返回: 无 // 版本: VER1.0 // 日期: 2017-12-9 // 备注: //======================================================================== */ void TM0_Isr() interrupt 1 using 1 { ADC_Cnt ++; Cnt ++; AcqInitCnt ++; /*** 新增2019-11-14 ***/ if(PWM_ON_EN) { Shut_MS ++; if(Shut_MS>=1000) { Shut_MS = 0; Shut_Sec ++; if(Shut_Sec>=60) { Shut_Sec = 0; Shut_Min ++; } } } if(Shut_Min>=180)//大于3小时,恢复工作 { PWM_ON_EN = 0; Shut_Hour = 0; Shut_Min = 0; Shut_Sec = 0; Shut_MS = 0; } if(++UartCnt>=200) { UartCnt = 0; SendEN = 1; SendInit= 0; } //运行时间计时 if(++Time_Cnt>=1000) //1000ms { Time_Cnt = 0; Time_Sec ++; //1s自动加1 if(Time_Sec>=60) //60s { Time_Sec = 0; Time_Min ++; //1min自动加1 if(Time_Min>=60) //60s { Time_Min = 0; RunTime ++; Save_Cnt ++; if((Save_Cnt>0)&&((Save_Cnt%5)==0)) { Save_Flag = 1; //运行参数1个小时保存一次 Save_Cnt = 0; } } } } } /*======================================================================== // 函数: PWM_Init() // 描述: PWM初始化 // 参数: 无 // 返回: 无 // 版本: VER1.0 // 日期: 2017-12-9 // 备注: //======================================================================== */ void PWM_Init() { P_SW2 = 0x80; PWMCKS = 0x00; //PWM时钟为系统时钟 PWMC = 8192; //设置PWM周期为8192个PWM时钟 PWM5T1 = 0; //在计数值为0地方输出低电平 PWM5T2 = 8192; //在计数值为8192地方输出高电平 PWM5CR = 0x80; //使能PWM5输出 P_SW2 = 0x00; PWMCR = 0x80; //启动PWM模块 } /*======================================================================== // 函数: void PWM_TO_DAC(unsigned int PowerVol,unsigned int OutVol) // 描述: 根据输出源电压不同,输出不同电压。 // 参数: PowerVol:输出供电电压;OutVol:输出电压。 // 返回: 无 // 版本: VER1.0 // 日期: 2017-12-9 // 备注: //======================================================================== */ void PWM_TO_DAC(unsigned int PowerVol,unsigned int OutVol) { unsigned int PWM_Vlaue; if(OutVol>5500) { OutVol = 5500; } PWM_Vlaue = OutVol*8192UL/PowerVol/3;//单片机口输出电压跟负载电压比例为1:3 P_SW2 = 0x80; PWM5T1 = 0; //在计数值为0地方输出低电平 PWM5T2 = 8192-PWM_Vlaue; //在计数值为8192地方输出高电平 P_SW2 = 0x00; } /*======================================================================== // 函数: Parameter_Save() // 描述: 参数保存 // 参数: 无 // 返回: 无 // 版本: VER1.0 // 日期: 2019-2-22 // 备注: //======================================================================== */ void Parameter_Save(void) { if(Save_Flag) { //参数掉电保存 EEPROM_SectorErase(IAP_ADDRESS); TableWrite[0] = RunTime>>8; //运行时间H TableWrite[1] = RunTime; //运行时间L TableWrite[2] = SetVoltage>>8; //设置电压H TableWrite[3] = SetVoltage; //设置电压L TableWrite[4] = SetCorroV>>8; //腐蚀电压H TableWrite[5] = SetCorroV; //腐蚀电压L TableWrite[6] = OutSet>>8; //输出设置H TableWrite[7] = OutSet; //输出设置L TableWrite[8] = DisSet>>8; //显示设置H TableWrite[9] = DisSet; //显示设置L TableWrite[10] = (unsigned int)(CurrentError*100)>>8; //电流误差H TableWrite[11] = (unsigned int)(CurrentError*100); //电流误差L TableWrite[12] = (unsigned int)AdjVoltage>>8; //调节电压H TableWrite[13] = (unsigned int)AdjVoltage; //调节电压L TableWrite[14] = (unsigned int)AcqError>>8; //采集误差H TableWrite[15] = (unsigned int)AcqError; //采集误差L TableWrite[16] = Limitvoltage>>8; //新增-极限电压 TableWrite[17] = Limitvoltage; //新增-极限电压 EEPROM_write_n(IAP_ADDRESS,TableWrite,18); Save_Flag = 0; } }