#include <iom16v.h>
#include <macros.h>
#include <math.h>
#define uchar unsigned char
#define uint unsigned int
#define PT100 PA1 //定义PT100输入信号的AD端口
#define ad590 PA0 //定义AD590输入信号的AD端口
#define NTC1 PA3 //分压式热敏电阻
#define NTC2 PA4 //电桥式热敏电阻
#define cool PB3 //输出控制制冷,
#define hot PB4 //输出控制加热,低电平有效
uchar time=0,second=0,second1=0,m_count;
uchar control_flag=0;//控制标志位,为0,PID控制,否则为模糊控制
uchar state_flag=0;//加热,制冷标志位,为0加热,为1制冷.否则为控制算法,恒温
//#include "uart.h"
#include "delay.h"
#include "ad.h"
#include "eeprom.h"
#include "pid.h"
#include "lcd1602.h"
#include "fuzzy_pid.h"
#include "KEY_BOARD.h"
#include "ntc.h"
//#include "PT100.C"
#include "resister.c"
//***********初始化定时器****************
void init_T0()
{
TCCR0=0X05;//1024分频
//TCCR0=0X00;
TCNT0=99;//定时20MS
TIMSK|=0X01;//允许溢出中断
SEI();
}
//********采集AD590温度,并转换成温度值*****
uint get_ad590()
{
uchar i;
uint result[N];
long ad_value;
//init_ad(ad590);
for(i=0;i<N;i++)
{
result[i]=Get_ADdata(ad590);
delay_nus(20);
}
ad_value=filter(result);
ad_value+=78;//硬件接了2.8V的稳压管,再放大5倍,所以加上这个值
return (999*ad_value/1024);
}
//***************显示所有温度**************
void show(uchar number,uint dis_data)
{
write_data(number);
write_data(':');
if(dis_data>99)
{
write_data(dis_data/100%10+'0');
write_data(dis_data/10%10+'0');
write_data('.');
write_data(dis_data%10+'0');
}
else
{
//write_data(dis_data/100%10+'0');
write_data(' ');
write_data(dis_data/10%10+'0');
write_data('.');
write_data(dis_data%10+'0');
}
}
void display_T()
{
LCD1602_GotoXY(1,0);
//show('1',get_PT100());//PT100
show('1',0);//PT100
LCD1602_GotoXY(1,8);
show('2',get_ad590());//ad590
LCD1602_GotoXY(2,0);
show('3',Resister_Temp());//分压式热敏电阻
LCD1602_GotoXY(2,8);
show('4',get_NTC2());
}
void main()
{
float temp;
uchar flag=0;
init1602();
init_ad();
init_T0();
PIDinit();//初始化PID
SetPoint=PID.set_Goal;//PID控制与模糊控制设定温度相同
DDRB|=BIT(PB0)|BIT(PB1)|BIT(PB2)|BIT(PB3)|BIT(PB4);
PORTB|=BIT(PB0)|BIT(PB1)|BIT(PB2)|BIT(PB3)|BIT(PB4);
//PORTA|=BIT(0);
while(1)
{
key_function();
//*********3s秒执行一次控制算法*******
if(second1>=3)
{
second1=0;
if(control_flag==0)//控制标志位,为0,PID控制
{
PID_Ctrl();
m_count=PID.ui;
}
else //模糊控制
{
Delt_FuzzyCtrl();
m_count=ui;
}
}
//********1s更新一次测量值******
if(flag!=second1)
{
PID.ADC_data[2]=PID.ADC_data[1];//更新PID控制的采样值
PID.ADC_data[1]=PID.ADC_data[0];
PID.ADC_data[0]=get_ad590();
T_adc_data[0]=T_adc_data[1];//更新模糊控制的采样值
T_adc_data[1]=T_adc_data[2];
T_adc_data[2]=PID.ADC_data[0];
flag=second1;
display_T();
}
}
}
#pragma interrupt_handler over_T0:10
void over_T0()
{
TCNT0=99;
time++;
if(time>=50)
{
time=0;
second++;
second1++;
}
if(state_flag==0)//制冷
{
PORTB&=~BIT(cool);//制冷使能
PORTB|=BIT(hot);
PORTB&=~BIT(PB1);//制冷状态,绿色指示灯亮
PORTB|=BIT(PB0)|BIT(PB2);
}
else if(state_flag==1) //加热
{
PORTB&=~BIT(hot);//加热
PORTB|=BIT(cool);
PORTB&=~BIT(PB0);//加热状态,红色指示灯亮
PORTB|=BIT(PB1)|BIT(PB2);
}
else //恒温
{
PORTB|=BIT(cool);//关闭制冷
if(m_count>0)
{
m_count--;
PORTB&=~BIT(hot);//加热
PORTB&=~BIT(PB2);//控制状态,恒温,黄色指示灯亮
PORTB|=BIT(PB1)|BIT(PB0);
}
else
{
PORTB|=BIT(hot);//停止加热
PORTB&=~BIT(PB2);//停止加热状态,黄色指示灯亮
PORTB|=BIT(PB1)|BIT(PB0);
}
}
}
评论0