基于stc单片机温度控制的程序Word文档格式.docx
《基于stc单片机温度控制的程序Word文档格式.docx》由会员分享,可在线阅读,更多相关《基于stc单片机温度控制的程序Word文档格式.docx(15页珍藏版)》请在冰点文库上搜索。
![基于stc单片机温度控制的程序Word文档格式.docx](https://file1.bingdoc.com/fileroot1/2023-4/29/dad5dd64-6acd-46d9-989a-9e1b320951e2/dad5dd64-6acd-46d9-989a-9e1b320951e21.gif)
//===============================================
voidDelay(uintx)//延时程序
{unsignedi;
x=x*5/4;
for(i=0;
i<
x;
i++);
}
ucharInitDS18B20()//初始化
{
ucharstatus;
DS=1;
Delay(8);
DS=0;
Delay(500);
DS=1;
Delay(100);
status=DS;
returnstatus;
//=================================================
voidWriteByte(uintdat)//单字节写入
uchari;
for(i=0;
8;
i++)
{
DS=0;
_nop_();
Delay(10);
DS=dat&
0x01;
Delay(40);
//delay45uS//5
DS=1;
dat>
>
=1;
}
//==================================================
ucharReadByte(void)//读取单字节
uchardat=0,i;
_nop_();
DS=0;
DS=1;
if(DS)dat|=0x80;
Delay(45);
returndat;
ucharreadtemperature()
if(InitDS18B20()==1)
ds18b20isok=0;
else
WriteByte(0xCC);
WriteByte(0x44);
InitDS18B20();
WriteByte(0xBE);
Temp_Value[0]=ReadByte();
Temp_Value[1]=ReadByte();
a=Temp_Value[0];
//读取到的第一个字节为温度LSB
b=Temp_Value[1];
ds18b20isok=1;
/*****************************************************
函数功能:
延时1ms
(3j+2)*i=(3×
33+2)×
10=1010(微秒),可以认为是1毫秒
***************************************************/
voiddelay1ms()
unsignedinti,j;
10;
for(j=0;
j<
33;
j++);
延时若干毫秒
入口参数:
n
voiddelaynms(unsignedintn)
unsignedinti;
n;
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;
TR1=1;
//启动定时器T1
TH0=0xF5;
TL0=0x78;
TR0=1;
//启动定时器T0
readtemperature();
//Delay(9000);
while
(1)
//unsignedchari;
//得到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;
//给定值大于测量值时
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)
Delay(3000);
ss1=0;
Delay(2000);
50&
=100)
Delay(1000);
Delay(100);
elseif(Error>
10&
=50)
Delay(500);
5&
=10)
{ss1=0;
elseif(GivenTemper<
measure)//给定值低ccap1制冷
{Error=measure-GivenTemper;
ss1=0;
ss2=1;
}
Delay(50);
{ss1=0;
Delay(10);
}}
/*measure=pp1;
//测量温度
//Error=GivenTemper-measure;
//给定值大于测量值时
if(GivenTemper>
Error=GivenTemper-measure;
//给定值小于测量值时
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转换结果寄存器
//PWM初始化
//voidInitPWM()
//CMOD=0x84;
//CPS1CPS0=00,FOSC/12是PCA/PWMCLOCK94
//CCON=0x00;
//CL=0x00;
//PCA计数器
//CH=0x00;
//CCAP0L=0x80;
//SettheinitialvaluesameasCCAPOH预置初值加热
//CCAP0H=0x80;
//50%的占空比
//CCAPM0=0x42;
//01000010SetupPCAmodule0in8bitpwm,P1.3输出
///////////////另一路pwm
//CCAP1L=0x80;
//SettheinitialvaluesameasCCAPOH预置初值制冷
//CCAP1H=0x80;
//CCAPM1=0x42;
//p1.4输出
/////////////////
//CR=1;
//启动PCA/PWM定时器