2024-08-15 15:33:17 +08:00

585 lines
14 KiB
C

//24Mhz
#include <STC8H.H>
#include <intrins.h>
#include"delay.h"
#include"tm1650.h"
#include <math.h>
/*[-外部信号-][-开始-][-----][-----][-----]*/
//------------------------------------------------------------------------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("<ASK>");
else UartSendStr2("<OFF>");
}
// <H1T00S00000>
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-][-结束-][-----][-----][-----]*/