//24Mhz #include #include #include"delay.h" #include"tm1650.h" #include /*[-外部信号-][-开始-][-----][-----][-----]*/ //------------------------------------------------------------------------220V电源检测模块 sbit PW_OUT_ACC=P5^4; unsigned char ACC_NUM_RST=3; /*[-外部信号-][-停止-][-----][-----][-----]*/ /*[-外部信号-][-开始-][-----][-----][-----]*/ //------------------------------------------------------------------------外部信号 sbit MCU_BED_1=P2^7; sbit MCU_BED_2=P2^6; sbit IN_PTC=P3^3; sbit IN_BED=P3^6; sbit IN_PWR=P3^7; /*[-外部信号-][-结束-][-----][-----][-----]*/ /*[-PTC加热继电器-][-开始-][-----][-----][-----]*/ //------------------------------------------------------------------------PTC sbit PTC_RLY_1=P2^1; sbit PTC_RLY_2=P2^2; sbit PTC_RLY_3=P2^3; sbit PTC_RLY_FAN=P2^0; void PTC_WORK(); unsigned char PTC_WORK_POS=99; unsigned char PTC_DEL_TIME=0; bit PTC_STATE=0; /*[-PTC加热继电器-][-结束-][-----][-----][-----]*/ /*[-PWM8-][-开始-][-----][-----][-----]*/ //------------------------------------------------------------------------PWM unsigned int PWM=10000; unsigned char PWM_DUT=50; void SETPWM8(unsigned int cycle,unsigned int duty); /*[-PWM8-][-结束-][-----][-----][-----]*/ //------------------------------------------------------------------------串口 /*[-串口通信-][-开始-][-----][-----][-----]*/ #define FOSC 24000000UL //#define FOSC 11059200UL #define BRT (65536 - FOSC / 115200 / 4) void UartInit(); void UartSend(char dat); void UartSendStr(char *p); void UartInit2(); void UartSend2(char dat); void UartSendStr2(char *p); void UartSendNum(unsigned int n); void UartSendNumRN(unsigned int n); void UartSendEcho();//返回信息 void UART_CMD();//串口命令解析 bit UART_SEND_OK=0; bit busy; xdata unsigned char UART_RST_NUM=0; xdata char old_data=0; bit UART_OK=0; xdata unsigned char UART_NUM=0; char wptr; char rptr; char buffer[16]; /*[-串口通信-][-结束-][-----][-----][-----]*/ //------------------------------------------------------------------------ADC /*[-ADC采样-][-开始-][-----][-----][可控硅温度]*/ unsigned int FAN_TEMP=0; void ADCINIT();//温度采集 初始化 unsigned int GETADC_ADC0();//获取ADC数据 float temp_data(float ADC_data);//计算温度数据 void AUTOFAN();//自动风扇 bit ADC_TEMP_OK=0; /*[-ADC采样-][-结束-][-----][-----][可控硅温度]*/ /*[-PWM-][-开始-][-----][-----][-----]*/ void SETPWM8(unsigned int cycle,unsigned int duty);//频率 占空比 /*[-PWM-][-结束-][-----][-----][-----]*/ //------------------------------------------------------------------------定时器 /*[-定时器0-][-结束-][-----][-----][-----]*/ void Timer0_Init(void); //25毫秒@24.000MHz unsigned int SYS_TIME_NUM=0; //unsigned int SYS_TIME_S=0; unsigned int hour=0,min=0,sec=0; /*[-定时器0-][-结束-][-----][-----][-----]*/ //------------------------------------------------------------------------外部IO /*[-外部控制IO-][-开始-][-----][-----][-----]*/ sbit BUZZER = P0^2; /*[-外部控制IO-][-结束-][-----][-----][-----]*/ //------------------------------------------------------------------------外部中断0 /*[-外部中断0-][-开始-][-----][-----][-----]*/ unsigned char ACC_NUM=0; unsigned char ACC_FREQ=0; /*[-外部中断0-][-结束-][-----][-----][-----]*/ /*[-函数声明-][-----][-----][-----][-----]*/ void SYSINIT();//系统初始化 void SMGSHOW();//数码管显示 /*[-变量声明-][-----][-----][-----][-----]*/ xdata unsigned char pag=0; xdata unsigned Fan_dut=0; /*[-函数声明-][-耗材仓-][-----][-----][-----]*/ sbit MCU_FILA_FAN=P0^1; sbit MCU_FILA_PTC_1=P2^4; sbit MCU_FILA_PTC_2=P2^5; void FILA_WORK(); /*[-变量声明-][-----][-----][-----][-----]*/ xdata unsigned char FILA_PTC_TIME=0; xdata unsigned int FILA_FAN_TIME=0; void main() { unsigned int a=0; SYSINIT();//系统初始化 SETPWM8(2400,80); ADCINIT(); while(1) { SMGSHOW();//数码管显示 AUTOFAN(); PTC_WORK();//PTC工作程序 UART_CMD();//串口命令 // FILA_WORK();//耗材仓加热 } } void UART_CMD()//串口命令解析 { if(UART_OK) { if(buffer[0]=='<' && buffer[1]=='A' && buffer[2]=='S' && buffer[3]=='K' && buffer[4]=='?'&& buffer[5]=='>') { if(PW_OUT_ACC==1)UartSendStr2(""); else UartSendStr2(""); } // if(buffer[0]=='<' && buffer[1]=='H' && buffer[12]=='>') { if(buffer[2]=='1')FILA_PTC_TIME=255; FILA_FAN_TIME=20000; } UART_OK=0; } UartSendEcho();//串口反馈 1S 一次 } 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; } } void PTC_WORK() { switch(PTC_WORK_POS) { case 0: PTC_RLY_1=0; PTC_RLY_2=1; PTC_RLY_3=1; PTC_RLY_FAN=0; PTC_WORK_POS=1;PTC_DEL_TIME=20;break; case 1: if(PTC_DEL_TIME==0) { PTC_RLY_1=0; PTC_RLY_2=0; PTC_RLY_3=1; PTC_RLY_FAN=0; PTC_WORK_POS=2;PTC_DEL_TIME=20; } break; case 2: if(PTC_DEL_TIME==0) { PTC_RLY_1=0; PTC_RLY_2=0; PTC_RLY_3=0; PTC_RLY_FAN=0; PTC_WORK_POS=3;PTC_DEL_TIME=0; } break; case 3: PTC_RLY_1=0; PTC_RLY_2=0; PTC_RLY_3=0; PTC_RLY_FAN=0; break;//全开 case 90:PTC_RLY_1=1; PTC_RLY_2=1; PTC_RLY_3=1; PTC_RLY_FAN=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:PTC_RLY_1=1; PTC_RLY_2=1; PTC_RLY_3=1; PTC_RLY_FAN=1;break;//全部关闭 } MCU_FILA_FAN=!PTC_RLY_FAN; } void SETPWM8(unsigned int cycle,unsigned int 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 =(unsigned int)c; PWMB_ARR = (unsigned int)a; //设置周期时间 PWMB_ENO = 0x40; PWMB_PS=0x80; PWMB_BKR = 0x80; //使能主输出 PWMB_CR1 = 0x01; //开始计时 } 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; } } void SYSINIT()//系统初始化 { /*[-PINS-][-INIT-][-----][-----][-----]*/ PTC_RLY_1=1; PTC_RLY_1=1; PTC_RLY_1=1; PTC_RLY_FAN=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); PTC_RLY_1=0; PTC_RLY_1=0; PTC_RLY_1=0; PTC_RLY_FAN=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 { if (P32) //判断上升沿和下降沿 { ACC_NUM++; ACC_NUM_RST=1; } else { ACC_NUM++; ACC_NUM_RST=1; } } /*[-外部中断-][-INT0-][-----][-----][-END-]*/ /*[-定时器0-][-开始-][-25ms-][-24Mhz-][-----]*/ void Timer0_Init(void) //25毫秒@24.000MHz { AUXR &= 0x7F; //定时器时钟12T模式 TMOD &= 0xF0; //设置定时器模式 TL0 = 0xB0; //设置定时初始值 TH0 = 0x3C; //设置定时初始值 TF0 = 0; //清除TF0标志 TR0 = 1; //定时器0开始计时 ET0=1; } //hour=0,min=0,sec=0; 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=1; if(PTC_DEL_TIME>0)PTC_DEL_TIME--; } // if(IN_PTC==0)PTC_WORK_POS=0;//工作 // else PTC_WORK_POS=99;//停止 if(PTC_STATE!=IN_PTC) { PTC_STATE=IN_PTC; if(IN_PTC==0)PTC_WORK_POS=0;//工作 else PTC_WORK_POS=90;//停止 } 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; } } /*[-定时器0-][-结束-][-----][-----][-----]*/ /*[-串口通信-][-开始-][-----][-----][-----]*/ //xdata unsigned char UART_RST_NUM=0; //xdata char old_data=0; void UartIsr() interrupt 4 { char c=0; if (TI) { TI = 0; busy = 0; } if (RI) { RI = 0; c=SBUF; if(c != old_data) { UART_RST_NUM=0; } else { if(UART_RST_NUM<100)UART_RST_NUM++; if(UART_RST_NUM>50)IAP_CONTR |= 0x60; } buffer[wptr++] = SBUF; wptr &= 0x0f; } } void Uart2Isr() interrupt 8 { char c; if (S2CON & 0x02) { S2CON &= ~0x02; busy = 0; } if (S2CON & 0x01) { S2CON &= ~0x01; c = S2BUF; if(c=='<')UART_NUM=0; if(c=='>')UART_OK=1; if(UART_NUM<16){buffer[UART_NUM]=c;UART_NUM++;} } } void UartInit() { SCON |= 0x50; T2L = BRT; T2H = BRT >> 8; AUXR |= 0x15; ES = 1; } void UartInit2() { S2CON |= 0x10; T2L = BRT; T2H = BRT >> 8; AUXR |= 0x14; IE2 = 0x01; } void UartSend(char dat) { while (busy); busy = 1; SBUF = dat; } void UartSend2(char dat) { while (busy); busy = 1; S2BUF = dat; } void UartSendStr(char *p) { while (*p) { UartSend(*p++); } } void UartSendStr2(char *p) { while (*p) { UartSend2(*p++); } } void UartSendNum(unsigned int n) { UartSend('0'+n%100000/10000); UartSend('0'+n%10000/1000); UartSend('0'+n%1000/100); UartSend('0'+n%100/10); UartSend('0'+n%10); } void UartSendNumRN(unsigned int n) { UartSend('0'+n%100000/10000); UartSend('0'+n%10000/1000); UartSend('0'+n%1000/100); UartSend('0'+n%100/10); UartSend('0'+n%10); UartSend('\r'); UartSend('\n'); } void UartSendEcho()//PWM { if(UART_SEND_OK==1)//hour=0,min=0,sec=0; { UartSend('T'); UartSend('>'); UartSend('0'+hour%100000/10000); UartSend('0'+hour%10000/1000); UartSend('0'+hour%1000/100); UartSend('0'+hour%100/10); UartSend('0'+hour%10); UartSend(':'); UartSend('0'+min%100/10); UartSend('0'+min%10); UartSend(':'); UartSend('0'+sec%100/10); UartSend('0'+sec%10); UartSend('\r');UartSend('\n'); UartSend('T');UartSend('E');UartSend('M');UartSend('P'); UartSend(':'); UartSend('<'); UartSend('0'+FAN_TEMP%1000/100); UartSend('0'+FAN_TEMP%100/10); UartSend('.'); UartSend('0'+FAN_TEMP%10); UartSend('C'); UartSend('>'); UartSend('\r');UartSend('\n'); UartSend('F');UartSend('A');UartSend('N'); UartSend(':'); UartSend('<'); UartSend('0'+PWM_DUT%1000/100); UartSend('0'+PWM_DUT%100/10); UartSend('0'+PWM_DUT%10); UartSend('%'); UartSend('>'); UartSend('\r');UartSend('\n'); UartSend('A');UartSend('C');UartSend(':'); UartSend('<'); UartSend('0'+ACC_FREQ%1000/100); UartSend('0'+ACC_FREQ%100/10); UartSend('0'+ACC_FREQ%10); UartSend('>'); UartSend('\r');UartSend('\n'); UartSend('P');UartSend('W');UartSend('R');UartSend(':');UartSend('<');if(IN_PWR==0)UartSend('1');else UartSend('0');UartSend('>'); UartSend('\r');UartSend('\n'); UartSend('P');UartSend('T');UartSend('C');UartSend(':');UartSend('<');if(IN_PTC==0)UartSend('1');else UartSend('0');UartSend('>'); UartSend('<'); if(PTC_RLY_1)UartSend('0');else UartSend('1');UartSend(','); if(PTC_RLY_2)UartSend('0');else UartSend('1');UartSend(','); if(PTC_RLY_3)UartSend('0');else UartSend('1');UartSend(','); if(PTC_RLY_FAN)UartSend('0');else UartSend('1');UartSend('>'); UartSend('<');UartSend('0'+PTC_DEL_TIME%100/10);UartSend('0'+PTC_DEL_TIME%10);UartSend('>'); UartSend('\r');UartSend('\n'); UartSend('B');UartSend('E');UartSend('D');UartSend(':');UartSend('<');if(IN_BED==0)UartSend('1');else UartSend('0');UartSend('>'); UartSend('\r');UartSend('\n'); UartSend('A');UartSend('C');UartSend('C');UartSend(':');UartSend('<');if(PW_OUT_ACC)UartSend('1');else UartSend('0');UartSend('>'); UartSend('\r');UartSend('\n'); UartSend('F');UartSend('I');UartSend('L');UartSend('A'); UartSend('<'); UartSend('0'+FILA_PTC_TIME%1000/100); UartSend('0'+FILA_PTC_TIME%100/10); UartSend('0'+FILA_PTC_TIME%10); UartSend('>'); UartSend('<'); UartSend('0'+FILA_FAN_TIME%100000/10000); UartSend('0'+FILA_FAN_TIME%10000/1000); UartSend('0'+FILA_FAN_TIME%1000/100); UartSend('0'+FILA_FAN_TIME%100/10); UartSend('0'+FILA_FAN_TIME%10); UartSend('>'); UART_SEND_OK=0; } } /*[-串口通信-][-结束-][-----][-----][-----]*/ /*[-ADC-][-开始-][-----][-----][-----]*/ void ADCINIT() { P_SW2 |= 0x80; ADCTIM = 0x3f; //设置ADC内部时序 P_SW2 &= 0x7f; ADCCFG = 0x2f; //设置ADC时钟为系统时钟/2/16 ADC_CONTR = 0x80; //使能ADC模块 } unsigned int GETADC_ADC0() { unsigned int buf=0; ADC_CONTR |= 0x43; //启动AD转换 _nop_(); _nop_(); while (!(ADC_CONTR & 0x20)); //查询ADC完成标志 ADC_CONTR &= ~0x20; //清完成标志 //读取ADC结果 buf=ADC_RES*256+ADC_RESL; return buf; } 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; } void AUTOFAN()//自动风扇 { /* 35度以下停止工作 后面温度计算方式 */ if(ADC_TEMP_OK) { FAN_TEMP=(unsigned int)temp_data(GETADC_ADC0()); ADC_TEMP_OK=0; } 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); } /*[-ADC-][-结束-][-----][-----][-----]*/ /*[-PTC-][-开始-][-----][-----][-----]*/ /*[-PTC-][-结束-][-----][-----][-----]*/