#include "STC8.H" #include typedef enum { OUT_INIT = 0, OUT_RUNNING, OUT_AUTOSTOP, OUT_ERR, OUTSTATE_NUM, } OUTSTATE_t; /*************** 宏定义 **************/ #define FOSC 11059200UL // MCU工作频率为11.0592MHz #define BRT (65536 - FOSC / 115200 / 4) // 串口通信波特率为115200 #define IAP_ADDRESS 0x0000 #define LED_ON P16 = 1 #define LED_OFF P16 = 0 #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 IAP_STANDBY() IAP_CMD = 0 /* ISP空闲命令(禁止)*/ #define IAP_READ() IAP_CMD = 1 /* ISP读出命令 */ #define IAP_WRITE() IAP_CMD = 2 /* ISP写入命令 */ #define IAP_ERASE() IAP_CMD = 3 /* ISP擦除命令 */ // sfr IAP_TRIG = 0xC6; #define IAP_TRIG() IAP_TRIG = 0x5A, IAP_TRIG = 0xA5 /* ISP触发命令 */ // 7 6 5 4 3 2 1 0 Reset Value // sfr IAP_CONTR = 0xC7; ISPEN SWBS SWRST CFAIL - WT2 WT1 WT0 0000,x000 //ISP Control Register #define IAP_EN (1 << 7) #define IAP_SWBS (1 << 6) #define IAP_SWRST (1 << 5) #define IAP_CMD_FAIL (1 << 4) #define IAP_WAIT_1MHZ 7 #define IAP_WAIT_2MHZ 6 #define IAP_WAIT_3MHZ 5 #define IAP_WAIT_6MHZ 4 #define IAP_WAIT_12MHZ 3 #define IAP_WAIT_20MHZ 2 #define IAP_WAIT_24MHZ 1 #define IAP_WAIT_30MHZ 0 #if (FOSC >= 24000000L) #define IAP_WAIT_FREQUENCY IAP_WAIT_30MHZ #elif (FOSC >= 20000000L) #define IAP_WAIT_FREQUENCY IAP_WAIT_24MHZ #elif (FOSC >= 12000000L) #define IAP_WAIT_FREQUENCY IAP_WAIT_20MHZ #elif (FOSC >= 6000000L) #define IAP_WAIT_FREQUENCY IAP_WAIT_12MHZ #elif (FOSC >= 3000000L) #define IAP_WAIT_FREQUENCY IAP_WAIT_6MHZ #elif (FOSC >= 2000000L) #define IAP_WAIT_FREQUENCY IAP_WAIT_3MHZ #elif (FOSC >= 1000000L) #define IAP_WAIT_FREQUENCY IAP_WAIT_2MHZ #else #define IAP_WAIT_FREQUENCY IAP_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); // new void OutPutCtrl(void); /***************变量定义**************/ 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; // 输出增益调节 // new OUTSTATE_t xdata OutPutState; unsigned int xdata InitTimeCnt; unsigned int xdata TimeBaseCnt, TimeBaseCntLast; bit ledState; unsigned int xdata TargetCurrent; unsigned int xdata OutputVol; /*************** 主函数 **************/ 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读取数据 if (TableRead[0] == 0x55 && TableRead[1] == 0xaa) { TargetCurrent = (TableRead[2] << 8) + TableRead[3]; } else { TargetCurrent = 1000; // 10mA Save_Flag = 1; } // 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,进行参数初始化处理 RunTime = 0; SetVoltage = 2000; SetCorroV = 920; Limitvoltage = 1600; AdjVoltage = 3; CurrentError = 1000; AcqError = 100; OutSet = 10000; 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; InitTimeCnt = 0; TimeBaseCnt = 0; TimeBaseCntLast = 0; OutPutState = OUT_INIT; while (1) { if (TimeBaseCnt > TimeBaseCntLast) { TimeBaseCntLast++; DataParsing(); // 串口数据解析 UartSendData(); // 串口定时发送数据 Read_ADC(); // AD采集数据处理 Parameter_Save(); if (TimeBaseCntLast % 10 == 0) { OutPutCtrl(); } if (TimeBaseCntLast % 1000 == 0) { ledState = !ledState; P16 = ledState; } if (TimeBaseCnt >= 10000) { TimeBaseCnt = 0; TimeBaseCntLast = 0; } } if (AcqInitFlag == 0) // 上电采集初始电压 { if (AcqInitCnt > 1000) // 上电3秒内采集初始电压,时间可修改 { InitAcqVolatage = AcqVolatage; // 获取初始电压 InitAcqCurrent = (unsigned int)IA; // 获取初始电流 AcqInitFlag = 1; AcqInitCnt = 0; } } // AutoAction(); // 运行自动程序 } } void OutPutCtrl(void) { OutCurrent = (unsigned int)(IA * 100); // 放大10倍后的电流(触摸屏显示用) switch (OutPutState) { case OUT_INIT: PWM_TO_DAC(5000, 1000); InitTimeCnt++; if (InitTimeCnt > 100) { InitTimeCnt = 0; OutPutState = OUT_RUNNING; OutputVol = 1000; } break; case OUT_RUNNING: if (OutCurrent > TargetCurrent + 20) { if (OutputVol > 100) { OutputVol--; } } else if (OutCurrent < TargetCurrent - 20) { if (OutputVol < 5000) { OutputVol++; } } PWM_TO_DAC(5000, OutputVol); break; case OUT_AUTOSTOP: break; case OUT_ERR: break; default: break; } } void turnOFFOutput(void) { 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; } void AutoAction(void) { if (PWM_ON_EN == 0) // PWM输出使能 { if (AcqVolatage >= Limitvoltage) // 采集电压大于1500mV,或电流小于0.5mA,关闭输出 { turnOFFOutput(); } 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 < SetCorroV) // 采集电压小于设定的腐蚀电压,正补偿 { Temp02 = SetCorroV - AcqVolatage1; if ((Temp02 >= 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; } } } } 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) { IAP_CONTR = 0; // 关闭ISP功能 IAP_CMD = 0; // 清除命令寄存器 IAP_TRIG = 0; // 清除触发寄存器 IAP_ADDRH = 0x80; // 将地址设置到非ISP区域 IAP_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; //禁止中断 IAP_CONTR = (IAP_EN + IAP_WAIT_FREQUENCY); // 设置等待时间,允许ISP/ISP操作,送一次就够 IAP_READ(); // 送字节读命令,命令不需改变时,不需重新送命令 do { IAP_ADDRH = EE_address / 256; // 送地址高字节(地址需要改变时才需重新送地址) IAP_ADDRL = EE_address % 256; // 送地址低字节 IAP_TRIG(); // 先送5AH,再送A5H到ISP/ISP触发寄存器,每次都需要如此 // 送完A5H后,ISP/ISP命令立即被触发启动 // CPU等待ISP完成后,才会继续执行程序。 _nop_(); *DataAddress = IAP_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字节/扇区。 // 扇区中任意一个字节地址都是扇区地址。 IAP_ADDRH = EE_address / 256; // 送扇区地址高字节(地址需要改变时才需重新送地址) IAP_ADDRL = EE_address % 256; // 送扇区地址低字节 IAP_CONTR = (IAP_EN + IAP_WAIT_FREQUENCY); // 设置等待时间,允许ISP/ISP操作,送一次就够 IAP_ERASE(); // 送扇区擦除命令,命令不需改变时,不需重新送命令 IAP_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; //禁止中断 IAP_CONTR = (IAP_EN + IAP_WAIT_FREQUENCY); // 设置等待时间,允许ISP/ISP操作,送一次就够 IAP_WRITE(); // 送字节写命令,命令不需改变时,不需重新送命令 do { IAP_ADDRH = EE_address / 256; // 送地址高字节(地址需要改变时才需重新送地址) IAP_ADDRL = EE_address % 256; // 送地址低字节 IAP_DATA = *DataAddress; // 送数据到IAP_DATA,只有数据改变时才需重新送 IAP_TRIG(); _nop_(); EE_address++; DataAddress++; } while (--number); DisableEEPROM(); // EA = 1; //重新允许中断 } /*======================================================================== // 函数: ADC_Init() // 描述: ADC_Init初始化 // 参数: 无 // 返回: 无 // 版本: VER1.0 // 日期: 2017-12-9 // 备注: //======================================================================== */ void ADC_Init() { P1M0 = 0x40; // 设置P1.4、P1.5、P1.6、P1.7为ADC口 P1M1 = 0xA0; 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 < num; j += 8) { temp = 0; for (i = 0; i < 8; i++) { temp += buff[j + i]; } ADR[j / 8] = temp / 2; } for (i = 0; i < 15; i++) { for (j = 0; j < 15 - 1; j++) { if (ADR[j] < ADR[j + 1]) { temp = ADR[j]; ADR[j] = ADR[j + 1]; ADR[j + 1] = temp; } } } for (i = threshold; i < (15 - threshold); i++) { sigma = sigma + ADR[i]; } temp = sigma / (15 - threshold * 2); return (temp); } /*======================================================================== // 函数: void Read_ADC() // 描述: 定时读取ADC的值,多次处理后取平均值. // 参数: 无. // 返回: 12位ADC结果. // 版本: VER1.0 // 日期: 2017-12-9 // 备注: //======================================================================== */ void Read_ADC() { if (ADC_Cnt >= 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; // 实际输出电流,根据实际情况修改 IA = ((float)ADC2_Value * 2498UL / DisSet / 10.00) / 2.0; 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; aRxBufferTemp = SBUF; 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] == 0x02) { // 参数复位 TargetCurrent = Rxbuff[1] << 8 + Rxbuff[2]; // 参数掉电保存(直接调用函数) 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] = 0x55; SendBuffer[1] = 0xAA; SendBuffer[2] = RunTime >> 8; // 运行时间H SendBuffer[3] = RunTime; // 运行时间L SendBuffer[4] = InVoltage >> 8; // 输入电压H SendBuffer[5] = InVoltage; // 输入电压L SendBuffer[6] = OutVoltage >> 8; // 输出电压H SendBuffer[7] = OutVoltage; // 输出电压L SendBuffer[8] = OutCurrent >> 8; // 输出电流H SendBuffer[9] = OutCurrent; SendBuffer[10] = TargetCurrent >> 8; SendBuffer[11] = TargetCurrent; SendBuffer[12] = 0X5A; /* 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; // 新增-重启时间 */ SendInit = 1; SentCnt = 0; } SBUF = SendBuffer[SentCnt++]; if (SentCnt > 12) { 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++; TimeBaseCnt++; /*** 新增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] = 0x55; TableWrite[1] = 0xAA; TableWrite[2] = TargetCurrent >> 8; // 运行时间H TableWrite[3] = TargetCurrent & 0XFF; // 运行时间L EEPROM_write_n(IAP_ADDRESS, TableWrite, 4); Save_Flag = 0; } }