sbit DOUT=P2^3; sbit SCLK=P2^4; sbit CS=P2^5; sbit le=P2 ^ 1; sbit oe=P2 ^ 2; sbit RELAY=P2^6; sbit KS0=P1^0; sbit KS1=P1^1; sbit KS2=P1^2;
uchar code LcdBuf1[]= {%uchar code LcdBuf2[]= {%uchar Vref=5; uchar a[6]; uchar g[6];
unsigned char sumout; uint SET_TEMP=650;
unsigned int read_max6675(void) { unsigned char i; unsigned int AD=0;
CS=0;
SCLK=0; /*输出数据D15*/
SCLK=1;
for(i=12;i>0;i--) /*读取转换结果*/ { SCLK=0;
if(DOUT==1)
AD++;
AD=AD<<1; /*数据左移*/
SCLK=1;
} SCLK=0;
16
//flag=SO;/*读取D2断偶标志*/ SCLK=1;
SCLK=0;
/*输出数据D1*/
SCLK=1;
SCLK=0;
/*输出数据D0*/
SCLK=1;
CS=1; }
unsigned ADC1() {
long l; uint q=0; return AD;
l=read_max6675();
l=(24489/4100)*l*Vref+1; //转换为电压值
l=l+7500;
g[0]=(l/10000)+'0'; //取得整数值到数组 g[1]=(l/1000)+'0'; g[2]=(l/100)+'0'; //a[3]='.';
//忽略小数
//a[4]=t+'0';
q=(g[0]-'0')*100+(g[1]-'0')*10+(g[2]-'0'); return q ; }
void ADC() {
long t;
17
t=read_max6675();
t=(24489/4100)*t*Vref+1;
//转换为电压值
t=t+7500; a[0]=(t/10000)+'0'; //取得整数值到数组 a[1]=(t/1000)+'0';
a[2]=(t/100)+'0';
}
void constant_temperature()
//恒温{
uint b; b=(a[0]-'0')*100+(a[1]-'0')*10+(a[2]-'0'); if(b<=SET_TEMP) {
RELAY=0; m=SET_TEMP-b; m=(unsigned char)(m/256);
}
else
{
RELAY=1; m=SET_TEMP-b; m=(unsigned char)(m/256); }
}
void delay_ms(uchar ms) {
uint i,j;
for(i=0;i 18 } for(j=0;j<120;j++); typedef struct { double SetPoint; /* 设定目标 Desired Value */ double Proportion; /* 比例常数 Proportional Const */ double Integral; /* 积分常数 Integral Const */ double Derivative; /* 微分常数 Derivative Const */ double LastError; /* 前一项误差 */ double PrevError; /* 前第二项误差 */ double SumError; /* 总误差 */ } PID; /**************************************************************************** PID计算部分 ****************************************************************************/ double PIDCalc( PID *pp, double NextPoint ) { double dError,Error; double SetPoint; SetPoint=SET_TEMP; Error = pp->SetPoint - NextPoint; /* 计算当前偏差 */ pp->SumError += Error; /* 积分《总偏差》*/ dError = pp->LastError - pp->PrevError; /* 当前微分 */ pp->PrevError = pp->LastError; 19 pp->LastError = Error; /* 三个误差值移位 */ return(NextPoint+pp->Proportion * Error + pp->Integral * pp->SumError + pp->Derivative * dError ); /*《返回总的误差值》*/ } void pid(void) { PID sPID; double rOut; unsigned char rIn; double x; sPID.Proportion = 0.36; sPID.Integral = 0.0006; sPID.Derivative = 1.8; sPID.SetPoint = 2.0; { unsigned char sumout; 进入循环检测状态中 */ unsigned char i; rIn = ADC1(); for(i=0;i<50;i++) x = 5.0 * (double)rIn / 256.0; rOut = PIDCalc ( &sPID,x ); sumout=rOut*256/5; } } void dac0832(out) { /* 定义PID结构体变量 */ /* PID 响应输出 */ /* PID 反馈 (Input) */ /* 设置 PID 比例系数 */ /* 设置PID积分系数 */ /* 设置PID微分系数 */ /* 设置 PID 输出值 */ /* PID /* 读传感器输出 */ /* 计算PID 输出 */ 20