delay1ms();
}
/*********************************************************
函数功能:
单片机向计算机发送数据
*********************************************************/
voidsend(unsignedintsend_data)
{
SBUF=send_data;
while(TI==0);
TI=0;
}
/********************************************************
函数功能:
串口中断函数单片机通过中断接收计算机发送数据
********************************************************/
voidUART_SER(void)interrupt4//串行中断服务程序
{
if(RI)//判断是接收中断产生
{
RI=0;//标志位清零
ReceiveData=SBUF;//读入缓冲区的值
}
}
voidmain(void)
{
IE=0x90;//EnableADCinterruptandOpenmasterinterruptswitch,允许T1,T0中断
TMOD=0x22;//定时器T1工作于方式2,带自动重装功能的8位计数器,最大计数值为256
SCON=0x50;//SCON=01010000B,串口工作方式1,允许接收(REN=1)
PCON=0x00;//PCON=00000000B,波特率9600
TH1=0xfa;//根据规定给定时器T1赋初值
TL1=0xfa;//根据规定给定时器T1赋初值
TR1=1;//启动定时器T1
TH0=0xF5;//根据规定给定时器T1赋初值
TL0=0x78;//根据规定给定时器T1赋初值
TR0=1;//启动定时器T0
readtemperature();
//Delay(9000);
while
(1)
{
//unsignedchari;
readtemperature();
//得到AD的输入温度值
//ADget_Z=ADget/10;十位
//ADget_X=ADget%10;个位
//ADget_Z=ADget_Z*1000;
//if(ds18b20isok)
//pp=100;
//else
//{
//pp=200;
//};
temp=b;//先把高八位有效数据赋于temp
temp<<=8;//把以上8位数据从temp低八位移到高八位
temp=temp|a;//两字节合成一个整型变量
tt=temp*0.0625;//得到真实十进制温度值
//因为DS18B20可以精确到0.0625度
//所以读回数据的最低位代表的是0.0625度
temp=tt*10+0.5;//放大十倍
pp=temp*10;
pp1=floor(pp);
cH=(pp1-pp1%256)/256;
cL=pp1%256;
send(cH);
send(cL);
//if(j==1)
//{
//INPUT_ZH=ReceiveData;
//}
//elseif(j==2)
//{
//INPUT_X=ReceiveData;
//j=0;
//}
//GivenTemper=(INPUT_ZH*256+INPUT_X)/100;//温度扩大10,给定温度
GivenTemper=ReceiveData*100;//Temperature;
//pp1=floor(pp*100);
//cH=(pp1-pp1%256)/256;
//cL=pp1%256;
//send(cH);
//send(cL);
//delaynms(1000);
measure=pp;
//ss1=0;
//ss2=1;
//ss1=0;
//ss2=1;//GivenTemper=(INPUT_ZH*256+INPUT_X)/100;//温度扩大10,给定温度
//给定值大于测量值时
if(GivenTemper>measure)//给定值高ccap0加热
{Error=GivenTemper-measure;
//CCAP1L=0;
//CCAP1H=0;
//if(Error>0)
if(Error>300)
{
ss1=1;
ss2=0;
}
elseif(Error>100&&Error<=300)
{
ss1=1;
ss2=0;
Delay(3000);
ss1=0;
ss2=0;
Delay(2000);
}
elseif(Error>50&&Error<=100)
{
ss1=1;
ss2=0;
Delay(1000);
ss1=0;
ss2=0;
Delay(100);
}
elseif(Error>10&&Error<=50)
{
ss1=1;
ss2=0;
Delay(500);
ss1=0;
ss2=0;
Delay(500);
}
elseif(Error>5&&Error<=10)
{
ss1=1;
ss2=0;
Delay(100);
ss1=0;
ss2=0;
Delay(100);
}
else
{ss1=0;
ss2=0;}
}
elseif(GivenTemper{Error=measure-GivenTemper;
//if(Error>0)
if(Error>300)
{
ss1=0;
ss2=1;
}
elseif(Error>100&&Error<=300)
{
ss1=0;
ss2=0;
Delay(50);
ss1=0;
ss2=1;
Delay(100);
}
elseif(Error>50&&Error<=100)
{
ss1=0;
ss2=0;
Delay(100);
ss1=0;
ss2=1;
Delay(100);
}
elseif(Error>10&&Error<=50)
{
ss1=0;
ss2=0;
Delay(100);
ss1=0;
ss2=1;
Delay(1000);
}
elseif(Error>5&&Error<=10)
{ss1=0;
ss2=1;
Delay(1000);
ss1=0;
ss2=0;
Delay(10);}
else
{
ss1=0;
ss2=0;
}
}
}}
/*measure=pp1;//测量温度
//Error=GivenTemper-measure;
//给定值大于测量值时
if(GivenTemper>measure)//给定值高ccap0加热
{
Error=GivenTemper-measure;
}
//给定值小于测量值时
elseif(GivenTemper{
Error=measure-GivenTemper;
delaynms(10000);
}
}
}
//增量式PID算法(需要控制的不是控制量的绝对值,而是控制量的增量)
/*********************************************************
函数功能:
AD采样
/*********************************************************/
//unsignedintADCRESULT()
//{
//ADC_RES=500;
//ADdat2=(ADC_RES<<2)+ADC_RESL;//10位转换结果
//pp=(ADdat2/1024)*5;//pp1=((long)ADdat2*1500)/358;//得到温度
//ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START;
//returnpp;
//}
/********************************************************
函数功能:
完成函数的初始化功能(A/D采样会用到)
********************************************************/
//voidInitADC()
//{
//P1ASF=0xf7;//SetallP1asanaloginputport将所有的P1口定义为模拟输入端口
//ADC_RES=0;//Clearpreviousresult清除上一个结果.ADC_RES为A/D转换结果寄存器
//ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START;
//}
//PWM初始化
//voidInitPWM()
//{
//CMOD=0x84;//CPS1CPS0=00,FOSC/12是PCA/PWMCLOCK94
//CCON=0x00;
//CL=0x00;//PCA计数器
//CH=0x00;//PCA计数器
//CCAP0L=0x80;//SettheinitialvaluesameasCCAPOH预置初值加热
//CCAP0H=0x80;//50%的占空比
//CCAPM0=0x42;//01000010SetupPCAmodule0in8bitpwm,P1.3输出
///////////////另一路pwm
//CCAP1L=0x80;//SettheinitialvaluesameasCCAPOH预置初值制冷
//CCAP1H=0x80;//50%的占空比
//CCAPM1=0x42;//p1.4输出
/////////////////
//CR=1;//启动PCA/PWM定时器
//}