#include #include"tm1650.h" #include"uart.h" #include /*[-外部信号-][-开始-][-220V电源检测模块-][-----][-----]*/ u8 ACC_NUM_RST = 3; extern bool UART_SEND_OK; /*[-PTC加热继电器-][-开始-][-----][-----][-----]*/ u8 PTC_WORK_POS = 99; u8 PTC_DEL_TIME = 0; bool PTC_STATE = FALSE; static void PTC_WORK(); /*[-PWM8-][-开始-][-----][-----][-----]*/ #define PWM 10000 u8 PWM_DUT = 50; static void SETPWM8(u16 cycle, u16 duty); /*[-ADC采样-][-开始-][-----][-----][可控硅温度]*/ u16 FAN_TEMP = 0; bool ADC_TEMP_OK = FALSE; u16 GETADC_ADC0(); // 获取ADC数据 static void ADCINIT(); // 温度采集 初始化 static void AUTOFAN(); // 自动风扇 static float temp_data(float ADC_data); // 计算温度数据 /*[-定时器0-][-结束-][-----][-----][-----]*/ u16 SYS_TIME_NUM = 0; u8 hour = 0, min = 0, sec = 0; void Timer0_Init(void); // 25毫秒@24.000MHz /*[-外部中断0-][-开始-][-----][-----][-----]*/ u8 ACC_NUM = 0; u8 ACC_FREQ = 0; /*[-函数声明-][-----][-----][-----][-----]*/ static void SYSINIT(); // 系统初始化 static void SMGSHOW(); // 数码管显示 #ifdef HEATING_CONTROL_P1000 void FILA_WORK(); // 耗材仓加热 #endif /*[-变量声明-][-----][-----][-----][-----]*/ static u8 pag = 0; xdata u8 FILA_PTC_TIME = 0; xdata u16 FILA_FAN_TIME = 0; void main() { SYSINIT(); // 系统初始化 SETPWM8(2400, 80); ADCINIT(); while (1) { SMGSHOW(); // 数码管显示 AUTOFAN(); PTC_WORK(); // PTC工作程序 UART_CMD(); // 串口命令 #ifdef HEATING_CONTROL_P1000 FILA_WORK(); // 耗材仓加热 #endif } } #ifdef HEATING_CONTROL_P1000 void FILA_WORK() // 耗材仓加热 { if (FILA_PTC_TIME > 0) { FILA_PTC_TIME--; MCU_FILA_PTC_1 = MCU_FILA_PTC_2 = 1; } else { MCU_FILA_PTC_1 = MCU_FILA_PTC_2 = 0; } if (FILA_FAN_TIME > 0) { FILA_FAN_TIME--; MCU_FILA_FAN = 1; } else { MCU_FILA_FAN = 0; } } #endif static void setRelay(u8 relay1, u8 relay2, u8 relay3, u8 relay4) { PTC_RLY_1 = relay1; PTC_RLY_2 = relay2; PTC_RLY_3 = relay3; PTC_RLY_FAN = relay4; } static void PTC_WORK() { switch (PTC_WORK_POS) { case 0: setRelay(0, 1, 1, 0); PTC_WORK_POS = 1; PTC_DEL_TIME = 20; break; case 1: if (PTC_DEL_TIME == 0) { setRelay(0, 0, 1, 0); PTC_WORK_POS = 2; PTC_DEL_TIME = 20;} break; case 2: if (PTC_DEL_TIME == 0) { setRelay(0, 0, 0, 0); PTC_WORK_POS = 3; PTC_DEL_TIME = 0; } break; case 3: setRelay(0, 0, 0, 0); break; // 全开 case 90: setRelay(1, 1, 1, 0); PTC_WORK_POS = 91; PTC_DEL_TIME = 20; break; // 延时关闭 case 91: if (PTC_DEL_TIME == 0) { PTC_RLY_FAN = 0; PTC_WORK_POS = 99; } break; case 99: setRelay(1, 1, 1, 1); break; // 全部关闭 } #ifdef HEATING_CONTROL_P800 MCU_FILA_FAN = !PTC_RLY_FAN; #endif } static void SETPWM8(u16 cycle, u16 duty) { unsigned long a, b, c; a = cycle; b = duty; c = a * b / 100; P_SW2 = 0x80; PWMB_CCER2 = 0x00; // 写CCMRx前必须先清零CCERx关闭通道 PWMB_CCMR4 = 0x68; PWMB_CCER2 = 0x10; PWMB_CCR8 = (u16)c; PWMB_ARR = (u16)a; // 设置周期时间 PWMB_ENO = 0x40; PWMB_PS = 0x80; PWMB_BKR = 0x80; // 使能主输出 PWMB_CR1 = 0x01; // 开始计时 } static void SMGSHOW() // 数码管显示 { switch (pag) { case 0: if (PW_OUT_ACC == 1) SMG1x4_B(FAN_TEMP % 1000 / 100, FAN_TEMP % 100 / 10, FAN_TEMP % 10, 12, 2); else SMG1x4(10, 10, 10, 10); break; } //TODO } static void SYSINIT()//系统初始化 { /*[-PINS-][-INIT-][-----][-----][-----]*/ setRelay(1, 1, 1, 1); P0M0 = 0x0e; P0M1 = 0x00; P1M0 = 0x00; P1M1 = 0x08; P2M0 = 0xff; P2M1 = 0x00; P3M0 = 0x00; P3M1 = 0x00; P4M0 = 0x00; P4M1 = 0x00; P5M0 = 0x10; P5M1 = 0x00; P6M0 = 0x00; P6M1 = 0x00; P7M0 = 0x00; P7M1 = 0x00; SMG1x4_B(28,1,1,2,2); // 显示版本号 delayMs(500); setRelay(0, 0, 0, 0); MCU_FILA_PTC_1=0; MCU_FILA_PTC_2 = 0; MCU_BED_1 = 0; MCU_BED_2 = 0; IN_PTC = 1; IN_BED = 1; MCU_FILA_FAN = 0; IN_PWR = 1; /*[-IO状态-][-INIT-][-----][-----][-----]*/ BUZZER = 0; /*[-上电提示-][-----][-----][-----][-----]*/ BUZZER=1;delayMs(100);BUZZER=0;delayMs(100); BUZZER=1;delayMs(200);BUZZER=0;delayMs(100); UartInit2(); UartInit(); // 串口初始化 Timer0_Init(); // 定时器初始化 IT0 = 1; // 使能INT0上升沿和下降沿中断 EX0 = 1; // 使能INT0中断 EA = 1; // 开总中断 } /*[-外部中断-][-INT0-][-----][-----][-END-]*/ void INT0_Isr() interrupt 0 { // P32 上升沿和下降沿 ACC_NUM++; ACC_NUM_RST = 1; } /*[-定时器0-][-开始-][-25ms-][-24Mhz-][-----]*/ void Timer0_Init(void) { AUXR &= 0x7F; //定时器时钟12T模式 TMOD &= 0xF0; //设置定时器模式 TL0 = 0xB0; //设置定时初始值 TH0 = 0x3C; //设置定时初始值 TF0 = 0; //清除TF0标志 TR0 = 1; //定时器0开始计时 ET0=1; } void TM0_Isr() interrupt 1 { SYS_TIME_NUM = (SYS_TIME_NUM + 1) % 40; if (SYS_TIME_NUM == 0) { sec = (sec + 1) % 60; if (sec == 0) min = (min + 1) % 60; if (sec == 0 && min == 0) hour++; ACC_FREQ = ACC_NUM; ACC_NUM = 0; UART_SEND_OK = 1; ADC_TEMP_OK = TRUE; if (PTC_DEL_TIME > 0) PTC_DEL_TIME--; } if (PTC_STATE != IN_PTC) { PTC_STATE = IN_PTC; PTC_WORK_POS = IN_PTC ? 90 : 0; } MCU_BED_1 = MCU_BED_2 = !IN_BED; if (ACC_NUM_RST > 0) { ACC_NUM_RST--; PW_OUT_ACC = 1; } else { PW_OUT_ACC = 0; } } /*[-ADC-][-开始-][-----][-----][-----]*/ static void ADCINIT() { P_SW2 |= 0x80; ADCTIM = 0x3f; //设置ADC内部时序 P_SW2 &= 0x7f; ADCCFG = 0x2f; //设置ADC时钟为系统时钟/2/16 ADC_CONTR = 0x80; //使能ADC模块 } u16 GETADC_ADC0() { u16 val = 0; ADC_CONTR |= 0x43; // 启动AD转换 _nop_(); _nop_(); while (!(ADC_CONTR & 0x20)); // 查询ADC完成标志 ADC_CONTR &= ~0x20; // 清完成标志,读取ADC结果 val = ADC_RES * 256 + ADC_RESL; return val; } static float temp_data(float ADC_data) { float temp; float Rt = 0; float Rp = 100000; float T2 = 273.15 + 25; float Bx = 3950; float Ka = 273.15; float vol = 0; vol = (((float)ADC_data) * 2.5 / 1024); // 公式缩减 ADC*(5/1024) Rt = (470000 * vol) / (2.5 - vol); // 4.7k 更改为1000k 更改为470K temp = 1 / ((log(Rt / Rp)) / Bx + 1 / T2) - Ka; if (temp < 0) temp = -1; temp = temp * 10.0; return temp; } static void AUTOFAN() // 自动风扇 { /* 35度以下停止工作 后面温度计算方式 */ if (ADC_TEMP_OK) { FAN_TEMP = (u16)temp_data(GETADC_ADC0()); ADC_TEMP_OK = FALSE; } if (FAN_TEMP > 350) { PWM_DUT = (FAN_TEMP - 350); PWM_DUT = PWM_DUT / 10; PWM_DUT = PWM_DUT * 2; } else { PWM_DUT = 0; } SETPWM8(PWM, PWM_DUT); }